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

js canvas實現(xiàn)五子棋小游戲

 更新時間:2021年01月22日 10:52:24   作者:魚-貓  
這篇文章主要為大家詳細介紹了js canvas實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了canvas實現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下

效果

思路

  • canvans 繪制棋盤,繪制時候邊緣預留棋子位置
  • 監(jiān)聽點擊事件繪制落子并記錄到字典中
  • 獲勝判定,在四個方向上檢測是否有足夠數(shù)量的連貫棋子

代碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>ym</title>
  <style>
    canvas {
      display: block;
      margin: 0 auto;
      border: 0
    }

    .result {
      text-align: center;
    }
    button{
      display: block;
      margin: 0 auto;
      padding: 4px 20px;
      border:0;
      color: #fff;
      outline: none;
      border-radius: 3px;
      background: #43a6ff
    }
    button:hover{
      font-weight: bold;
      cursor: pointer;
    }
  </style>
</head>
<body>
<canvas id="cv" width="200px" height="200px"></canvas>
<p class="result"></p>
<button onclick="loadPanel(400, 400,30,13)">刷新</button>
<script>

  loadPanel(400, 400,30,13);

  /**
   * 1) 點擊落子并切換執(zhí)子者
   * 2)以當前落子位置為基準,以‘米'字型判定,是否能構成五連及以上
   * @param w 棋盤寬度
   * @param h 棋盤高度
   * @param cs 格子尺寸
   * @param ps 棋子半徑
   */
  function loadPanel(w, h, cs, ps) {
    let i, j, k;
    let chks = [[1, 0], [0, 1], [1, 1], [1, -1]];//水平,縱向,斜下,斜上 四個方向
    let successNum = 5;//贏棋標準
    let resultEl = document.querySelector('.result');

    //1)繪制棋盤,邊緣應隔開棋子半徑的距離
    cs = cs || 16;//默認格子寬高
    ps = ps || 4;//棋子半徑
    h = h || w;//高度默認等于寬度

    let el = document.getElementById('cv');
    el.setAttribute('width', w + 'px');
    el.setAttribute('height', h + 'px');
    let context = el.getContext("2d");
    //計算棋盤分割,向下取整
    let splitX = ~~((w - 2 * ps) / cs), splitY = ~~((h - 2 * ps) / cs);

    //初始化落子位置使用字典存儲,相較于數(shù)組簡單且減少內(nèi)存占用
    let pieces = {};
    //循環(huán)劃線
    context.translate(ps, ps);
    context.beginPath();
    context.strokeStyle = '#000';
    //垂直線
    for (i = 0; i < splitX + 1; i++) {
      context.moveTo(cs * i, 0);
      context.lineTo(cs * i, splitY * cs);
      context.stroke();
    }
    //水平線
    for (j = 0; j < splitY + 1; j++) {
      context.moveTo(0, cs * j);
      context.lineTo(splitX * cs, cs * j);
      context.stroke();
    }
    context.closePath();

    let user = 0, colors = ['#000', '#fefefe'];
    el.addEventListener('click', function (e) {
      let x = e.offsetX,
        y = e.offsetY,
        //計算落子范圍
        rx = ~~((x - ps) / cs) + (((x - ps) % cs <= cs / 2) ? 0 : 1),
        ry = ~~((y - ps) / cs) + (((y - ps) % cs <= cs / 2) ? 0 : 1);
      //繪制棋子
      context.beginPath();
      context.arc(cs * rx, cs * ry, ps, 2 * Math.PI, false);
      context.fillStyle = colors[user];
      context.strokeStyle = '#000';
      user ? user = 0 : user = 1;//切換執(zhí)子者
      context.fill();
      context.stroke();
      context.closePath();

      //記錄棋子位置
      let piece = pieces[rx + '-' + ry] = user;

      //米字型計算結果,以當前落子位置計算是否存在某個方向上具有連續(xù)的五個相同棋子
      for (j = 0; j < chks.length; j++) {
        let num = 1, chk = chks[j];
        for (i = 1; i <= 4; i++) {
          if (pieces[(rx + chk[0] * i) + '-' + (ry + chk[1] * i)] == piece) {
            num++
          } else {
            for (i = -1; i >= -4; i--) {
              if (pieces[(rx + chk[0] * i) + '-' + (ry + chk[1] * i)] == piece) {
                num++
              }
            }
            break
          }
        }
        if (num == successNum) {
          resultEl.innerHTML = ['白', '黑'][user] + '方贏';
          break;
        }
      }
    })
  }
