五子棋_AI权值算法(2)

小编已经隔了好久没有更新了,原因我就不多说啦,接下来我要立个每周更新的flag啦。
上一篇我们的成果是这样的

感觉还是蛮可爱的

然后如果我们要实现人机的话就需要算法啦,这里就使用比较简单的算法,其他的还有博弈树等比较高端,也许哪一天我的就会出现啦。
首先我们可以先把电脑当成人来思考,当人人对战下五子棋的时候,我们是怎么样布局来让自己赢,怎么样防守对方不让对方赢呢。
另外,据说五子棋都有先手优势,这里我就先不讨论。
无可厚非,五子棋,需要达到五个子的时候才可以赢,按照我们的常识我们发现,我们会努力凑够三个棋子四个棋子,当我们有四个棋子的时候那么,下一次下棋就存在一个必然的情况,三个棋子的时候,我们不仅需要考虑攻,还需要看看是否需要拦截对方。
我在百度上看到了一段特别有趣的口诀,仅跟大家分享一下

先手要攻,后手要守,以攻为守,以守待攻。攻守转换,慎思变化,先行争夺,地破天惊。守取外势,攻聚内力,八卦易守,成角易攻。阻断分隔,稳如泰山,不思争先,胜如登天。初盘争二,终局抢三,留三不冲,变化万千。多个先手,细算次先,五子要点,次序在前。斜线为阴,直线为阳,阴阳结合,防不胜防。连三连四,易见为明,跳三跳四,暗剑深藏。己落一子,敌增一兵,攻其要点,守其必争。势已形成,败即降临,五子精华,一子输赢。五子棋的最主要的问题是如何取得胜利

其实看到这个你就可以很清楚知道,先手后手主要做的事情
OK,接下来我们来讲一下利用权值算法来写这个五子棋吧。

  1. 初步设置权值表
  2. 模拟电脑的下棋步骤
  3. 根据下棋结果,判断权值设置的合理性并作出调整
  4. 实现一个聪明的人机对战小游戏,Happyending。

第一步:关于设置这个权值表,我们利用哈希表来制作(关于哈希表的一些东西可以看我的其他博客,或者百度)
哈希表设置权值如下

private HashMap<String, Integer> weightMap = new HashMap<String, Integer>();
 public void putMap() {//AI白子
  weightMap.put("11110", 11000);// 活四连
  weightMap.put("1111", 15000);
  weightMap.put("11112", 16000);// 死四连
  weightMap.put("1110", 5000);// 活三连
  weightMap.put("111", 550);
  weightMap.put("1112", 600);// 死三连
  weightMap.put("110", 500);// 活二连
  weightMap.put("11", 200);
  weightMap.put("112", 220);// 死二连
  weightMap.put("10", 100);// 活一连
  weightMap.put("12", 40);
  weightMap.put("1", 25);// 活一连
  weightMap.put("22220", 20000);// 死四连
  weightMap.put("2222", 17000);
  weightMap.put("22221", 18000);// 死四连
  weightMap.put("2220", 10000);// 活三连
  weightMap.put("2221", 650);// 死三连
  weightMap.put("222", 600);
  weightMap.put("220", 400);// 活二连
  weightMap.put("221", 270);// 死二连
  weightMap.put("22", 250);
  weightMap.put("20", 200);// 活一连
  weightMap.put("21", 120);
  weightMap.put("2", 40);
  //weightMap.put("1", 3);// 活一连
  weightMap.put("", 0);
  weightMap.put("0", 0);
 }

注意:我这是调整之后的权值表,刚开始并没有那么合适
按照严谨的做法,应该是要根据先手和后手的区别设置另一组权值,或者,在编代码的时候需要注意。
1.总是黑子先落,但是可能是人为可能是电脑,如果是电脑先落,那么电脑为攻的权值,那么可以采用上面的权值表。虽然我写的代码中是人黑子(具有先手优势),但是,我发现当棋子下散一点,由于权值的设置问题,或者方法本身问题,他是不会拦截我的,所以emmm,我计划用其他办法再完善一下。
2.随机谁先落,产生一个随机数就可以控制啦,我看到有一个同学的博客上就是这么处理的,也比较完善。链接可以甩给你萌:

第二步:模拟下棋。
我们可以这么思考,下棋的时候,电脑会便利所有的空位置,然后会找到最适合下棋的地方,怎么来评判这个最适合,刚刚我们设置的权值,相信大家基本能懂得相关含义。当找到一个空位置之后,我们会往八个方向去遍历棋盘,如果没有棋子,设置权值为0。我们最多遍历五个格子,然后利用哈希表的权值对应起来,将八个方向的一起加起来,用一个二维数组把棋盘每一个每一个格子的权值都存储起来。传到监听器里,然后比较权值大小,下在权值比较大的地方。
第三步:一些琐碎的细节
比如,每一次都要更新我们的权值表,比如下完一盘棋之后我们要实现悔棋,在人人对战我们也已经有过悔棋操作,我们只需要对应在AI下棋的时候同时存储XY的位置坐标即可。
第四步:调整权值,让AI更加聪明。
emmm,最后其实我不太想直接pou出我的代码,但是我的思路文字大家可以好好看看,代码方面,网上其实蛮多的。如果实在喜欢我的代码,那评论我私聊您。嘻嘻,就此结束。

猜你喜欢

转载自blog.csdn.net/chan_fan/article/details/83899262