2)初始化遊戲界面
遊戲開始時,init()對保存棋盤上的棋子信息的qizi數組初始化,同時在棋盤上顯示初始的4個棋子。
function init(){
initLevel();// 棋盤上初始4個棋子
showMoveInfo();//當前走棋方信息
mycanvas.addEventListener("mousedown",doMouseDown,false);
}
function initLevel() {
//初始化界面
var i,j;
for (i=0; i<8; i++) {
qizi[i]=new Array();
for (j=0; j<8; j++) {
qizi[i][j]=KONG;
}
}
// 棋盤上初始4個棋子
// 1為黑,2為白,0為無棋子
qizi[3][3] = WHITE;
qizi[4][4] = WHITE;
qizi[3][4] = BLACK;
qizi[4][3] = BLACK;
DrawMap(); //畫棋盤和所有棋子
message_txt.innerHTML = "該黑棋走子";
}
//畫棋盤和所有棋子
function DrawMap( )
{
context.clearRect ( 0 , 0 ,720 , 720);
context.drawImage(qipan,0,0,qipan.width,qipan.height);
for(i=0;i<qizi.length;i++)//行號
{
for(j=0;j<qizi[i].length;j++)//列號
{
var pic;
switch (qizi[i][j])
{
case KONG: //0
break;
case BLACK: //1
pic = blackstone;
context.drawImage(pic, w * j, h * i, pic.width, pic.height);
break;
case WHITE: //2
pic = whitestone;
context.drawImage(pic, w * j, h * i, pic.width, pic.height);
break;
}
}
}
}
showMoveInfo()顯示輪到那方走棋。
function showMoveInfo(){
if (curQizi== BLACK)// 當前走棋方是黑棋
message_txt.innerHTML="該黑棋走子";
else
message_txt.innerHTML="該白棋走子";
}
init()函數同時對canvas添加滑鼠單擊事件的偵聽。如果canvas被單擊則執行doMouseDown函數完成走棋功能。
3)走棋過程
如果是棋盤被單擊,則此位置像素信息(event.pageX,event.pageY)可以轉換成棋盤坐標 (x1,y1),然後判斷當前位置(x1, y1)是否可以放棋子(符合夾角之勢),如果可以則此位置顯示自己棋子圖形,調用FanALLQi(i, j)從左,左上,上,右上等八個方向翻轉對方的棋。最後判斷對方是否有棋可走,如果對方可以走棋則交換走棋方。如果對方不可以走棋,則自己可以繼續走棋,直到雙方都不能走棋,顯示輸贏信息。
function doMouseDown(event) {
var x = event.pageX;
var y = event.pageY;
var canvas = event.target;
var loc = getPointOnCanvas(canvas, x, y);
console.log("mouse down at point( x:" + loc.x + ", y:" + loc.y + ")");
clickQi(loc);
}
function getPointOnCanvas(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return { x: x - bbox.left * (canvas.width / bbox.width),
y: y - bbox.top * (canvas.height / bbox.height)};
}
function clickQi(thisQi) {
var x1, y1;
x1 = Math.round((thisQi.y - 40) / 80);
y1 = Math.round((thisQi.x - 40) / 80); //Math.round()四捨五入
if (Can_go(x1, y1)) {// 判斷當前位置是否可以放棋子
//trace("can");
qizi[x1][y1] = curQizi;
FanALLQi(x1, y1);//從左,左上,上,右上,右,右下,下,左下方向翻轉對方的棋
DrawMap();
//判斷對方是否有棋可走,如有交換走棋方
if (curQizi==WHITE &&checkNext(BLACK) ||curQizi==BLACK &&checkNext(WHITE)) {
if (curQizi==WHITE) {
curQizi=BLACK;
message_txt.innerHTML = "該黑棋走子";
} else {
curQizi=WHITE;
message_txt.innerHTML = "該白棋走子";
}
} else if (checkNext(curQizi)) {
//判斷自己是否有棋可走,如有,給出提示
message_txt.innerHTML = "對方無棋可走,請繼續";
} else {//雙方都無棋可走,遊戲結束,顯示輸贏信息
isLoseWin();
}//統計雙方的棋子數量,顯示輸贏信息。
}
else {
message_txt.innerHTML = "不能落子!";
}
}
4)可否落子判斷
Can_go(x1,y1)從左,左上,上,右上,右,右下,下,左下八個方向判斷(x1,y1)處可否落子。
function Can_go( x1, y1){
//從左,左上,上,右上,右,右下,下,左下八個方向判斷
if (CheckDirect(x1, y1, -1, 0) == true) {
return true;
}
if (CheckDirect(x1, y1, -1, -1) == true) {
return true;
}
if (CheckDirect(x1, y1, 0, -1) == true) {
return true;
}
if (CheckDirect(x1, y1, 1, -1) == true) {
return true;
}
if (CheckDirect(x1, y1, 1, 0) == true) {
return true;
}
if (CheckDirect(x1, y1, 1, 1) == true) {
return true;
}
if (CheckDirect(x1, y1, 0, 1) == true) {
return true;
}
if (CheckDirect(x1, y1, -1, 1) == true) {
return true;
}
return false;
}
CheckDirect()判斷某方向上是否形成夾擊之勢,如果形成且中間無空子則返回True。
function CheckDirect( x1, y1, dx, dy){
var x,y;
var flag= false;
x = x1 + dx;
y = y1 + dy;
while (InBoard(x, y) && !Ismychess(x, y) && qizi[x][y] != 0) {
x += dx;
y += dy;
flag = true;//構成夾擊之勢
}
if (InBoard(x, y) && Ismychess(x, y) && flag == true) {
return true;//該方向落子有效
}
return false;
}
checkNext(i)驗證參數代表的走棋方是否還有棋可走。
/**
* 驗證參數代表的走棋方是否還有棋可走
* @param i 代表走棋方,1為黑方,2為白方
* @return true/false
*/
function checkNext(i){
old=curQizi;
curQizi=i;
if ( Can_Num()>0) {
curQizi=old;
return true;
}
else {
curQizi=old;
return false;
}
}
Can_Num()統計可以落子的位置數。
function Can_Num() {//統計可以落子的位置數
var i, j, n = 0;
for (i = 1; i <= 8; i++) {
for (j = 1; j <= 8; j++) {
if (Can_go(i, j)) {
n = n + 1;
}
}
}
return n;//可以落子的位置個數
}
5)翻轉對方的棋子
FanALLQi(int x1, int y1) 從左,左上,上,右上,右,右下,下,左下八個方向翻轉對方的棋子。
function FanALLQi(x1, y1) {
//從左,左上,上,右上,右,右下,下,左下八個方向翻轉
if (CheckDirect(x1, y1, -1, 0) == true) {
DirectReverse(x1, y1, -1, 0);
}
if (CheckDirect(x1, y1, -1, -1) == true) {
DirectReverse(x1, y1, -1, -1);
}
if (CheckDirect(x1, y1, 0, -1) == true) {
DirectReverse(x1, y1, 0, -1);
}
if (CheckDirect(x1, y1, 1, -1) == true) {
DirectReverse(x1, y1, 1, -1);
}
if (CheckDirect(x1, y1, 1, 0) == true) {
DirectReverse(x1, y1, 1, 0);
}
if (CheckDirect(x1, y1, 1, 1) == true) {
DirectReverse(x1, y1, 1, 1);
}
if (CheckDirect(x1, y1, 0, 1) == true) {
DirectReverse(x1, y1, 0, 1);
}
if (CheckDirect(x1, y1, -1, 1) == true) {
DirectReverse(x1, y1, -1, 1);
}
}
DirectReverse()針對已形成夾擊之勢某方向上的對方棋子進行翻轉。
function DirectReverse(x1, y1, dx, dy) {
var x, y;
var flag= false;
x = x1 + dx;
y = y1 + dy;
while (InBoard(x, y) && !Ismychess(x, y) && qizi[x][y] != 0) {
x += dx;
y += dy;
flag = true;//構成夾擊之勢
}
if (InBoard(x, y) && Ismychess(x, y) && flag == true) {
do {
x -= dx;
y -= dy;
if ((x != x1 || y != y1)) {
FanQi(x, y);
}
} while ((x != x1 || y != y1));
}
}
FanQi(int x, int y)將存儲(x, y)處棋子信息qizi[x][y]的反色處理。
function FanQi(x, y) {
if (qizi[x][y] == BLACK) {
qizi[x][y] = WHITE;
}
else {
qizi[x][y] = BLACK;
}
}
InBoard()判斷(x,y)是否在棋盤界內,如果在界內則返回真,否則返回假。
//InBoard()判斷(x,y)是否在棋盤界內,如果在界內則返回真,否則返回假。
function InBoard(x,y ){
if (x >= 0 && x <= 7 && y >= 0 && y <= 7) {
return true;
} else {
return false;
}
}
6)顯示執棋方可落子位置
「走棋提示」按鈕單擊事件函數是DoHelp(),它顯示可以落子的位置提示。Show_Can_Position()用圖片i顯示可以落子的位置。
function DoHelp() {
showCanPosition();//顯示可以落子的位置
}
function showCanPosition() {
//顯示可以落子的位置
var i,j;
var n = 0;//可以落子的位置統計
for (i = 0; i <= 7; i++) {
for (j = 0; j <= 7; j++) {
if (qizi[i][j] == 0 && Can_go(i, j)) {
n = n + 1;
pic=info;
context.drawImage(pic,w*j+20,h*i+20,pic.width,pic.height);;//顯示提示圖形
}
}
}
}
7)判斷勝負功能
isLoseWin()統計雙方的棋子數量,顯示輸贏信息。
// 顯示輸贏信息
function isLoseWin() {
var whitenum = 0;
var blacknum = 0;
var n = 0,x,y;
for (x = 0; x <= 8; x++) {
for (y = 0; y <= 8; y++) {
if (qizi[x][y] != 0) {
n = n + 1;
if (qizi[x][y] == 2) {
whitenum += 1;
}
if (qizi[x][y] == 1) {
blacknum += 1;
}
}
}
}
if (blacknum > whitenum) {
message_txt.innerHTML = "遊戲結束黑方勝利,黑方:" + String(blacknum) + "白方:" + String(whitenum);
} else {
message_txt.innerHTML = "遊戲結束白方勝利, 黑方:" + String(blacknum) + "白方:" + String(whitenum);
}
}