</script>
</body>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript中常見的八個陷阱總結

    JavaScript中常見的八個陷阱總結

    這篇文章主要給大家總結介紹了關于JavaScript中八個常見的陷阱,這些陷阱雖然針對Javascript初學者,但是磚家們你們也可以看一看,避免入了這些坑,感興趣的朋友們下面來一起看看吧。
    2017-06-06
  • 用按鈕控制iframe顯示的網(wǎng)頁實現(xiàn)方法

    用按鈕控制iframe顯示的網(wǎng)頁實現(xiàn)方法

    在iframe中顯示的網(wǎng)頁已經(jīng)是一件平凡無奇的事了,不過可能依然有很多的童鞋沒不知所措吧,沒關系,因為本文的出現(xiàn)將會帶你脫離苦海,感性的朋友可以了解下啊,或許對你有所幫助
    2013-02-02
  • Javascript 強制類型轉換函數(shù)

    Javascript 強制類型轉換函數(shù)

    javascript是弱類型的語言,所以強制類型轉換還是比較重要的,下面看一下它的幾個強制轉換的函數(shù)
    2009-05-05
  • DLL+ ActiveX控件+WEB頁面調用例子

    DLL+ ActiveX控件+WEB頁面調用例子

    因項目需要,開始學習并研究VC、DLL及ActiveX控件,網(wǎng)上資料找了很多,但沒一個可用的或者說沒一個例子可理解并運行的。沒辦法,自己研究吧。功夫不負有心人,終有小成了,呵呵,現(xiàn)在把自己學習總結了一下,獻給需要的人。
    2010-08-08
  • JavaScript 模塊化開發(fā)實例詳解【seajs、requirejs庫使用】

    JavaScript 模塊化開發(fā)實例詳解【seajs、requirejs庫使用】

    這篇文章主要介紹了JavaScript 模塊化開發(fā),結合實例形式詳細分析了基于seajs、requirejs庫的JavaScript模塊化使用相關操作技巧,需要的朋友可以參考下
    2020-05-05
  • TypeScript中的類型斷言[as語法|<>語法]的使用

    TypeScript中的類型斷言[as語法|<>語法]的使用

    本文主要介紹了TypeScript中的類型斷言[as語法|<>語法]的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 加隨機數(shù)引入腳本不讓瀏覽器讀取緩存

    加隨機數(shù)引入腳本不讓瀏覽器讀取緩存

    不讓瀏覽器讀取緩存,故采用家隨機數(shù)方式引入腳本的方式,此法適用于及時刷新不讀緩存的情況
    2014-09-09
  • canvas 實現(xiàn)中國象棋

    canvas 實現(xiàn)中國象棋

    本文主要介紹了canvas 實現(xiàn)中國象棋的方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 用方法封裝javascript的new操作符(一)

    用方法封裝javascript的new操作符(一)

    雖然js是基于對象的,但在很多時候會使用到new這個操作符。
    2010-12-12
  • JavaScript創(chuàng)建對象的七種經(jīng)典方式分享

    JavaScript創(chuàng)建對象的七種經(jīng)典方式分享

    JavaScript 創(chuàng)建對象的方式有很多,通過 Object 構造函數(shù)或對象字面量的方式也可以創(chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復代碼,并不適合量產(chǎn)。本文介紹了七種非常經(jīng)典的創(chuàng)建對象的方式,希望對大家有所幫助
    2022-11-11

最新評論

克东县| 宝坻区| 永善县| 册亨县| 花垣县| 岐山县| 宜宾市| 繁昌县| 旺苍县| 桃江县| 论坛| 札达县| 泰兴市| 镇康县| 佛冈县| 亚东县| 定州市| 晴隆县| 中超| 东乡族自治县| 金溪县| 海伦市| 察雅县| 固阳县| 定结县| 清河县| 七台河市| 凌云县| 得荣县| 云浮市| 晋州市| 大冶市| 宜城市| 玛曲县| 眉山市| 鄂温| 南陵县| 沂水县| 枣强县| 射洪县| 晋中市|