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自定义排序 node运行 实例
Jun 05 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
May 05 Javascript
js+canvas简单绘制圆圈的方法
Jan 28 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
JavaScript实现创建自定义对象的常用方式总结
Jul 09 Javascript
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
浅谈Vue render函数在ElementUi中的应用
Sep 06 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 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
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
AngularJS实现全选反选功能
2015/12/08 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python实现的科学计算器功能示例
2017/08/04 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
大三毕业自我鉴定
2014/01/15 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
中药专业自荐信范文
2014/03/18 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
批评与自我批评总结
2014/10/17 职场文书
优秀高中学生评语
2014/12/30 职场文书
三行辞职书范文
2015/02/26 职场文书
雷锋的观后感
2015/06/10 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
python文件与路径操作神器 pathlib
2022/04/01 Python
德劲DE1105机评
2022/04/05 无线电