課程
/前端開發(fā)
/JavaScript
/JS實現(xiàn)人機大戰(zhàn)之五子棋(AI篇)
就是這樣,整個界面都沒有了
2016-10-21
源自:JS實現(xiàn)人機大戰(zhàn)之五子棋(AI篇) 3-1
正在回答
因為三維數(shù)組初始化的時候沒有初始化二維,在第一個for下加一句wins[i] = [];
//做了一點點修改
var over=false; ? ? ? ? ? ?//游戲結(jié)束標志
var role=true; ? ? ? ? ? ? // true--黑棋 ,false--白棋,默認玩家先手
var boardInfo=[]; ? ? ? ? ?//記錄落子信息
for(var i=0;i<15;i++){
boardInfo[i]=[];
for(var j=0;j<15;j++){
boardInfo[i][j]=0;
}
/*
贏法數(shù)組及其初始化
*/
var wins=[];
var counts=0; ? ? ? ? ?//記錄贏法的總數(shù) ? ? ??
wins[i]=[];
wins[i][j]=[];
//垂直連成五子
for(var j=0;j<=10;j++){
for(var k=0;k<5;k++){
wins[i][j+k][counts]=true;
counts++;
//水平連成五子
for(var i=0;i<=10;i++){
wins[i+k][j][counts]=true;
//斜成五子
wins[i+k][j+k][counts]=true;
//反斜成五子
for(var j=4;j<15;j++){
wins[i+k][j-k][counts]=true;
//統(tǒng)計
var myWin=[];
var computerWin=[];
for(var i=0;i<counts;i++){
myWin[i]=0;
computerWin[i]=0;
var board=document.getElementById("board");
var context=board.getContext("2d");
//背景圖
var logo=new Image(); ? ? ? ? ? ??
logo.src="images/logo.png";?
//圖片加載完后再畫棋盤
logo.onload=function(){
context.drawImage(logo,0,0,450,450);
drawBoard();
//畫棋盤
var drawBoard=function(){
context.strokeStyle="#bfbfbf";
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);
//畫棋子
var oneStep=function(i,j,role){
context.beginPath();
context.arc(15+30*i,15+30*j,13,0,Math.PI*2);
context.closePath();
var gradient=context.createRadialGradient(15+30*i+2,15+30*j-2,13,15+30*i+2,15+30*j-2,0);
if(role){
gradient.addColorStop(0,"#0a0a0a");
gradient.addColorStop(1,"#636766");
else{
gradient.addColorStop(0,"#d1d1d1");
gradient.addColorStop(1,"#f9f9f9");
context.fillStyle=gradient;
context.fill();
//輪流落子
board.onclick=function(e){
if(over){
return;
if(!role){
var x=e.offsetX;
var y=e.offsetY;
var i=Math.floor(x/30);
var j=Math.floor(y/30);
if(boardInfo[i][j]==0){
oneStep(i,j,role);
boardInfo[i][j]=1; ? ? ? ?//1代表玩家
} ? ? ? ? ? ? ?
for(var k=0;k<counts;k++){
if(wins[i][j][k]){
myWin[k]++;
computerWin[k]=6;
if(myWin[k]==5){
document.getElementById("result").innerHTML="你贏了";
over=true;
if(!over){
role=!role;
computerAI();
var computerAI=function(){
var offensiveScore=[]; ? ? ? ? ? ? ? ?//進攻得分
var deffensiveScore=[]; ? ? ? ? ? ? ? //防守得分
var u=0,v=0;
var max=0;
offensiveScore[i]=[];
deffensiveScore[i]=[];
offensiveScore[i][j]=0;
? ?deffensiveScore[i][j]=0;
//遍歷棋盤
if(myWin[k]==1){
deffensiveScore[i][j]+=1;
if(myWin[k]==2){
deffensiveScore[i][j]+=10;
if(myWin[k]==3){
deffensiveScore[i][j]+=100;
if(myWin[k]==4){
deffensiveScore[i][j]+=1000;
if(computerWin[k]==1){
offensiveScore[i][j]+=2;
if(computerWin[k]==2){
offensiveScore[i][j]+=20;
if(computerWin[k]==3){
offensiveScore[i][j]+=200;
if(computerWin[k]==4){
offensiveScore[i][j]+=2000;
//比較各個點的價值
if(deffensiveScore[i][j]>max){
max=deffensiveScore[i][j];
u=i;
v=j;
else if(deffensiveScore[i][j]==max){
if(offensiveScore[i][j]>offensiveScore[u][v]){
if(offensiveScore[i][j]>max){
max=offensiveScore[i][j];
else if(offensiveScore[i][j]==max){
if(deffensiveScore[i][j]>deffensiveScore[u][v]){
oneStep(u,v,false);
boardInfo[u][v]=2; ? ? ? ?//2代表計算機
if(wins[u][v][k]){
computerWin[k]++;
myWin[k]=6;
if(computerWin[k]==5){
document.getElementById("result").innerHTML="你輸了";
? ? if(!over){
應該是算法吧界面的代碼覆蓋了,誰能發(fā)個正確的代碼看看?
舉報
"AlphaGO"我要和你下五子棋,教程帶你實現(xiàn)五子棋AI
3 回答計算機用了這個算法會不會輸呢?
2 回答算法 五子棋ai算法
1 回答請問我的代碼哪里錯了,為什么我下了一步棋后,計算機沒有下棋?
2 回答wins[i][j][k]這個不是在贏法算法里面已經(jīng)全部為true了
1 回答計算機只走了一步棋就不走了
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學習伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2017-04-16
因為三維數(shù)組初始化的時候沒有初始化二維,在第一個for下加一句wins[i] = [];
2016-10-22
//做了一點點修改
var over=false; ? ? ? ? ? ?//游戲結(jié)束標志
var role=true; ? ? ? ? ? ? // true--黑棋 ,false--白棋,默認玩家先手
var boardInfo=[]; ? ? ? ? ?//記錄落子信息
for(var i=0;i<15;i++){
boardInfo[i]=[];
for(var j=0;j<15;j++){
boardInfo[i][j]=0;
}
}
/*
贏法數(shù)組及其初始化
*/
var wins=[];
var counts=0; ? ? ? ? ?//記錄贏法的總數(shù) ? ? ??
for(var i=0;i<15;i++){
wins[i]=[];
for(var j=0;j<15;j++){
wins[i][j]=[];
}
}
//垂直連成五子
for(var i=0;i<15;i++){
for(var j=0;j<=10;j++){
for(var k=0;k<5;k++){
wins[i][j+k][counts]=true;
}
counts++;
}
}
//水平連成五子
for(var i=0;i<=10;i++){
for(var j=0;j<15;j++){
for(var k=0;k<5;k++){
wins[i+k][j][counts]=true;
}
counts++;
}
}
//斜成五子
for(var i=0;i<=10;i++){
for(var j=0;j<=10;j++){
for(var k=0;k<5;k++){
wins[i+k][j+k][counts]=true;
}
counts++;
}
}
//反斜成五子
for(var i=0;i<=10;i++){
for(var j=4;j<15;j++){
for(var k=0;k<5;k++){
wins[i+k][j-k][counts]=true;
}
counts++;
}
}
//統(tǒng)計
var myWin=[];
var computerWin=[];
for(var i=0;i<counts;i++){
myWin[i]=0;
computerWin[i]=0;
}
var board=document.getElementById("board");
var context=board.getContext("2d");
//背景圖
/*
var logo=new Image(); ? ? ? ? ? ??
logo.src="images/logo.png";?
//圖片加載完后再畫棋盤
logo.onload=function(){
context.drawImage(logo,0,0,450,450);
drawBoard();
}
*/
//畫棋盤
var drawBoard=function(){
context.strokeStyle="#bfbfbf";
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,role){
context.beginPath();
context.arc(15+30*i,15+30*j,13,0,Math.PI*2);
context.closePath();
var gradient=context.createRadialGradient(15+30*i+2,15+30*j-2,13,15+30*i+2,15+30*j-2,0);
if(role){
gradient.addColorStop(0,"#0a0a0a");
gradient.addColorStop(1,"#636766");
}
else{
gradient.addColorStop(0,"#d1d1d1");
gradient.addColorStop(1,"#f9f9f9");
}
context.fillStyle=gradient;
context.fill();
}
//輪流落子
board.onclick=function(e){
if(over){
return;
}
if(!role){
return;
}
var x=e.offsetX;
var y=e.offsetY;
var i=Math.floor(x/30);
var j=Math.floor(y/30);
if(boardInfo[i][j]==0){
oneStep(i,j,role);
boardInfo[i][j]=1; ? ? ? ?//1代表玩家
} ? ? ? ? ? ? ?
for(var k=0;k<counts;k++){
if(wins[i][j][k]){
myWin[k]++;
computerWin[k]=6;
}
if(myWin[k]==5){
document.getElementById("result").innerHTML="你贏了";
over=true;
}
}
if(!over){
role=!role;
computerAI();
}
}
var computerAI=function(){
var offensiveScore=[]; ? ? ? ? ? ? ? ?//進攻得分
var deffensiveScore=[]; ? ? ? ? ? ? ? //防守得分
var u=0,v=0;
var max=0;
for(var i=0;i<15;i++){
offensiveScore[i]=[];
deffensiveScore[i]=[];
for(var j=0;j<15;j++){
offensiveScore[i][j]=0;
? ?deffensiveScore[i][j]=0;
}
}
//遍歷棋盤
for(var i=0;i<15;i++){
for(var j=0;j<15;j++){
if(boardInfo[i][j]==0){
for(var k=0;k<counts;k++){
if(wins[i][j][k]){
if(myWin[k]==1){
deffensiveScore[i][j]+=1;
}
if(myWin[k]==2){
deffensiveScore[i][j]+=10;
}
if(myWin[k]==3){
deffensiveScore[i][j]+=100;
}
if(myWin[k]==4){
deffensiveScore[i][j]+=1000;
}
}
if(wins[i][j][k]){
if(computerWin[k]==1){
offensiveScore[i][j]+=2;
}
if(computerWin[k]==2){
offensiveScore[i][j]+=20;
}
if(computerWin[k]==3){
offensiveScore[i][j]+=200;
}
if(computerWin[k]==4){
offensiveScore[i][j]+=2000;
}
}
}
//比較各個點的價值
if(deffensiveScore[i][j]>max){
max=deffensiveScore[i][j];
u=i;
v=j;
}
else if(deffensiveScore[i][j]==max){
if(offensiveScore[i][j]>offensiveScore[u][v]){
max=deffensiveScore[i][j];
u=i;
v=j;
}
}
if(offensiveScore[i][j]>max){
max=offensiveScore[i][j];
u=i;
v=j;
}
else if(offensiveScore[i][j]==max){
if(deffensiveScore[i][j]>deffensiveScore[u][v]){
max=offensiveScore[i][j];
u=i;
v=j;
}
}
}
}
}
oneStep(u,v,false);
boardInfo[u][v]=2; ? ? ? ?//2代表計算機
for(var k=0;k<counts;k++){
if(wins[u][v][k]){
computerWin[k]++;
myWin[k]=6;
}
if(computerWin[k]==5){
document.getElementById("result").innerHTML="你輸了";
over=true;
}
}
? ? if(!over){
role=!role;
}
}
drawBoard();
2016-10-21
應該是算法吧界面的代碼覆蓋了,誰能發(fā)個正確的代碼看看?