五子棋ai实现

说到ai这个热词,很多人都会变得兴奋,那么我们就来聊聊五子棋ai的那些事

1.通过哈希表实现ai
这种ai实现方法可以说是相当笨拙的了,主要是利用哈希表能够接受字符串返回整形对象的特点,实现对不同棋形进行赋权,最后加权得到最优解的方法

HashMap<String,Integer> hm=new  HashMap<String,Integer>();
 	   hm.put("0001",50);
 	   hm.put("-1000", 30);
  	   hm.put("1000",20);
  	   hm.put("1-10", 20);
  	   hm.put("-1-1-10", 150);
  	   hm.put("1000", 100);
  	   hm.put("-1-100", 150);
  	   hm.put("0110",100);
  	   hm.put("1100", 100);
  	   hm.put("1110", 1000);
  	  hm.put("0111", 1000);
  	   hm.put("-1-1-1-1", 15000);
  	   hm.put("1111", 20000);//有兴趣的同学自己优化一下,这是我自己乱敲的
  	    int a[][]= {{-1,0,1},{-1,0,1}};//通过这个数组实现对八个方向的检索,一个很实用的操作
  	   for(int i=0;i<Config.ROW ;i++)
  			{
  				for(int j=0;j<Config.CON;j++)
  				{
  					if(chessplace[i][j]==0)
  					{
                           for(int k=0;k<3;k++)
                           {
                          	 for(int l=0;l<3;l++)
                          	 {
                          		 String va="";
                          		 for(int m=0;m<4;m++)
                          		if(i+m*a[0][k]<15&&i+m*a[0][k]>=0&&j+m*a[1][l]<15&&j+m*a[1][l]>=0)
                          		 va+=chessplace[i+m*a[0][k]][j+m*a[1][l]];
             
                          		 Integer ff=hm.get(va);
                     
                          		 if(ff!=null)
                          		 chessvalue[i][j]+=ff;//小心空对象报错哦!
                          	 }
                           }
  					}
  				}
  			}

这个算法除了特别容易实现以外没有什么优点,尤其是它没有办法分辨1101这样两黑一空一黑的局面,而且没有多少延展性,不能对后续局面进行判断。
2,落子后对全局局势进行判断,选择最佳落子地点
这种算法也是五子棋中常用的算法,方法很简单,五子棋中有所谓活四,死四,双活三的说法,只要给以上每种行为赋值,并且相加就可以得出全局局势的总值,最后从中选择最佳点
这种算法也有很大的缺点,那就是它的速度相当慢,甚至有时会出现肉眼可见的停顿,而且缺乏远见,只能对当前局势做出最优解,首先我们还是再看一下代码。
`public double getvalue1(int a, int b) {
double value2 = 0;
chessplace[a][b] = -1;//落下黑子
for (int i = 0; i < Config.ROW; i++) {
for (int j = 0; j < Config.ROW; j++) {

			int c[][] = { { -1, 0, 1 }, { -1, 0, 1 } };

			for (int k = 0; k < 3; k++) {
				for (int l = 0; l < 3; l++) {
					String va = "";
					for (int m = 0; m <=4; m++)
						if (a + m * c[0][k] < 15 && a + m * c[0][k] >= 0 && b + m * c[1][l] < 15
								&& b + m * c[1][l] >= 0)
							va += chessplace[a + m * c[0][k]][b + m * c[1][l]];
					switch (va) {
					case"00000":
						value2+=0;
						break;
					case"-11000":
						value2+=1;
						break;
					case "0-1-1-10":
						value2 += 5000;
						break;
					case "0-1-1-11":
						value2 += 2;
						break;
					case "0111-1":
						value2 += 6000;
						break;	
					case "-11110":
						value2 += 6000;
						break;	
					case "0-1-1-1-1":
						value2 += 100000;
						break;
					case "1111-1":
						value2 += 800000;
						break;
					case "-11111":
						value2 += 800000;
						break;
					case "-1-1-1-11":
						value2 += 100000;
						break;
					case "0-1-100":
						value2 += 5;
						break;

					case "-1-1-1-1-1":
						value2 += 100000000;
						break;
						default:value2 +=0;
					}
				}
			}
		}}
	chessplace[a][b] = 0;//注意这列不要忘记把棋子收回,否则你就会看到被完全下满的棋盘
	return value2;

}`

附上我和这个ai下的一局棋,赢的还是有点难,如果在添加上一种情况的话估计我就没法赢了
关于再进一步的话,其实我们可以采取博弈树的模式,让我们的ai变得更加厉害——选择权值前三的点,然后让ai对这个局势进若干次博弈,最终得到胜利的方向,这就是我们所谓的走一步看三步了,具体相关的代码等我有时间再来完善好了(咕咕咕

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值