先看下現在做完的效果:
線上體驗:
主要功能模組為:
1.人機對戰功能
2.悔棋功能
3.撤銷悔棋功能
從效果圖可以看到,棋盤的橫豎可以放的位置為15*15,通過canvas畫棋盤:
//繪畫棋盤
var drawchessboard = function()
}
知道格仔數後,我們先看五子棋有多少種贏法:
//贏法陣列
var wins = ;
for(var i = 0; i < 15; i++)
}var count = 0; //贏法總數
//橫線贏法
for(var i = 0; i < 15; i++)
count++;}}
//豎線贏法
for(var i = 0; i < 15; i++)
count++;}}
//正斜線贏法
for(var i = 0; i < 11; i++)
count++;}}
//反斜線贏法
for(var i = 0; i < 11; i++)
count++;}}
根據贏法總數定義分別儲存計算機和人贏法的陣列:
for(var i = 0; i < count; i++)
然後就是人開始下棋:
// 我,下棋
chess.onclick = function(e)
if(!me)
var x = e.offsetx;
var y = e.offsety;
var i = math.floor(x / 30);
var j = math.floor(y / 30);
_nowi = i;
_nowj = j;
if(chressbord[i][j] == 0)}}
if(!over)
}// 悔棋功能可用
backbtn.classname = backbtn.classname.replace( new regexp( "(\\s|^)unable(\\s|$)" )," " );
}
onestep() 方法為落子,要在棋盤上畫乙個棋子:
//畫棋子
var onestep = function(i,j,me)else
context.fillstyle = gradient;
context.fill();
}
接著看計算機怎麼下棋,具體看computerai()方法:
// 計算機下棋
var computerai = function ()
}for(var i = 0; i < 15; i++)else if(mywin[k] == 2)else if(mywin[k] == 3)else if(mywin[k] == 4)
if(computerwin[k] == 1)else if(computerwin[k] == 2)else if(computerwin[k] == 3)else if(computerwin[k] == 4) }}
if(myscore[i][j] > max)else if(myscore[i][j] == max)
}if(computerscore[i][j] > max)else if(computerscore[i][j] == max)}}
}}_compi = u;
_compj = v;
onestep(u,v,false);
chressbord[u][v] = 2; //計算機佔據位置
for(var k = 0; k < count; k++)}}
if(!over)
}
根據相應的權重,計算出計算機應該落子的位置。
要提的是,這裡暫時只能悔一步棋。悔棋功能主要關鍵點是:1、銷毀剛剛下的棋子;2、將之前不可能贏的狀態還原;看下具體的**:
// 悔棋
backbtn.onclick = function(e)
over = false;
me = true;
// 我,悔棋
chressbord[_nowi][_nowj] = 0; //我,已佔位置 還原
minusstep(_nowi, _nowj); //銷毀棋子
for(var k = 0; k < count; k++)
}// 計算機相應的悔棋
chressbord[_compi][_compj] = 0; //計算機,已佔位置 還原
minusstep(_compi, _compj); //銷毀棋子
for(var k = 0; k < count; k++)
}resulttxt.innerhtml = '--益智五子棋--';
returnable = true;
backable = false;
// 撤銷悔棋功能可用
returnbtn.classname = returnbtn.classname.replace( new regexp( "(\\s|^)unable(\\s|$)" )," " );
}
minusstep()為銷毀棋子的方法,我們看下是怎麼銷毀的。
//銷毀棋子
var minusstep = function(i,j)
首先通過clearrect()擦掉該圓,然後再重新畫該圓周圍的格仔,注意相應的位置,這裡花了些時間折騰。
悔棋過後,再撤銷,相當於還原悔棋之前的狀態。**比較簡單:
// 撤銷悔棋
returnbtn.onclick = function(e)
// 我,撤銷悔棋
chressbord[_nowi][_nowj] = 1; //我,已佔位置
onestep(_nowi,_nowj,me);
for(var k = 0; k < count; k++)
if(mywin[k] == 5)
}// 計算機撤銷相應的悔棋
chressbord[_compi][_compj] = 2; //計算機,已佔位置
onestep(_compi,_compj,false);
for(var k = 0; k < count; k++)
if(computerwin[k] == 5)
}returnbtn.classname += 'unable';
returnable = false;
backable = true;
}
至此,比較簡單的完成了這三個功能。
參考資料:
原生js實現 五子棋
先初始化棋盤 html css 棋盤 grid 每個棋子落點區域 per zone js 棋盤const grid document.getelementsbyclassname grid 0 棋盤有15列,15行 const column 15 line 15 裝棋子的二維陣列 let grida...
Java實現五子棋
一定義常量類 public class constant二定義我們的棋盤類 public class chess private void playchess 錯誤輸入 if str.length 2 正常輸入的情況 判斷是否越界 if isoverstep str else end if 判斷是否...
C 實現五子棋
自己寫了一下午,但是還是除錯的時候存在很多問題 繼續改善繼續調整 game.h define game h define row 5 define col 5 void displayboard char board row col int row,int col void gameplayer c...