最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文教你用純JS實(shí)現(xiàn)一個(gè)五子棋游戲

 更新時(shí)間:2023年12月22日 11:15:14   作者:重陽(yáng)微噪  
實(shí)現(xiàn)一個(gè)五子棋游戲, 簡(jiǎn)要分析其原理, 頁(yè)面并沒有很花哨, 原理搞懂了, 后面的就是很輕松的事了,本文給大家介紹了如何用純JS實(shí)現(xiàn)一個(gè)五子棋游戲,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

效果

前言

實(shí)現(xiàn)一個(gè)五子棋游戲, 簡(jiǎn)要分析其原理, 頁(yè)面并沒有很花哨, 原理搞懂了, 后面的就是很輕松的事了,無非是加一個(gè)棋盤背景,然后每個(gè)棋子改成圓形, 然后跟棋盤的十字中心交匯處對(duì)好。

分析

首先先分析一下,實(shí)現(xiàn)一個(gè)五子棋需要幾步, 首先需要確定用什么樣的數(shù)據(jù)結(jié)構(gòu), 鑒于對(duì)數(shù)組的使用更熟悉, 我們選用二維數(shù)組, 第一層數(shù)組代表行,內(nèi)部代表列

[
  [[],[]],
  [[],[]]
] 

這個(gè)就代表兩行兩列了, 先寫個(gè)方法實(shí)現(xiàn)根據(jù)傳入數(shù)值計(jì)算行列

 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);

接下來, 我們就是渲染到頁(yè)面上了,再寫個(gè)渲染的方法

  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;
    }

