課程
/前端開(kāi)發(fā)
/JavaScript
/JS實(shí)現(xiàn)人機(jī)大戰(zhàn)之五子棋(AI篇)
誰(shuí)有源代碼的分享下吧
2017-04-09
源自:JS實(shí)現(xiàn)人機(jī)大戰(zhàn)之五子棋(AI篇) 2-5
正在回答
var chessBoard=[];var me=true;
var over=false;//贏法數(shù)組var wins=[];
//贏法統(tǒng)計(jì)數(shù)組var 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]=[];?}}//統(tǒng)計(jì)所有橫線的贏法var count=0;for(var i=0;i<15;i++){?for(var j=0;j<11;j++){??//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??????for(var k=0;k<5;k++){???wins[i][j+k][count]=true;??}??count++;?}}//統(tǒng)計(jì)所有豎線的贏法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++;?}}//統(tǒng)計(jì)所有斜線的用法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++;?}}
//統(tǒng)計(jì)所有反斜線的用法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++;?}}
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/logo.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();//stroke是用來(lái)描邊的?}}
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();//fill是用來(lái)填充的}
chess.onclick=function(e){
?if(over){??return ;?}?if(!me){??return ;?}
?var x=e.offsetX;//設(shè)置坐標(biāo)?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);???chessBoard[i][j]=1;??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();??}?}?}
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(chessBoard[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(computerScore[i][j]>myScore[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("計(jì)算機(jī)贏了");?????over=true;????}???}??}
??if(!over){???me!=me;??}?}
寶慕林2917688 提問(wèn)者
怎么感覺(jué)跟視頻一抹一樣的
帥意
這是js文件的代碼,其他的沒(méi)多少,就沒(méi)發(fā)
舉報(bào)
"AlphaGO"我要和你下五子棋,教程帶你實(shí)現(xiàn)五子棋AI
2 回答求源碼啊求源碼啊
1 回答那里有源碼
2 回答所有源碼,可以正常運(yùn)行,應(yīng)該還有很多可以改進(jìn)的地方
1 回答在哪里編輯代碼?
2 回答代碼哪里有問(wèn)題?。?/p>
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-04-09
var chessBoard=[];
var me=true;
var over=false;
//贏法數(shù)組
var wins=[];
//贏法統(tǒng)計(jì)數(shù)組
var 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]=[];
?}
}
//統(tǒng)計(jì)所有橫線的贏法
var count=0;
for(var i=0;i<15;i++){
?for(var j=0;j<11;j++){
??//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
??
??
??for(var k=0;k<5;k++){
???wins[i][j+k][count]=true;
??}
??count++;
?}
}
//統(tǒng)計(jì)所有豎線的贏法
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++;
?}
}
//統(tǒng)計(jì)所有斜線的用法
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++;
?}
}
//統(tǒng)計(jì)所有反斜線的用法
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++;
?}
}
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/logo.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();//stroke是用來(lái)描邊的
?}
}
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();//fill是用來(lái)填充的
}
chess.onclick=function(e){
?if(over){
??return ;
?}
?if(!me){
??return ;
?}
?var x=e.offsetX;//設(shè)置坐標(biāo)
?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);
???chessBoard[i][j]=1;
??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();
??}
?}
?
}
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(chessBoard[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(computerScore[i][j]>myScore[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("計(jì)算機(jī)贏了");
?????over=true;
????}
???}
??}
??if(!over){
???me!=me;
??}
?}
2017-04-09
怎么感覺(jué)跟視頻一抹一樣的
2017-04-09
這是js文件的代碼,其他的沒(méi)多少,就沒(méi)發(fā)