通过一个简单的算法,来实现AI智能对弈的五子棋小游戏
AI难点解析
赢法数组
三维数组,前两维是棋盘,第三维是赢法数组;每一种赢法对应一个二维棋盘,上面或许只有5个点是true,这5个点一定连成一条线
赢法的统计数组
是个一维数组,主要统计每一种赢法的实现程度,如5个为true的点,此时黑棋落下两个点,此时该数组会有A3=2这样一个记录。
判断胜负
基于赢法的统计数组而定
计算机的落子规则
基于赢法的统计数组而定
代码实现
赢法数组
// 赢法数组,保存五子棋所有赢法
var wins = [];
for (var i = 0; i < 15; i++) {
wins[i] = [];
for (j = 0; j < 15; j++) {
wins[i][j] = [];
}
}
赢法种类的索引
横线赢法
k循环代表赢法种类,k=0为第0种赢法;
wins[i][j + k]在棋盘上连成一条线;
比如 i=0 j=0 count=0时:
wins[0][0][0]=true;
wins[0][1][0]=true;
wins[0][2][0]=true;
wins[0][3][0]=true;
wins[0][4][0]=true;
此时00 01 02 03 04五个为ture的点连成一条线,代表第一种赢法
即count=0时:wins[][][0]=true,为第1种赢法,则可能是
count=1时:wins[][][1]=true,为第2种赢法,则可能是
// 赢法种类的索引
var count = 0;
for (var i = 0; i < 15; i++) {
for (j = 0; j < 11; j++) {
for (k = 0; j < 5; k++) {
wins[i][j + k][count] = true;
}
count++;
}
}
竖线赢法
// 赢法种类的索引-竖线赢法
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[j + k][i][count] = true;
}
count++;
}
}
横线赢法
// 赢法种类的索引-横线赢法
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[i][j + k][count] = true;
}
count++;
}
}
斜线赢法
// 赢法种类的索引-斜线赢法
for (var i = 0; i < 11; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[i + k][j + k][count] = true;
}
count++;
}
}
反斜线赢法
// 赢法种类的索引-反斜线赢法
for (var i = 0; i < 11; i++) {
for (var j = 14; j > 3; j--) {
for (var k = 0; k < 5; k++) {
wins[i + k][j - k][count] = true;
}
count++;
}
}
打印count赢法统计,显示得共有572种赢法
赢法的统计数组
// 赢法的统计数组
var myWin = [];
var computerWin = [];
//onclick落子的时候加入
if (over) {
return;
}
for (var k = 0; k < count; k++) {
if (wins[i][j][k]) {
// 黑棋落子
myWin[k]++;