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从头学起第二讲
Jul 04 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
JavaScript中校验银行卡号的实现代码
Dec 19 Javascript
原生Javascript插件开发实践
Jan 09 Javascript
从零开始做一个pagination分页组件
Mar 15 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
Oct 19 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
jQuery动态操作表单示例【基于table表格】
Dec 06 jQuery
Layui 动态禁止select下拉的例子
Sep 03 Javascript
Node使用Selenium进行前端自动化操作的代码实现
Oct 10 Javascript
js实现时间日期校验
May 26 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
php中实现简单的ACL 完结篇
2011/09/07 PHP
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
简述JS控制台的使用
2018/07/15 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
Python实现多线程下载文件的代码实例
2014/06/01 Python
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
python中的随机函数random的用法示例
2018/01/27 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Python更换pip源方法过程解析
2020/05/19 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
简单叙述一下MYSQL的优化
2016/05/09 面试题
棉花姑娘教学反思
2014/02/15 职场文书
推荐信模板
2014/05/09 职场文书
文明城市创建标语
2014/06/16 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
山楂树之恋观后感
2015/06/11 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python