js canvas实现五子棋小游戏


Posted in Javascript onJanuary 22, 2021

本文实例为大家分享了canvas实现五子棋小游戏的具体代码,供大家参考,具体内容如下

效果

js canvas实现五子棋小游戏

思路

  • canvans 绘制棋盘,绘制时候边缘预留棋子位置
  • 监听点击事件绘制落子并记录到字典中
  • 获胜判定,在四个方向上检测是否有足够数量的连贯棋子

js 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 相关文章推荐
javascript div 弹出可拖动窗口
Feb 26 Javascript
Js 本页面传值实现代码
May 17 Javascript
通过javascript设置css属性的代码
Dec 28 Javascript
javascript中in运算符用法分析
Apr 28 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
jQuery获取同级元素的简单代码
Jul 09 Javascript
Angularjs中controller的三种写法分享
Sep 21 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
layer.js之回调销毁对话框的例子
Sep 11 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 #Vue.js
element-ui 弹窗组件封装的步骤
Jan 22 #Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 #Javascript
原生js实现放大镜组件
Jan 22 #Javascript
Vue仿Bibibili首页的问题
Jan 21 #Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 #Vue.js
Vue看了就会的8个小技巧
Jan 21 #Vue.js
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
基于empty函数的判断详解
2013/06/17 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
使用Python生成url短链接的方法
2015/05/04 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Python绘制股票移动均线的实例
2019/08/24 Python
python 追踪except信息方式
2020/04/25 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
python中常用的数据结构介绍
2021/01/12 Python
实习销售业务员自我鉴定
2013/09/21 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
中班幼儿评语大全
2014/04/30 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
Python合并多张图片成PDF
2021/06/09 Python