canvas简单五子棋

canvas简单五子棋

    • 效果
    • 思路
      • 代码

效果

在这里插入图片描述

思路

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

代码

<!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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

viewBox视图缩放(1)

文章目录前言一、案例解析前言 svg 的viewBox 可以重新定义视口的显示范围&#xff0c;通常表现为平移&#xff0c;缩放内容&#xff0c;之前测试的一直是viewBox 和viewPort 之间的等比缩放&#xff0c;后来发现不等比情况与认知有些出入&#xff0c;如下 <svg width&quo…

sklearn svm如何选择核函数_文本挖掘篇|利用SVM进行短文本分类

何为数据挖掘&#xff0c;顾名思义就是从大量数据中挖掘或抽取出知识。在实际中&#xff0c;进行数据挖掘的数据不仅仅有数值型数据&#xff0c;还有图片型数据&#xff0c;文本型数据等。而所谓文本挖掘&#xff0c;就是从大量文本数据中&#xff0c;提取出对信息使用者有价值…

微信企业号已停止提供企业消息会话服务器,企业微信注册时显示会话服务已经被安装了怎么解决 解决攻略教程大全...

2016年4月18日&#xff0c;腾讯正式发布全平台企业办公工具“企业微信”&#xff0c;并通过腾讯应用宝独家首发安卓版。“企业微信”的推出将为企业员工提供最基础和最实用的办公服务&#xff0c;并加入贴合办公场景的特色功能、轻OA工具&#xff0c;合理化区分工作与生活&…

ftp服务器文件名存在,有什么办法根据已知文件名来检测FTP服务器上是否存在该文件? 急...

