AI/普通 实现五子棋html
大二期末,js老师布置实训任务中其中一项:五子棋。
先了解一下五子棋算法慨念吧。
五子棋应该大多数都玩过,人机或两人作战,各执黑白棋子,上下左右,左上,左下,右上,右下等方向若凑齐5颗连成线均为赢。
在网上各大博客中,都有谈到AI来实现算法,用三维数组,这里可以参考百度搜一下来看看。
现在,关键是如何利用这个三维数组,其实很多机器博弈其实就是在打分,再把棋子下到分高(或分低)的地方,比如下红色位置,如果没有棋子,应该 给一个较高分,因为在下一个白棋子就赢了,但是如果下了一个黑棋子,那么,上面的第一种赢法无论如何也不可能了,所以直接设置为零分。所以在设置两个一位数组,记录每种赢法的得分,再查找棋盘上哪些位置可以实现这种赢法,给这些位置加分,最后从所有位置中,找出分最高的落子即可。而且,一种赢法上的落子越多,就越接近获胜,所以分数应该越高。
// 计算机下棋
var computerAI = function() {
var myScore = [];
var computerScore = [];
var max = 0;
var u = 0,v = 0;
for(var i = 0; i < 15; i++) {
myScore[i] = [];
computerScore[i] = [];
for(var j = 0; j < 15; j++) {
myScore[i][j] = 0;
computerScore[i][j] = 0;
}
}
for(var i = 0; i < 15; i++) {
for(var j = 0; j < 15; j++) {
if(chressBord[i][j] == 0) {
for(var k = 0; k < count; k++) {
if(wins[i][j][k]) {
if(myWin[k] == 1) {
myScore[i][j] += 200;
} else if(myWin[k] == 2) {
myScore[i][j] += 400;
} else if(myWin[k] == 3) {
myScore[i][j] += 2000;
} else if(myWin[k] == 4) {
myScore[i][j] += 10000;
}
if(computerWin[k] == 1) {
computerScore[i][j] += 220;
} else if(computerWin[k] == 2) {
computerScore[i][j] += 420;
} else if(computerWin[k] == 3) {
computerScore[i][j] += 2100;
} else if(computerWin[k] == 4) {
computerScore[i][j] += 20000;
}
}
}
if(myScore[i][j] > max) {
max = myScore[i][j];
u = i;
v = j;
} else if(myScore[i][j] == max) {
if(computerScore[i][j] > computerScore[u][v]) {
u = i;
v = j;
}
}
if(computerScore[i][j] > max) {
max = computerScore[i][j];
u = i;
v = j;
} else if(computerScore[i][j] == max) {
if(myScore[i][j] > myScore[u][v]) {
u = i;
v = j;
}
}
}
}
}
_compi = u;
_compj = v;
oneStep(u, v, false);
chressBord[u][v] = 2;//计算机占据位置
for(var k = 0; k < count; k++) {
if(wins[u][v][k]) {
computerWin[k]++;
_myWin[k] = myWin[k];
myWin[k] = 6; //这个位置对方不可能赢了
if(computerWin[k] == 5) {
resultTxt.innerHTML = '遗憾,计算机赢了,继续加油哦!';
over = true;
}
}
}
if(!over) {
me = !me;
}
backAble = true;
returnAble = false;
var hasClass = new RegExp('unable').test(' ' + returnbtn.className + ' ');
if(!hasClass) {
returnbtn.className+=' '+'unable';
}
}
首先棋盘设定是15*15
赢的方式有572中赢法
//赢法的统计数组
var myWin = [];
var computerWin = [];
//赢法数组
var wins = [];
for(var i = 0; i < 15; i++) {
wins[i] = [];
for(var j = 0; j < 15; j++) {
wins[i][j] = [];
}
}
var count = 0; //赢法总数
//横线赢法
for(var