一文教你用純JS實現(xiàn)一個五子棋游戲
效果
前言
實現(xiàn)一個五子棋游戲, 簡要分析其原理, 頁面并沒有很花哨, 原理搞懂了, 后面的就是很輕松的事了,無非是加一個棋盤背景,然后每個棋子改成圓形, 然后跟棋盤的十字中心交匯處對好。
分析
首先先分析一下,實現(xiàn)一個五子棋需要幾步, 首先需要確定用什么樣的數(shù)據(jù)結(jié)構(gòu), 鑒于對數(shù)組的使用更熟悉, 我們選用二維數(shù)組, 第一層數(shù)組代表行,內(nèi)部代表列
[ [[],[]], [[],[]] ]
這個就代表兩行兩列了, 先寫個方法實現(xiàn)根據(jù)傳入數(shù)值計算行列
function generator(rlength, clength) { let array = []; for (let i = 0; i < rlength; i++) { array[i] = []; for (let j = 0; j < clength; j++) { array[i].push([]); } } return array; } const piecesArr = generator(8, 8);
接下來, 我們就是渲染到頁面上了,再寫個渲染的方法
function renderPieces() { const pieces_box = document.querySelector("#pieces_box"); let renderText = ""; piecesArr.map((items, rindex) => { renderText += '<div class="outer">'; items.map((item, cindex) => { renderText += `<div class="inner" id="${[rindex, cindex]}"></div>`; }); renderText += "</div>"; }); pieces_box.innerHTML = renderText; }
我們的頁面結(jié)構(gòu)和css是這樣的
<style> .outer { display: flex; } .inner { width: 100px; height: 100px; background-color: #ff0; border: 1px solid #f00; cursor: pointer; } </style> <body> <h2>實現(xiàn)一個五子棋游戲</h2> <div id="pieces_box"></div> </body>
然后我們的頁面視覺就出來了, 然后就是處理點擊了。 我們通過事件委托的方式,將最外層的元素進(jìn)行綁定
let currentColor = "#fff"; pieces_box.addEventListener("click", (e) => { if (e.target.closest(".inner") && !e.target.style.background) { currentColor = currentColor === "#fff" ? "#000" : "#fff"; e.target.style.background = currentColor; const currentPos = e.target.id.split(",").map(Number); checkResult(currentPos, currentColor); } });
我們通過綁定后, 根據(jù)點擊的元素是哪個,獲取位置坐標(biāo)和顏色背景, 和黑白顏色的切換
接下來,我們就要去checkResult中去識別橫縱坐標(biāo),不同顏色的棋子是否存在5個連續(xù)的點了, 我們先實現(xiàn)簡單的,橫向或者縱向是不是存在5個連續(xù)點,我們先寫一個儲存結(jié)果的集合,用來儲存每個點擊點, 然后我們通過對象key的唯一性, 讓x為key, value 為數(shù)組, 去判斷橫坐標(biāo)上是不是存在 value 中是否有連續(xù)5個點, 然后同理,在讓y坐標(biāo)為key,檢查value種是否有5個點連續(xù)
const savePos = { white: { row: {}, col: {}, }, black: { row: {}, col: {}, }, };
如這個數(shù)據(jù)結(jié)構(gòu), 我們標(biāo)注了黑色白色的落子,標(biāo)注了橫和縱, 然后把坐標(biāo)寫入進(jìn)去
// 最重要的是如何判斷贏, 連成五子,在各個方向上, 判斷時機(jī)就是每個子落下的時候 function checkResult(currentPos, currentColor) { const color = currentColor === "#fff" ? "white" : "black"; const [x, y] = currentPos; // 思路判斷 橫豎比較簡單, 可以通過橫坐標(biāo)為key, 數(shù)組值為縱坐標(biāo),檢查是否連續(xù)成五個 Array.isArray(savePos[color].row[x]) ? savePos[color].row[x].push(y) : (savePos[color].row[x] = [y]); Array.isArray(savePos[color].col[y]) ? savePos[color].col[y].push(x) : (savePos[color].col[y] = [x]); console.log(savePos, "savePos"); // 檢測白子 checkISLinkSuccess(savePos["white"], "white"); // 檢測黑子 checkISLinkSuccess(savePos["black"], "black"); }
如圖我們就構(gòu)建了這樣的數(shù)據(jù)結(jié)構(gòu), 然后現(xiàn)在我們要做的就是去檢查 value的數(shù)組中是不是有連續(xù)五個數(shù)就行
方法如下:
// 檢查是否存在5個連續(xù)的數(shù)字存在 function isConsecutive(arr) { // 先對數(shù)組進(jìn)行排序 arr.sort(function (a, b) { return a - b; }); // 檢查數(shù)組中的每個元素是否 存在依次遞增 5個 的連續(xù)數(shù)字 for (let i = 0; i <= arr.length - 5; i++) { if ( arr[i] + 1 === arr[i + 1] && arr[i + 1] + 1 === arr[i + 2] && arr[i + 2] + 1 === arr[i + 3] && arr[i + 3] + 1 === arr[i + 4] ) { return true; } } return false; }
到此, 我們的橫向和縱向檢查是否連成五個棋子的邏輯就完美實現(xiàn)了。
實現(xiàn)橫向和縱向的后, 接下來就是識別斜對角是否存在連續(xù)連接的五個了, 這個我們留著下面再繼續(xù)實現(xiàn)
以上就是一文教你用純JS實現(xiàn)一個五子棋游戲的詳細(xì)內(nèi)容,更多關(guān)于JS實現(xiàn)五子棋游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript navigator.userAgent獲取瀏覽器信息案例講解
這篇文章主要介紹了JavaScript navigator.userAgent獲取瀏覽器信息案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08JS中如何實現(xiàn)點擊a標(biāo)簽返回頁面頂部的問題
這篇文章主要介紹了JS中實現(xiàn)點擊a標(biāo)簽返回頁面頂部的問題,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-01-01JS實現(xiàn)商城秒殺倒計時功能(動態(tài)設(shè)置秒殺時間)
這篇文章主要介紹了JS實現(xiàn)商城秒殺倒計時功能(動態(tài)設(shè)置秒殺時間),本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12Javascript實現(xiàn)的StopWatch功能示例
這篇文章主要介紹了Javascript實現(xiàn)的StopWatch功能,結(jié)合具體實例形式分析了javascript自定義StopWatch實現(xiàn)測試運(yùn)行時間功能的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06