五子棋简易AI算法

AI百科6个月前更新 快创云
50 0

一、基本思想:五子棋存在多种连接方式,这也就决定了每一个空位的权值有所不同,我们对五子棋的不同连接方式设置权值,然后遍历棋盘,算出每一个空位上的权值,选择权值最大的空位下棋,所以这个算法的关键就在于:1.设置并且存储不同连接方式及其对应的权值 2.计算棋盘空位上的权值。

二、设置不同连接方式的权值并进行存储

棋子的连接分为活连与死连,假设0代表空位,1代表黑棋,2代表白旗,如010为活连,01(遇到边界)为死连为不同连接方式设置对应权值:

假设0代表空位,1代表黑棋,2代表白旗

权值表(还可以细分) 连接方式 权值 010 50 0110 150 500 0 3000 020 50 0220 150 500 0 3000 01 30 011 90 0111 300 3000 02 30 022 90 0222 300 3000

设置好权值表后,就要考虑如何存储权值表,因为权值表中的数据是用来后续计算空位总权值所需的。这里我们考虑用哈希表进行存储“连接方式——权值”这样子的键值对

Key-Value : 键值对

HashMap:

将键值对一起存入 ,可以通过键来查询对应的值

将连子情况作为Key ,权值分作为Value

1 键不能重复,值可以重复

2: HashMap 存储优势是 查询时是O1的时间复杂度

3: HashMap 存储原理:

1: 用key来计算一个hash值 (当作唯一标识),hash值然后作为下标 ,然后将k-v存储在数组中对应下标位置

操作:

实例化: HashMap codeMap = new HashMap();方法: code.put(key,value);/ value = code.get(key);

三、遍历表格计算权值

如图一个五子棋盘:

尝试计算a、b两个空位处的权值大小,我们可以发现空位处的连接可以往上、下、左、右、左上、右上、左下、右下一共8个方向进行搜索,同时我们再规定一个空位的权值由八个方向的连接带来的权值简单相加得到(规则不唯一)。

对于a,往左的连接为01,权值30;往下的连接为01,权值30;往右下的连接010,权值50,故a处的权值为30+30+50=110

对于b,往左的连接为022,权值90;往上的连接为01,权值30;往左上的连接为011,权值90,故b处的权值为90+30+90=210

有了上面的举例,下面通过遍历计算每一个空位的权值

上面的代码中往8个方向计算权值,但是方法还未定义,下面以往右和往左上为例

往右:

往左上:

这里无论是往哪个方向,计算出来的权值都需要累加到codeArray对应位置,codeArray是已经定义的存储权值的二维数组

完整代码:

© 版权声明

相关文章