蛊毒传说我不敢说_________________using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;namespace test{ class Program { static void Main(string[] args) { string path "ftp://192.168.1.200/ser…

A* 寻路 +寻路演示(js)

效果 每个单元格内文字&#xff1a; (F) (Price) (G) (H) 原理 原理是参考另一篇csdn博文&#xff0c;不过忘记收藏找不到了 初始化 open_set和 close_set。将 起点 加入open_set中&#xff0c;并设置优先级为0&#xff08;优先级最高&#xff09;。如果open_set不为空&…

pc端无法ping android模拟器_【内附下载方式】PC端最新宝可梦 Lets Go去皮去伊模拟器+最新dlc+mod...

游戏名称&#xff1a;精灵宝可梦 Let‘s go 皮卡丘 伊布游戏总大小&#xff1a;9GB游戏简介&#xff1a;《精灵宝可梦 Lets Go 皮卡丘/伊布》是宝可梦系列全新作品&#xff0c;也是该系列首次登上Switch主机&#xff0c;为后续作品的开发奠定了基础。本作可以视为是对第一世代红…

自定义处理网页选区字符并实时显示(js)

概述 浏览网页的时候&#xff0c;可能需要去数一下某段文字的字符数量&#xff0c;或者需要对选中内容做些实时翻译&#xff0c;比如进制的转化&#xff0c;可以使用脚本做个简单的实时翻译。 效果 选中内容&#xff0c;并且鼠标移动时会在左下角显示翻译后的结果。示例为翻…

伽罗瓦域(256) 生成指定纠错码字的生成多项式 (js)

效果 使用 复制code 保存为html 涉及内容 1、有限域、伽罗瓦域(256) 2、对数反对数 3、XOR 异或 两个因式各项相乘&#xff0c;当系数项相乘时&#xff0c;指数相加并mod(255) 合并同类项时&#xff0c;相同项的系数合并为 XOR操作&#xff1b; 伽罗瓦域依旧有些犯懵&…

实现二维码-完整三种编码流程加代码解析(javascript)

效果 输入内容&#xff1a;XXXwedewed生日//&sss乐❤XXXwedewed生日//&sss乐❤ 完整的演示效果为&#xff0c;输入内容后会将解码绘制的每一步都展示&#xff08;有点长就不全截图了&#xff0c;可以直接移至最后复制代码到本地运行&#xff09;&#xff1a; 原理…

three.js 拖动场景中物体(原生|拖拽控制器)

非控制器版 拖动场景中的物体实际上是在一个平行于窗口的平面中进行拖动&#xff0c;确定这个平面并确定鼠标在该平面中的位置变化&#xff0c;就将问题转换成简单的2d移动物体了 <!DOCTYPE html> <html> <head><meta charsetutf-8><title>015-…

element-ui 可复选树型表格

效果 思路 自定义模板当点击某个行复选框时&#xff0c;其所有后代复选框都要同步状态&#xff0c;且其直系父辈状态需要根据所点击复选框的状态来修正点击全选复选框时&#xff0c;批量同步所有行内复选框状态 代码 非封装组件&#xff0c;按需自行改写 确保引入element-ui…

树形可拖拽排序配置组件

效果 使用场景 vue2下自定义表格表头配置: 列排序&#xff0c;显示/隐藏等。确保表头以配置项的形式加载&#xff0c;这样表格才能对修改后的配置作响应 思路 1、表格使用render函数加载(如有疑问可私信)&#xff0c;通过类似如下的columns配置表头 columns: [{ label: 姓名…

自适应浮动表单填充布局脚本

效果 1、适合搜素表单布局&#xff0c;查询重置等功能块始终位于最后一行的最后一列 2、适合普通多行两端对齐&#xff0c;未填充满的行左对齐 思路 此脚本目的为实现整齐风格的表单布局&#xff0c;为了达到整齐的效果&#xff0c;每个表单元素或者块都要设置一致的 宽度…

矩阵字符串配置任意合并表格布局

效果 核心 布局配置矩阵&#xff08;以下为多个模式),可以使用|或\n表示矩阵行 const gridArr [1,2,a,b 3,4,a,b 5,6,a,b ,1,2 3,4 5,6 ,1,2,3,4 3,4]任意横向或者纵向相同的字符表示一个合并块 使用 <CalcTable grid"1,2,a,b|3,4,a,b|5,6,a,b" ><span…

bsc是指什么_为什么KPI令人厌恶?中小企业不要乱用KPI!

私信小编“绩效”两字&#xff0c;免费发送60分钟薪酬绩效管理内部培训视频。导读现在很多的企业都会对员工做一些绩效考核&#xff0c;大多数还是采用KPI的方式。但是员工对KPI的考核越来越反感&#xff0c;甚至出现抵触的情况。为什么会出现这种想象呢&#xff1f;其实很简单…

解决微信小程序 [Component] slot ““ is not found.

解决方式 当使用自定义组件或者slot标签作为组件A的插槽内容时&#xff0c;在组件A中必须定义一个默认插槽&#xff0c;对普通view等标签无限制。且因为wx:if为false的插槽等同没有定义 场景复现&#xff08;仅以自己遇到情况为例&#xff09; 1、调试基础库2.19.4 2、使用w…

列表排序应用FLIP动画(vue)

效果 原理详解 链接 1.beforeUpdate 获取first 变化前位置 (以id建立map映射) 2.updated 获取变化后位置 last 3.禁用transition并transform元素回初始位置 4.异步恢复transition 并取消 transform 代码 <template><div ref"container"><div style&…

面试项目亮点_码农:面试被问到自己项目亮点时,感觉自己的回答虚伪的不行!...

据我个人观察&#xff0c;大多数程序员都对自己现有的项目有吐糟的习惯&#xff0c;比如吐糟代码逻辑混乱&#xff0c;代码规范问题&#xff0c;代码可读性差&#xff0c;代码没有注释&#xff0c;没有文档&#xff0c;代码极度冗余等等&#xff0c;总之满眼看到的都是一些缺陷…

微信小程序 仿 SwipeCell 的滑动单元格 SwipeBox

效果 代码 页面 调用Page <block wx:for"{{4}}" wx:key"{{item}}"><view style"text-align:center;padding:20px"><swipe-box><view slot"left" style"">左侧内容</view><view class&q…