課程
/前端開發(fā)
/JavaScript
/JS實現(xiàn)人機大戰(zhàn)之五子棋(AI篇)
有大神將這個人機五子棋改成雙人對戰(zhàn),沒有AI的,自己弄蒙了,謝謝
2017-11-09
源自:JS實現(xiàn)人機大戰(zhàn)之五子棋(AI篇) 3-1
正在回答
就把computerAI這個函數(shù)去掉,在chess.onclick里面分別對黑棋和白旗進行贏法統(tǒng)計。
chess.onclick=function(e){
????if(gameOver){
????????return;
????}
????var?x=e.offsetX;
????var?y=e.offsetY;
????var?i=Math.floor(x/30);
????var?j=Math.floor(y/30);
????if(empty[i][j]==0){
????????//保證黑白棋子交替
????????oneStep(i,j,flag);
????????empty[i][j]=1;
????????if(flag){
????????????empty[i][j]=1;
????????????for(var?k=0;k<count;k++){
????????????????if(wins[i][j][k]){
????????????????????myWin[k]++;
????????????????????computerWin[k]=6;
????????????????????if(myWin[k]==5){
????????????????????????setTimeout(()=>{
????????????????????????????alert("黑棋贏了!");
????????????????????????},700);
????????????????????????gameOver=true;
????????????????????}
????????????????}
????????????}
????????????if(!gameOver){
????????????????flag=!flag;
????????}else{
????????????empty[i][j]=2;
????????????????????computerWin[k]++;
????????????????????myWin[k]=6;
????????????????????if(computerWin[k]==5){
????????????????????????????alert("白棋贏了!");
????????}
}
如果會nodejs? 可以用websocket 實現(xiàn)
這個不是在加入Ai前的那節(jié)課就實現(xiàn)了么。
有沒有大神能夠幫忙指個思路,能詳細點最好了
非常感謝
var chess = document.getElementById("chess");
var context = chess.getContext('2d');
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)計數(shù)組
var myWin = [];
var yourWin = [];
//贏法數(shù)組
var wins = [];
? ? wins[i] = [];
? ? ? ? wins[i][j] = [];
var count = 0; //贏法總數(shù)
//橫線贏法
? ? for(var j = 0; j < 11; j++){
? ? ? ? for(var k = 0; k < 5; k++){
? ? ? ? ? ? wins[i][j+k][count] = true;
? ? ? ? }
? ? ? ? count++;
//豎線贏法
? ? ? ? ? ? wins[j+k][i][count] = true;
//正斜線贏法
for(var i = 0; i < 11; i++){
? ? ? ? ? ? wins[i+k][j+k][count] = true;
//反斜線贏法
for(var i = 0; i < 11; i++){?
? ? for(var j = 14; j > 3; j--){
? ? ? ? ? ? wins[i+k][j-k][count] = true;
for(var i = 0; i < count; i++){
? ? myWin[i] = 0;
? ? yourWin[i] = 0;
var chessBoard=[];
var me=true;
?
for(var i=0;i<15;i++){
? ? chessBoard[i]=[];
? ? for(var j=0;j<15;j++){
? ? ? ? chessBoard[i][j]=0;
chess.onclick = function(e){
? ? if(over){
? ? ? ? return;
? ? if(!me){
? ? 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]++;
? ? ? ? ? ? ? ? yourWin[k] = 6;//這個位置對方不可能贏了
? ? ? ? ? ? ? ? if(myWin[k] == 5){
? ? ? ? ? ? ? ? ? ? window.alert('我贏了');
? ? ? ? ? ? ? ? ? ? over = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? if(!over){
? ? ? ? ? ? me = !me;
? ? ? ? ? ?for(var k = 0; k < count; k++){
? ? ? ? ? ? ? ? yourWin[k]++;
? ? ? ? ? ? ? ? myWin[k] = 6;//這個位置對方不可能贏了
? ? ? ? ? ? ? ? if(yourWin[k] == 5){
? ? ? ? ? ? ? ? ? ? window.alert('你贏了');
? ? ? ? ? ? ? ? ? ? over = false;
? ??
var chess = document.getElementById('chess');
context.strokeStyle="#bfbfbf";
var logo=new Image();
logo.src="image/logo.png";
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);
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();
chess.onclick=function (e) {
? ? 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){
? ? ? ? if(me){
? ? ? ? ? ? chessBoard[i][j]=1;
? ? ? ? }else{
? ? ? ? ? ? chessBoard[i][j]=2;
? ? ? ? me=!me;
document.getElementById("restart").onclick = function(){
? ? window.location.reload();
我這個完成了ui,,,實現(xiàn)了落子,怎樣可以實現(xiàn)雙人對戰(zhàn)???,是不是還需要兩個人的分數(shù)計算。
舉報
"AlphaGO"我要和你下五子棋,教程帶你實現(xiàn)五子棋AI
1 回答JS實現(xiàn)人機大戰(zhàn)五指棋AI的算法有漏洞
2 回答算法 五子棋ai算法
2 回答五子棋AI篇 2-5這一節(jié)內(nèi)容
1 回答如何解決人機偶爾不成棋
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)微信公眾號
2019-10-01
就把computerAI這個函數(shù)去掉,在chess.onclick里面分別對黑棋和白旗進行贏法統(tǒng)計。
chess.onclick=function(e){
????if(gameOver){
????????return;
????}
????var?x=e.offsetX;
????var?y=e.offsetY;
????var?i=Math.floor(x/30);
????var?j=Math.floor(y/30);
????if(empty[i][j]==0){
????????//保證黑白棋子交替
????????oneStep(i,j,flag);
????????empty[i][j]=1;
????????if(flag){
????????????empty[i][j]=1;
????????????for(var?k=0;k<count;k++){
????????????????if(wins[i][j][k]){
????????????????????myWin[k]++;
????????????????????computerWin[k]=6;
????????????????????if(myWin[k]==5){
????????????????????????setTimeout(()=>{
????????????????????????????alert("黑棋贏了!");
????????????????????????},700);
????????????????????????gameOver=true;
????????????????????}
????????????????}
????????????}
????????????if(!gameOver){
????????????????flag=!flag;
????????????}
????????}else{
????????????empty[i][j]=2;
????????????for(var?k=0;k<count;k++){
????????????????if(wins[i][j][k]){
????????????????????computerWin[k]++;
????????????????????myWin[k]=6;
????????????????????if(computerWin[k]==5){
????????????????????????setTimeout(()=>{
????????????????????????????alert("白棋贏了!");
????????????????????????},700);
????????????????????????gameOver=true;
????????????????????}
????????????????}
????????????}
????????????if(!gameOver){
????????????????flag=!flag;
????????????}
????????}
????}
}
2018-06-11
如果會nodejs? 可以用websocket 實現(xiàn)
2017-11-24
這個不是在加入Ai前的那節(jié)課就實現(xiàn)了么。
2017-11-11
有沒有大神能夠幫忙指個思路,能詳細點最好了
非常感謝
2017-11-11
var chess = document.getElementById("chess");
var context = chess.getContext('2d');
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)計數(shù)組
var myWin = [];
var yourWin = [];
//贏法數(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;
? ? yourWin[i] = 0;
}
var chessBoard=[];
var me=true;
?
for(var i=0;i<15;i++){
? ? chessBoard[i]=[];
? ? for(var j=0;j<15;j++){
? ? ? ? chessBoard[i][j]=0;
? ? }
}
?
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]++;
? ? ? ? ? ? ? ? yourWin[k] = 6;//這個位置對方不可能贏了
? ? ? ? ? ? ? ? if(myWin[k] == 5){
? ? ? ? ? ? ? ? ? ? window.alert('我贏了');
? ? ? ? ? ? ? ? ? ? over = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(!over){
? ? ? ? ? ? me = !me;
? ? ? ? ? ?for(var k = 0; k < count; k++){
? ? ? ? ? ? if(wins[i][j][k]){
? ? ? ? ? ? ? ? yourWin[k]++;
? ? ? ? ? ? ? ? myWin[k] = 6;//這個位置對方不可能贏了
? ? ? ? ? ? ? ? if(yourWin[k] == 5){
? ? ? ? ? ? ? ? ? ? window.alert('你贏了');
? ? ? ? ? ? ? ? ? ? over = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? }
? ? }
? ??
}
var chess = document.getElementById('chess');
var context = chess.getContext('2d');
?
context.strokeStyle="#bfbfbf";
?
var logo=new Image();
logo.src="image/logo.png";
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 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();
}
?
chess.onclick=function (e) {
? ? 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;
? ? ? ? }
? ? ? ? me=!me;
? ? }
}
document.getElementById("restart").onclick = function(){
? ? window.location.reload();
}
我這個完成了ui,,,實現(xiàn)了落子,怎樣可以實現(xiàn)雙人對戰(zhàn)???,是不是還需要兩個人的分數(shù)計算。