把开始的数据的DOM清除一下
me先等于false,然后先调用一次computerAI函数
同问,这算AI的一种吗?
计算有问题,就会,
if (chessArr[i][j] == 0) {
drawChess(i, j, me);
if (me) {
chessArr[i][j] = 1;
} else {
chessArr[i][j] = 2;
}
me = !me;
for (var k = 0; k < count; k++) {
if (wins[i][j][k]) {
if(chessArr[i][j] == 1 ){ //这个表示我方赢了
myWin[k]++;
computerWin[k] = 6;
if (myWin[k] == 5) {
window.alert("you win !!!");
over = true;
}
}else{
myWin[k] = 6;
computerWin[k] ++ ;
if (computerWin[k] == 5) {
window.alert("计算机赢了");
over = true;
}
}
}
}
}
我知道啦,
if (myWin[k] == 5) {
setTimeout(function(){
window.alert("你赢了");
},0);
over = true;
}
这样就可以了
自己写一个上下遍历的over判断是否结束游戏的方法
可以的
1 在 ia 计算得分前 判断 棋盘上是否 有子
如果有
那么就走正常流程
如果没有
就随机挑选一个坐标 就可以了
..我知道了
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 ++; } }
这些循环我都把k < 4 了
那个位置的赢法数组里包含了这两个赢法。计算的时候都进行了加分处理,这个位置的分数最高,肯定被找出来了
有意义
canvas的原点是在左上角开始,那么i=0的时候,j从0到14,那么就是最上面的一条横线了,[0][0] ,[0][1].... ,[0][14]
完整代码地址:
https://gitee.com/yanglilong127/ai_manmachine_war_chess
该游戏演示地址:
https://yanglilong127.gitee.io/ai_manmachine_war_chess
下一层是k<5,j+k就是边界
最好放点代码或者console的报错出来 这么干说也没法看呀,
话说你可以换个浏览器试试,我之前用chrome 棋子渲染一直不对,换IE就好了
这代码两不多照着写。没问题的。
/**
*
*/
var me = true;
var chessBorad = [];
var over = false;
//赢法数组
var wins = [];
//赢法统计数组
var myWin = [];
var computerWin = [];
for(var i = 0;i < 15;i++){
chessBorad[i] =[];
for(var j = 0;j < 15;j++){
chessBorad[i][j] =0;
}
}
//赢法数组初始化
for(var i = 0;i < 15;i++){
wins[i] =[];
for(var j = 0;j < 15;j++){
wins[i][j] =[];
}
}
var count = 0;
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 < 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 < 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++;
}
}
for(var i = 0;i<count ;i++){
myWin[i] = 0;
computerWin[i] = 0;
}
var chess = document.getElementById('chess');
var context = chess.getContext('2d');
context.strokeStyle = "#BFBFBF";
var logo = new Image();
logo.src="images/8.jpg";
logo.onload = function(){
context.drawImage(logo,0,0,450,450);
drawChessBoard();
}
var drawChessBoard=function(){
for(var i=0;i<15;i++){
context.moveTo(15+i*30,15);
context.lineTo(15+i*30,435);
context.stroke();
context.moveTo(15,15+i*30);
context.lineTo(435,15+i*30);
context.stroke();
}
}
var onStep = function(i,j,me){
context.beginPath();
context.arc(15 + i * 30,15 + j * 30, 13, 0, 2 * Math.PI);
context.closePath();
var gradient = context.createRadialGradient(15+i*30+2,15+i*30-2,13,15+i*30+2,15+i*30-2,0);
if(me){
gradient.addColorStop(0,"#0A0A0A");
gradient.addColorStop(1,"#636766");
}else{
gradient.addColorStop(0,"#D1D1D1");
gradient.addColorStop(1,"#F9F9F9");
}
context.fillStyle = gradient;
context.fill();
}
chess.onclick = function(e){
if(over){
return;
}
if(!me){
return;
}
var x = e.offsetX;
var y = e.offsetY;
var i = Math.floor(x / 30);
var j = Math.floor(y / 30);
if(chessBorad[i][j] == 0){
onStep(i,j,me);
chessBorad[i][j]=1;
for(var k=0;k<count;k++){
if(wins[i][j][k]){
myWin[k]++;
computerWin[k]=6;
if(myWin[k]==5){
alert("你赢了");
over = true;
}
}
}
if(!over){
me = !me;
computer();
}
}
}
var computer = function(){
var myScore = [];
var computerScore = [];
var u =0;
var v = 0;
var max = 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(chessBorad[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;
}
}
}
}
}
onStep(u,v,false);
chessBorad[u][v]=2;
for(var k=0;k<count;k++){
if(wins[u][v][k]){
computerWin[k]++;
myWin[k]=6;
if(computerWin[k]==5){
alert("你输了");
over = true;
}
}
}
if(!over){
me = !me;
}
};
for(var i=0;i<15;i++){
myScore[i]=0;
computerScore[i]=0;
for(var j=0;j<15;j++){
myScore[i][j]=0;
computerScore[i][j]=0;
}
}
这块儿:
myScore[i]=0;
computerScore[i]=0;
应该是:
myScore[i]=[];
computerScore[i]=[];
初始化一个二维数组。
let chessBoard = []; let me = true; let over = false; let wins = []; let myWin = []; var computerWin = [] for (var i = 0; i < 15; i++) { chessBoard[i] = [] for (var j = 0; j < 15; j++) { chessBoard[i][j] = 0 } } for (var i = 0; i < 15; i++) { wins[i] = [] for (var j = 0; j < 15; j++) { wins[i][j] = [] } } var count = 0 for (var i = 0; i < 15; i++) { for (var j = 0; j < 11; j++) { for (k = 0; k < 5; k++) { wins[i][j + k][count] = true } count++ } } for (var i = 0; i < 15; i++) { for (var j = 0; j < 11; j++) { for (k = 0; k < 5; k++) { wins[j + k][i][count] = true } count++ } } for (var i = 0; i < 11; i++) { for (var j = 0; j < 11; j++) { for (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 (k = 0; k < 5; k++) { wins[i + k][j - k][count] = true } count++ } } console.log(count) for (var i = 0; i < count; i++) { myWin[i] = 0 computerWin[i] = 0 } var chess = document.getElementById('chess') var context = chess.getContext('2d') context.strokeStyle = '#BFBFBF' var logo = new Image() logo.src = " " //image path window.onload = function () { // context.drawImage(null, 0, 0, 450, 450) drawChessBoard() // oneStep(0, 0, true) // oneStep(1, 1, false) // context.beginPath() // context.arc(200,200,100,0,2*Math.PI) // context.closePath() // var gradient = context.createRadialGradient(200,200,50,200,200,20) // gradient.addColorStop(0,'#0A0A0A') // gradient.addColorStop(1,'#636766') // context.fillStyle = gradient // context.fill() } var drawChessBoard = function () { for (var i = 0; i < 15; i++) { context.moveTo(15 + i * 30, 15) //15 context.lineTo(15 + i * 30, 435) //435 context.stroke() context.moveTo(15, 15 + i * 30) //15 context.lineTo(435, 15 + i * 30) //435 context.stroke() } } // // context.moveTo(0,0) // context.lineTo(450,450) // context.stroke() var oneStep = function (i, j, me) { context.beginPath() context.arc(15 + i * 30, 15 + j * 30, 13, 0, 2 * Math.PI) context.closePath() var gradient = context.createRadialGradient(15 + i * 30 + 2, 15 + j * 30 - 2, 13, 15 + i * 30, 15 + j * 30, 0) if (me) { gradient.addColorStop(0, '#0A0A0A') gradient.addColorStop(1, '#636766') } else { gradient.addColorStop(0, '#D1D1D1') gradient.addColorStop(1, '#F9F9F9') } context.fillStyle = gradient context.fill() } chess.onclick = function (e) { if (over) { return } if (!me) { return } var x = e.offsetX var y = e.offsetY var i = Math.floor(x / 30) var j = Math.floor(y / 30) if (chessBoard[i][j] === 0) { oneStep(i, j, me) // if (me) { chessBoard[i][j] = 1 // } else { // chessBoard[i][j] = 2 // } for (var k = 0; k < count; k++) { if (wins[i][j][k]) { myWin[k]++ computerWin[k] = 6 if (myWin[k] === 5) { window.alert('你赢了') over = true } } } if (!over) { me = !me computerAI() } } // oneStep(i,j,me) } var computerAI = function () { var myScore = [] var computerScore = [] var max = 0 var u = 0 var 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 (chessBoard[i][j] === 0) { for (var k = 0; k < count; k++) { if (wins[i][j][k]) { if (wins[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 (computerScore[i][j] > computerScore[u][v]) { u = i v = j } } } } } oneStep(u, v, false) chessBoard[u][v] = 2 for (var k = 0; k < count; k++) { if (wins[u][v][k]) { computerWin[k]++ myWin[k] = 6 if (computerWin[k] === 5) { window.alert('AI赢了') over = true } } } if (!over) { me = !me // computerAI() } }
把不同难度的计算权重分值更改一下,比如简单电脑,专注进攻,不防守,防守分值调低。
斜着不能赢,我也是的
简单,你在alert之前在执行一次画棋子的操作,就是这个drawChessBoard();放在弹出消息前,就Ok了。
这个不是在加入Ai前的那节课就实现了么。
同问,看不懂老师所说的。
---