ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何把鼠标点击变成合法走棋:HTML5中国象棋坐标系映射与点击事件详解

如何把鼠标点击变成合法走棋:HTML5中国象棋坐标系映射与点击事件详解 如何把鼠标点击变成合法走棋HTML5中国象棋坐标系映射与点击事件详解【免费下载链接】Chess中国象棋 - in html5项目地址: https://gitcode.com/gh_mirrors/che/Chess本项目「中国象棋 - in html5」是一款用 HTML5 Canvas 实现的开源中国象棋游戏不依赖任何类库和后台。它最巧妙的地方在于把一次普通的鼠标点击精确换算成棋盘上的行列坐标再校验出子是否合法。本文带你用坐标系映射与点击事件这两个核心机制完整拆解点一下到落一子的链路零框架、纯原生 JavaScript新手也能看懂 。一、先看懂棋盘9 列 × 10 行的网格坐标整个棋盘在代码里就是一张二维数组共10 行 × 9 列每个格子存放一个棋子键名坐标取值范围说明x列0 ~ 8从左到右y行0 ~ 9从上到下黑方大写键C0、M0…占据上方 0~2 行红方小写键c0、j0…占据下方 7~9 行每个棋子都是一个对象身上挂着自己的x、y初始布局就定义在 com.initMap 中例如c0是红方左车、j0是红方老将棋子类Man负责把自己画到画布的正确位置com.class.Man。 记住这个映射关系棋盘是数据画布只是渲染。后面所有点击判断都只和数据里的行列号打交道。二、三套皮肤共用一张换算表spaceX / spaceY / pointStart项目在 com.stype 中定义了三套皮肤stype1 / stype2 / stype3它们画布大小、格子间距都不同皮肤画布宽×高spaceX列间距spaceY行间距第一着点偏移 (x, y)stype1325 × 4023536(5, 19)stype2523 × 5805757(3, 5)stype3530 × 5675757(-2, 0)由此得到一对互逆公式这就是坐标系映射的核心渲染网格 → 像素像素 间距 × 格子坐标 第一着点偏移见 Man.show 的 drawImage点击像素 → 网格格子 round((鼠标坐标 − 画布偏移 − 第一着点偏移 − 20) ÷ 间距)见 play.getClickPoint。妙处在于换皮肤时只改这张参数表画法和点击逻辑一行都不用动——这也是皮肤可切换功能 更换皮肤 能这么简单实现的原因。三、点击事件全流程从像素到着点四步走入口只有一行绑定canvas.addEventListener(click, play.clickCanvas)。之后play.clickCanvas按四步处理定义在 js/play.js第 1 步像素 → 网格坐标。getClickPoint 先用 com.getDomXY 沿offsetParent累加算出画布在整页中的左上角位置再把鼠标pageX/pageY减去偏移、除以间距并四舍五入得到一个{x, y}格子坐标。第 2 步判断点到了什么。getClickMan 用play.map[y][x]反查棋盘落在自己的棋子上 → 走选中流程落在对方棋子上 → 尝试吃子落在空点→ 走落子流程。第 3 步选中棋子算出合法着点。选中己方棋子后会调用该棋子的走法规则com.bylaw中的车/马/相/士/将/炮/卒七套函数见 js/common.js一次性算出所有能走到的着点ps并用小圆点Dot 类画在画布上同时播放选中音效 audio/select.wav。第 4 步合法性校验这是合法走棋的关卡。clickPoint 用indexOfPs检查你点的[x, y]是否在着点列表里✅ 在列表内 → 更新棋盘数组、把这步记入play.pace悔棋的依据、播放 audio/click.wav并setTimeout(play.AIPlay, 500)让 AI 应答❌ 不在列表内 →什么都不发生点击被静默忽略。吃子路径 clickMan 同理只有当敌子坐标在合法着点中才真正落子若吃的是老将j0/J0立即触发 showWin 判定胜负。四、两个容错细节为什么点偏一点也能走子Math.round四舍五入 免费容差。只要点击落在交叉点 ±半个格子内stype2 下约 ±28 像素就会被归入该格人手抖动也不怕固定的-20像素补偿。棋子图片宽 38 像素且从左上角绘制点击换算时减去 20约半个棋子图正好对准交叉点中心边界保护。getClickMan 中x 0 || x 8 || y 0 || y 9直接返回false棋盘外部的点击不会越界崩溃。五、动手验证三步把坐标系跑起来1️⃣ 获取代码git clone https://gitcode.com/gh_mirrors/che/Chess2️⃣ 打开即玩。纯静态页面无需服务器浏览器直接打开 index.html 即可对弈棋盘画布与按钮布局见 chessBox。3️⃣ 做个小实验。在浏览器控制台给play.getClickPoint加一行console.log点几下棋盘观察像素坐标如何变成{x: 4, y: 8}这样的网格坐标再试着修改 com.stype 中的spaceX即可亲眼看到映射错位的效果。延伸阅读 AI 走棋逻辑在 js/AI.js历史表数据在 js/gambit.js挑战棋局在 js/clasli.js页面样式在 css/chess.css。六、小结一条链路串起点击 → 合法走棋数据层10×9 二维数组 棋子键名棋盘即数据com.initMap映射层间距 × 坐标 偏移一对互逆公式渲染与点击共用同一张参数表事件层像素 → 网格 → 反查棋子 → 着点校验四步过滤出唯一合法的落子。理解这套坐标系映射与点击事件后你完全可以照着把它移植到五子棋、围棋等任何网格类 HTML5 棋盘游戏中。【免费下载链接】Chess中国象棋 - in html5项目地址: https://gitcode.com/gh_mirrors/che/Chess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表