亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在JavaScript中利用canvas制作一個五子棋小游戲

發布時間:2021-01-22 14:24:08 來源:億速云 閱讀:166 作者:Leah 欄目:開發技術

如何在JavaScript中利用canvas制作一個五子棋小游戲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

思路

  • canvans 繪制棋盤,繪制時候邊緣預留棋子位置

  • 監聽點擊事件繪制落子并記錄到字典中

  • 獲勝判定,在四個方向上檢測是否有足夠數量的連貫棋子

如何在JavaScript中利用canvas制作一個五子棋小游戲

代碼

<!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) 點擊落子并切換執子者
   * 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);

    //初始化落子位置使用字典存儲,相較于數組簡單且減少內存占用
    let pieces = {};
    //循環劃線
    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;//切換執子者
      context.fill();
      context.stroke();
      context.closePath();

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

      //米字型計算結果,以當前落子位置計算是否存在某個方向上具有連續的五個相同棋子
      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>

關于如何在JavaScript中利用canvas制作一個五子棋小游戲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林芝县| 府谷县| 邵阳市| 石首市| 石泉县| 高安市| 蕉岭县| 海盐县| 满城县| 龙里县| 海丰县| 盖州市| 湾仔区| 余姚市| 疏附县| 惠来县| 游戏| 通榆县| 四平市| 溆浦县| 夏河县| 山西省| 宁远县| 常德市| 临颍县| 鹿邑县| 汶上县| 南乐县| 长春市| 武强县| 西畴县| 潮州市| 朝阳县| 平凉市| 天门市| 临漳县| 沽源县| 九寨沟县| 建瓯市| 维西| 虹口区|