一文教你用纯JS实现一个五子棋游戏
作者:重阳微噪
效果
前言
实现一个五子棋游戏, 简要分析其原理, 页面并没有很花哨, 原理搞懂了, 后面的就是很轻松的事了,无非是加一个棋盘背景,然后每个棋子改成圆形, 然后跟棋盘的十字中心交汇处对好。
分析
首先先分析一下,实现一个五子棋需要几步, 首先需要确定用什么样的数据结构, 鉴于对数组的使用更熟悉, 我们选用二维数组, 第一层数组代表行,内部代表列
[ [[],[]], [[],[]] ]
这个就代表两行两列了, 先写个方法实现根据传入数值计算行列
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; }
我们的页面结构和css是这样的
<style> .outer { display: flex; } .inner { width: 100px; height: 100px; background-color: #ff0; border: 1px solid #f00; cursor: pointer; } </style> <body> <h2>实现一个五子棋游戏</h2> <div id="pieces_box"></div> </body>
然后我们的页面视觉就出来了, 然后就是处理点击了。 我们通过事件委托的方式,将最外层的元素进行绑定
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); } });
我们通过绑定后, 根据点击的元素是哪个,获取位置坐标和颜色背景, 和黑白颜色的切换
接下来,我们就要去checkResult中去识别横纵坐标,不同颜色的棋子是否存在5个连续的点了, 我们先实现简单的,横向或者纵向是不是存在5个连续点,我们先写一个储存结果的集合,用来储存每个点击点, 然后我们通过对象key的唯一性, 让x为key, value 为数组, 去判断横坐标上是不是存在 value 中是否有连续5个点, 然后同理,在让y坐标为key,检查value种是否有5个点连续
const savePos = { white: { row: {}, col: {}, }, black: { row: {}, col: {}, }, };
如这个数据结构, 我们标注了黑色白色的落子,标注了横和纵, 然后把坐标写入进去
// 最重要的是如何判断赢, 连成五子,在各个方向上, 判断时机就是每个子落下的时候 function checkResult(currentPos, currentColor) { const color = currentColor === "#fff" ? "white" : "black"; const [x, y] = currentPos; // 思路判断 横竖比较简单, 可以通过横坐标为key, 数组值为纵坐标,检查是否连续成五个 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"); }
如图我们就构建了这样的数据结构, 然后现在我们要做的就是去检查 value的数组中是不是有连续五个数就行
方法如下:
// 检查是否存在5个连续的数字存在 function isConsecutive(arr) { // 先对数组进行排序 arr.sort(function (a, b) { return a - b; }); // 检查数组中的每个元素是否 存在依次递增 5个 的连续数字 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; }
到此, 我们的横向和纵向检查是否连成五个棋子的逻辑就完美实现了。
实现横向和纵向的后, 接下来就是识别斜对角是否存在连续连接的五个了, 这个我们留着下面再继续实现
以上就是一文教你用纯JS实现一个五子棋游戏的详细内容,更多关于JS实现五子棋游戏的资料请关注脚本之家其它相关文章!