課程
/前端開發(fā)
/JavaScript
/JS實(shí)現(xiàn)人機(jī)大戰(zhàn)之五子棋(AI篇)
我第三顆落子的時(shí)候發(fā)現(xiàn)電腦就亂下了,到底哪里出問題了?。≌l能幫幫我解答一下,前兩個(gè)都是正常堵截的
2016-04-11
源自:JS實(shí)現(xiàn)人機(jī)大戰(zhàn)之五子棋(AI篇) 2-5
正在回答
你都不貼代碼出來,誰知道什么問題。 正常代碼如下:
var over = false;var me = true; //我var chressBord = [];//棋盤for(var i = 0; i < 15; i++){?? ?chressBord[i] = [];?? ?for(var j = 0; j < 15; j++){?? ??? ?chressBord[i][j] = 0;?? ?}}//贏法的統(tǒng)計(jì)數(shù)組var myWin = [];var computerWin = [];//贏法數(shù)組var wins = [];for(var i = 0; i < 15; i++){?? ?wins[i] = [];?? ?for(var j = 0; j < 15; j++){?? ??? ?wins[i][j] = [];?? ?}}var count = 0; //贏法總數(shù)//橫線贏法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 = 'img/logo.png';logo.onload? = function(){?? ?context.drawImage(logo,0,0,450,450);?? ?drawChessBoard();}document.getElementById("restart").onclick = function(){?? ?window.location.reload();}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(chressBord[i][j] == 0){?? ??? ?oneStep(i,j,me);?? ??? ?chressBord[i][j] = 1;//我?? ??? ??? ??? ??? ??? ??? ??? ??? ?for(var k = 0; k < count; k++){?? ??? ??? ?if(wins[i][j][k]){?? ??? ??? ??? ?myWin[k]++;?? ??? ??? ??? ?computerWin[k] = 6;//這個(gè)位置對方不可能贏了?? ??? ??? ??? ?if(myWin[k] == 5){?? ??? ??? ??? ??? ?window.alert('你贏了');?? ??? ??? ??? ??? ?over = true;?? ??? ??? ??? ?}?? ??? ??? ?}?? ??? ?}?? ??? ?if(!over){?? ??? ??? ?me = !me;?? ??? ??? ?computerAI();?? ??? ?}?? ?}?? ?}//計(jì)算機(jī)下棋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;?? ??? ??? ??? ??? ??? ?}?? ??? ??? ??? ?}?? ??? ??? ??? ??? ??? ??? ?}?? ??? ?}?? ?}?? ?oneStep(u,v,false);?? ?chressBord[u][v] = 2;?? ?for(var k = 0; k < count; k++){?? ??? ?if(wins[u][v][k]){?? ??? ??? ?computerWin[k]++;?? ??? ??? ?myWin[k] = 6;//這個(gè)位置對方不可能贏了?? ??? ??? ?if(computerWin[k] == 5){?? ??? ??? ??? ?window.alert('計(jì)算機(jī)贏了');?? ??? ??? ??? ?over = true;?? ??? ??? ?}?? ??? ?}?? ?}?? ?if(!over){?? ??? ?me = !me;?? ?}}//繪畫棋盤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 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 + 2, 15 + j * 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();}?
喝兩口我請客 提問者
naminlu 回復(fù) 江勵(lì)志
你得寫樣式啊..............
舉報(bào)
"AlphaGO"我要和你下五子棋,教程帶你實(shí)現(xiàn)五子棋AI
3 回答五子棋豎線問題
2 回答算法 五子棋ai算法
5 回答五子棋執(zhí)黑必勝算法
1 回答JS實(shí)現(xiàn)人機(jī)大戰(zhàn)五指棋AI的算法有漏洞
3 回答為什么下第五個(gè)黑棋子時(shí)
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2016-04-11
你都不貼代碼出來,誰知道什么問題。 正常代碼如下:
var over = false;
var me = true; //我
var chressBord = [];//棋盤
for(var i = 0; i < 15; i++){
?? ?chressBord[i] = [];
?? ?for(var j = 0; j < 15; j++){
?? ??? ?chressBord[i][j] = 0;
?? ?}
}
//贏法的統(tǒng)計(jì)數(shù)組
var myWin = [];
var computerWin = [];
//贏法數(shù)組
var wins = [];
for(var i = 0; i < 15; i++){
?? ?wins[i] = [];
?? ?for(var j = 0; j < 15; j++){
?? ??? ?wins[i][j] = [];
?? ?}
}
var count = 0; //贏法總數(shù)
//橫線贏法
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 = 'img/logo.png';
logo.onload? = function(){
?? ?context.drawImage(logo,0,0,450,450);
?? ?drawChessBoard();
}
document.getElementById("restart").onclick = function(){
?? ?window.location.reload();
}
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(chressBord[i][j] == 0){
?? ??? ?oneStep(i,j,me);
?? ??? ?chressBord[i][j] = 1;//我?? ??? ?
?? ??? ??? ??? ??? ?
?? ??? ?for(var k = 0; k < count; k++){
?? ??? ??? ?if(wins[i][j][k]){
?? ??? ??? ??? ?myWin[k]++;
?? ??? ??? ??? ?computerWin[k] = 6;//這個(gè)位置對方不可能贏了
?? ??? ??? ??? ?if(myWin[k] == 5){
?? ??? ??? ??? ??? ?window.alert('你贏了');
?? ??? ??? ??? ??? ?over = true;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if(!over){
?? ??? ??? ?me = !me;
?? ??? ??? ?computerAI();
?? ??? ?}
?? ?}
?? ?
}
//計(jì)算機(jī)下棋
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;?? ?
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?oneStep(u,v,false);
?? ?chressBord[u][v] = 2;
?? ?for(var k = 0; k < count; k++){
?? ??? ?if(wins[u][v][k]){
?? ??? ??? ?computerWin[k]++;
?? ??? ??? ?myWin[k] = 6;//這個(gè)位置對方不可能贏了
?? ??? ??? ?if(computerWin[k] == 5){
?? ??? ??? ??? ?window.alert('計(jì)算機(jī)贏了');
?? ??? ??? ??? ?over = true;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if(!over){
?? ??? ?me = !me;
?? ?}
}
//繪畫棋盤
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 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 + 2, 15 + j * 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();
}
?
2016-04-13
你得寫樣式啊..............