創作內容

5 GP

【JavaScript】如何製作純網頁遊戲4

作者:巨龍-埃特│2014-07-05 11:16:44│巴幣:10│人氣:1380
接續上一課
本次將說明基本的五子棋PvP回合切換和勝負判定
在上一課中,已經做出讓網頁棋盤動作(回傳索引值)的方法

首先我們要先把點擊棋格的動作更改為
改變棋格圖像為玩家棋色
代表他在這格下了一步棋

做法很簡單
打開上一課教學中的Gomoku.js
找到showBoard()方法中
alert("you click :" eval(this.name));
的這行
用一個新方法取代
詳細在下面用紅色粗體標記




clonePiece = piece[8].cloneNode(true);
//將棋格以x方向到y方向排列
board[(y-1)*15+(x-1)]=0;
//以棋格名稱作為儲存媒介
clonePiece.name="("+y+"-1)*15+("+x+"-1)";
//設定滑鼠事件
clonePiece.onclick = function(){
//放棋動作
putChess(this);

};


接著新增放棋動作
putChess的這個方法
另外有一個引數
piece(棋格物件)

內容很簡單
就是將棋格物件中的圖片來源指向當前行動玩家(turn)的棋色圖片
當turn==1時
是黑色
當turn==2時
是白色
之後停止觸發棋格點擊事件
然後將玩家代表回合存入該棋格索引值中
如下表所示



//棋手下棋
function putChess(piece){
if(turn==1){
//當前行動方為黑
piece.firstChild.src="black.png";
}else{
//當前行動方為白
piece.firstChild.src="white.png";
}
//停止觸發棋格點擊事件
piece.style.pointerEvents = 'none';
//記錄下棋點
board[parseInt(eval(piece.name))]=turn;
//回合更換
turn=3-turn;
}


標記紅色的部分稍作說明
可藉由A=3-A來讓A的直在1和2之間來回變換
也就是換回合的意思

這麼一來點擊下一個棋格
就換成下白棋
再來又換回黑棋
無限循環下去

so,基本的換回合下棋就這樣做完了
看看效果


當然
光是這樣還不夠
因為沒有規則判定

接下來指要加上五子棋規則判定
基本的五子棋遊戲大致上就已經完成了
只是只有玩家對玩家的功能而已(老實說應該不太可能找到人跟你一起坐在電腦前玩這東西)

五子棋的規則在教學2中已經解說
是在橫向、直向、斜向等8個方向連接5個己方棋,即獲得勝利
所以......以下是我設計這個判定的想法



圖解:
以玩家下的棋點作為起始點
設計1個變數初始為1
設計4個方法,
1個讓程式往某個方向以及某個方向的反向,進行連線判定,只要其中一條達到5連線則贏
2則是連線判定的迴圈內容,要是下一格非己方棋或空格則跳出迴圈,回傳最後的判定值
3是當分出勝負時,將遊戲結束的方法
4是判定座標是否超出棋盤範圍(x<15,y<15)

so
將表程式碼加入
記錄下棋點之後--回合更換之前
很重要所以標起來

checkWin(parseInt(eval(piece.name)));


新增一個方法checkWin
有一個引數index:進行勝利判定點

//檢查勝利
function checkWin(index){
var y=Math.floor(index/15);
var x=index%15;
//橫向判定
if(checkLine(x,y,0,1)+checkLine(x,y,0,-1)+1==5 ||
//直向判定
checkLine(x,y,1,0)+checkLine(x,y,-1,0)+1==5 ||
//斜向左上右下判定
checkLine(x,y,1,1)+checkLine(x,y,-1,-1)+1==5 ||
//斜向右上左下判定
checkLine(x,y,-1,1)+checkLine(x,y,1,-1)+1==5){
if(turn == 1){
showMsg("黑棋贏,白棋輸。");
}else{
showMsg("白棋贏,黑棋輸。");
}
endGame();
};
}


現在關於判定連線的方法

//判定連線
function checkLine(x,y,dx,dy){
//連線次數
var link=0;
for(var i=0;i<5;i++){
//指向下個棋格
x+=dx;
y+=dy;
//超出範圍或下個棋格非己方棋則結束連線
if(!valid(x,y) || board[y*15+x] != turn){
return link;
}
//追加連結次數
link+=1;
}
return link;
}


當然還包刮是否超出棋盤外
以及遊戲結束的方法

//沒超出棋盤
function valid(x,y){
return(x>=0 && y>=0 && x<15 && y<15);
}



//遊戲結束
var gameEnd=false;
function endGame(){
gameEnd=true;
}

function putChess(piece){
if(gameEnd){
return;
}
......
}



現在打開瀏覽器看看運作是否正常了
本回教學到此為止
下一回將是最後一篇
集中說明關於AI設計的方法
同時釋出原始碼與資料
感謝參與
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2500394
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|編成|html

留言共 1 篇留言

魔法聖騎士
這位大大您好, 我嘗試寫這樣的程式,
但是在
checkWin(parseInt(eval(piece.name)))插入後,
卻出現了index.html執行只剩下黑棋(black.png)的圖示.

而如果繼續完成後面的語法,
那又只剩下cell.ong這圖示, 不再是15*15的樣子.
那當然程式也跑不下去了...

(其實我對於javascript的語法不熟)
像checkWin以及之後的方法(function)都是放在
"//程式進入點 "之後嗎?
因為我不論把它放在裡面還是外面, 都跑出同樣的結果.

很少看到這麼詳盡的語法教學,
如果可以, 不知道能幫我解決疑惑嗎??
謝謝!!



07-26 13:20

巨龍-埃特
應該是語法有錯誤,整個罷工了。晚點我回去把完整原始碼補上07-26 14:16
巨龍-埃特
https://dl.dropboxusercontent.com/u/24367516/webgames/Game.zip07-26 19:56
我要留言提醒:您尚未登入,請先登入再留言

5喜歡★a0878787878 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【JavaScript】... 後一篇:【JavaScript】...

追蹤私訊切換新版閱覽

作品資料夾

p5147f86讀者們
新系列開始連載囉! 小屋裡小說每週更新,歡迎大家來追蹤(≧ω≦)/看更多我要大聲說昨天21:13


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】