我們的頁(yè)面結(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>實(shí)現(xiàn)一個(gè)五子棋游戲</h2>
    <div id="pieces_box"></div>
  </body>

然后我們的頁(yè)面視覺就出來了, 然后就是處理點(diǎn)擊了。 我們通過事件委托的方式,將最外層的元素進(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ù)點(diǎn)擊的元素是哪個(gè),獲取位置坐標(biāo)和顏色背景, 和黑白顏色的切換

接下來,我們就要去checkResult中去識(shí)別橫縱坐標(biāo),不同顏色的棋子是否存在5個(gè)連續(xù)的點(diǎn)了, 我們先實(shí)現(xiàn)簡(jiǎn)單的,橫向或者縱向是不是存在5個(gè)連續(xù)點(diǎn),我們先寫一個(gè)儲(chǔ)存結(jié)果的集合,用來儲(chǔ)存每個(gè)點(diǎn)擊點(diǎn), 然后我們通過對(duì)象key的唯一性, 讓x為key, value 為數(shù)組, 去判斷橫坐標(biāo)上是不是存在 value 中是否有連續(xù)5個(gè)點(diǎn), 然后同理,在讓y坐標(biāo)為key,檢查value種是否有5個(gè)點(diǎn)連續(xù)

  const savePos = {
      white: {
        row: {},
        col: {},
      },
      black: {
        row: {},
        col: {},
      },
    };

如這個(gè)數(shù)據(jù)結(jié)構(gòu), 我們標(biāo)注了黑色白色的落子,標(biāo)注了橫和縱, 然后把坐標(biāo)寫入進(jìn)去

    //  最重要的是如何判斷贏, 連成五子,在各個(gè)方向上, 判斷時(shí)機(jī)就是每個(gè)子落下的時(shí)候
    function checkResult(currentPos, currentColor) {
      const color = currentColor === "#fff" ? "white" : "black";
      const [x, y] = currentPos;
      // 思路判斷 橫豎比較簡(jiǎn)單, 可以通過橫坐標(biāo)為key, 數(shù)組值為縱坐標(biāo),檢查是否連續(xù)成五個(gè)
      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");
      // 檢測(cè)白子
      checkISLinkSuccess(savePos["white"], "white");
      // 檢測(cè)黑子
      checkISLinkSuccess(savePos["black"], "black");
    }

如圖我們就構(gòu)建了這樣的數(shù)據(jù)結(jié)構(gòu), 然后現(xiàn)在我們要做的就是去檢查 value的數(shù)組中是不是有連續(xù)五個(gè)數(shù)就行

方法如下:

  // 檢查是否存在5個(gè)連續(xù)的數(shù)字存在
    function isConsecutive(arr) {
      // 先對(duì)數(shù)組進(jìn)行排序
      arr.sort(function (a, b) {
        return a - b;
      });
      // 檢查數(shù)組中的每個(gè)元素是否 存在依次遞增 5個(gè) 的連續(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;
    }

到此, 我們的橫向和縱向檢查是否連成五個(gè)棋子的邏輯就完美實(shí)現(xiàn)了。

實(shí)現(xiàn)橫向和縱向的后, 接下來就是識(shí)別斜對(duì)角是否存在連續(xù)連接的五個(gè)了, 這個(gè)我們留著下面再繼續(xù)實(shí)現(xiàn)

以上就是一文教你用純JS實(shí)現(xiàn)一個(gè)五子棋游戲的詳細(xì)內(nèi)容,更多關(guān)于JS實(shí)現(xiàn)五子棋游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • CryptoJS中AES實(shí)現(xiàn)前后端通用加解密技術(shù)

    CryptoJS中AES實(shí)現(xiàn)前后端通用加解密技術(shù)

    這篇文章主要為大家詳細(xì)介紹了CryptoJS中AES實(shí)現(xiàn)前后端通用加解密技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • JavaScript中的Error錯(cuò)誤對(duì)象與自定義錯(cuò)誤類型詳解

    JavaScript中的Error錯(cuò)誤對(duì)象與自定義錯(cuò)誤類型詳解

    Error是JavaScript中最原始的錯(cuò)誤對(duì)象,作為各種異常的基礎(chǔ)對(duì)象,還有多個(gè)衍生的具體的錯(cuò)誤類型,這些錯(cuò)誤對(duì)象類型在nodejs中也可應(yīng)用,這篇文章主要介紹了JavaScript中的Error錯(cuò)誤對(duì)象與自定義錯(cuò)誤類型,需要的朋友可以參考下
    2022-12-12
  • JavaScript?對(duì)象新增方法defineProperty與keys的使用說明

    JavaScript?對(duì)象新增方法defineProperty與keys的使用說明

    這篇文章主要介紹了JavaScript對(duì)象新增方法defineProperty與keys的使用說明,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • Javascript的表單驗(yàn)證-提交表單

    Javascript的表單驗(yàn)證-提交表單

    JavaScript 可用來在數(shù)據(jù)被送往服務(wù)器前對(duì) HTML 表單中的這些輸入數(shù)據(jù)進(jìn)行驗(yàn)證。通過本文給大家介紹Javascript的表單驗(yàn)證-提交表單,對(duì)javascript表單驗(yàn)證,提交表單相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • JS畫線(實(shí)例代碼)

    JS畫線(實(shí)例代碼)

    這篇文章主要是對(duì)JS畫線的實(shí)例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-11-11
  • JS實(shí)現(xiàn)可縮放、拖動(dòng)、關(guān)閉和最小化的浮動(dòng)窗口完整實(shí)例

    JS實(shí)現(xiàn)可縮放、拖動(dòng)、關(guān)閉和最小化的浮動(dòng)窗口完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)可縮放、拖動(dòng)、關(guān)閉和最小化的浮動(dòng)窗口的方法,實(shí)例分析了javascript操作窗口層的技巧,需要的朋友可以參考下
    2015-03-03
  • ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展實(shí)例詳解

    ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展實(shí)例詳解

    這篇文章主要介紹了ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展,結(jié)合實(shí)例形式詳細(xì)分析了ES6數(shù)組和對(duì)象拓展運(yùn)算符、拓展方法的使用及相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • JavaScript reduce和reduceRight詳解

    JavaScript reduce和reduceRight詳解

    這篇文章主要介紹了JavaScript reduce和reduceRight的高級(jí)用法詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • JavaScript中btoa和atob全局函數(shù)示例詳解

    JavaScript中btoa和atob全局函數(shù)示例詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript中btoa和atob全局函數(shù)的相關(guān)資料,atob和btoa是window對(duì)象的兩個(gè)函數(shù),用來編碼解碼Base64,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • three.js中文文檔學(xué)習(xí)之創(chuàng)建場(chǎng)景

    three.js中文文檔學(xué)習(xí)之創(chuàng)建場(chǎng)景

    這篇文章主要給大家介紹了three.js中文文檔學(xué)習(xí)之創(chuàng)建場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評(píng)論

财经| 乐安县| 成都市| 马边| 威信县| 河东区| 桂平市| 石楼县| 麻城市| 长宁县| 凌海市| 昌江| 苗栗市| 黔江区| 荥阳市| 洛阳市| 尼勒克县| 湖南省| 拉孜县| 阜新| 通辽市| 景洪市| 安溪县| 乡城县| 阜新市| 江阴市| 庆元县| 黄石市| 屏东市| 红安县| 河源市| 东辽县| 双流县| 清苑县| 甘洛县| 翁源县| 油尖旺区| 涞源县| 阆中市| 邯郸市| 鄂伦春自治旗|