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 相关文章推荐
文本框的字数限制功能jquery插件
Nov 24 Javascript
jquery 页面滚动到底部自动加载插件集合
Jan 31 Javascript
JavaScript父子窗体间的调用方法
Mar 31 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
详解JS去重及字符串奇数位小写转大写
Dec 29 Javascript
js实现简单的手风琴效果
Feb 27 Javascript
微信小程序之GET请求的实例详解
Sep 29 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
Jan 18 jQuery
JavaScript+H5实现微信摇一摇功能
May 23 Javascript
VSCode使用之Vue工程配置eslint
Apr 30 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 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
smarty基础之拼接字符串的详解
2013/06/18 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
pycharm创建一个python包方法图解
2019/04/10 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
如何在Django项目中引入静态文件
2019/07/26 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
如何给Python代码进行加密
2020/01/10 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
设计顾问服务计划书
2014/05/04 职场文书
奥林匹克的口号
2014/06/13 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
大学生实习证明
2015/06/16 职场文书
医者仁心观后感
2015/06/17 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android