【全球热闻】五子棋 - JavaScript 实现 - 两人对战
#头条创作挑战赛#
(相关资料图)
banner
这是一个关于五子棋实现的系列文,本文是第 1篇。总共会分成两篇文章:
五子棋 - JavaScript 实现 - 两人对战 : 讲解如何实现两人对战,当然你可以自己跟自己玩五子棋 - JavaScript 实现 - 人机对战 : 讲解如何实现人机对战,着重人机输赢算法功能概览
棋盘大小自定义白棋先下不支持悔棋提示当前下棋方(黑子 | 白子)输赢判断代码即文档,读者可在体验地址章节进入 码上掘金大屏跟读代码,相信读者能有所收获。
讲解
我们制定简单的五子棋规则:在五子棋中,双方各执一个颜色的棋子,空盘开局,交替落子且每次只能落子一枚。如果同种颜色的棋子在横向、竖向或者斜线上有连续五个子,则该颜色棋子的一方获胜。
获胜的情况
胜利的情况有如下四种:
横向情况 - 此时黑子获胜竖向情况 - 此时白子获胜左斜线情况 - 此时白子获胜右斜线情况 - 此时黑子获胜否则,黑白双方打成平手(即平局)。
项目的难点
1. 将 canvas上绘制的棋盘和矩阵一一对应
体验下代码你就明白了:
// 监听鼠标点击棋盘的位置listenDownChessman() { this.checkerboardDom.onclick = event => { let { offsetX: x, offsetY: y } = event; const { width, height } = this.lattice; x = Math.round((x - 15) / width); y = Math.round((y - 15) / height); if(this.checkerboardMatrix[x][y] !== undefined && Object.is(this.checkerboardMatrix[x][y], 0)) { this.checkerboardMatrix[x][y] = this.role; // 刻画棋子 this.drawChessman({ x, y }, Object.is(this.role, EnumRoles.BLACK)); this.role = Object.is(this.role, EnumRoles.BLACK) ? EnumRoles.WHITE : EnumRoles.BLACK; // 设置当前执棋 if(!this.win) { // 游戏中 this.setCurrentRole(); } else { // 游戏结束 Object.is(this.role, EnumRoles.BLACK) ? this.currentRoleDom.setAttribute("class", "chessman win-white") : this.currentRoleDom.setAttribute("class", "chessman win-black") this.message = "赢得本场胜利" this.setResultMsgHint(); } } }}复制代码
我们需要获取 canvas上相对原点(左上角)的偏移值,计算出在矩阵上对应的位置。然后判断该位置是否已经落子,如果没有落子,则进行棋子的绘制。
2. 判断输赢
在上面获胜情况中我们已经了解。下面我们看看代码实现:
/** @method gameReferee 游戏裁判* @param coordinate 坐标 (x, y)* @paran role 角色*/gameReferee(coordinate, role) { const { x, y } = coordinate; if( x === undefined || y === undefined || role === undefined) return; // 连杀的次数 let countContinuous = 0; // x 轴的情况 const XContinuous = this.checkerboardMatrix.map(x => x[y]); // y 轴的情况 const YContinuous = this.checkerboardMatrix[x]; const S1Continuous = []; const S2Continuous = []; this.checkerboardMatrix.forEach((_x,i) => { // 左斜线 const S1Item = _x[y - (x - i)]; if(S1Item !== undefined){ S1Continuous.push(S1Item); } // 右斜线 const S2Item = _x[y + (x - i)]; if(S2Item !== undefined) { S2Continuous.push(S2Item); } }); // 当前落棋点所在的X轴/Y轴/交叉斜轴,只要有能连起来的5个子的角色即有胜者 [XContinuous, YContinuous, S1Continuous, S2Continuous].forEach(axis => { if(axis.some((x, i) => axis[i] !== 0 && axis[i - 2] === axis[i - 1] && axis[i - 1] === axis[i] && axis[i] === axis[i + 1] && axis[i + 1] === axis[i + 2])) { countContinuous++ } }); if(countContinuous) { this.win = true; this.checkerboardDom.onclick = null; // 游戏结束,不允许点击 }}复制代码
上面代码的注释已经讲解得很清楚了。简单来说,我们就是将二维数组分成四种情况处理,将其形成四个一维数组,再对四个一维数组进行判断,如果它们中有连续 5个相同的数值,则可判定输赢。
比如,在 15 * 15的棋盘中,某次落棋后,可得:
XContinuous = [0, 1, 2, 2, 2, 2, 2, 0, 2, 1, 0, 1, 1, 0, 0]复制代码
这里 XContinuous横轴中就有连续五个白子,则白方获胜。
体验地址:五子棋 - 双人模式/人机模式 - JavaScript 实现 - 码上掘金五子棋 - 双人模式/人机模式 - JavaScript 实现 - 码上掘金
赠人玫瑰,手留花香。俺不要玫瑰,只要读者的一个举手之劳的赞~逃:)
关键词: JavaScript Windows 胜利退出演艺圈
推荐阅读
菜籽出油率多少?菜籽出油率高不高?
菜籽出油率多少?很多国家都有菜籽,成片的菜籽,美国农场主也不例外。一般来说,榨菜籽的出油率约为32%-36%。有些地区正常达到38%左右,主 【详细】
蓝太阳什么时候出现过 蓝太阳是怎么形成的?
平常晴天的时候都是可以看见太阳的,不过我们也知道平时看到的太阳是黄色的发光发亮的球体,不过今日北京出现蓝太阳,蓝太阳是什么意思?蓝 【详细】
低碳环保节能产业是什么概念 为什么环保受到大家的重视?
低碳环保节能产业,是什么概念,怎么理解?节能环保产业是指为节约能源资源、发展循环经济和保护生态环境提供物质基础和技术支持的产业,是 【详细】
dwg文件是什么 dwg文件用什么打开?
相信很多人都不知道dwg文件用什么打开?,接下来小编就带大家介绍一些方法,大家可以了解一下。一、看图纸参见图纸DwgSeePlus是一个dwg文件 【详细】
工业革命是什么 工业革命的影响有哪些?
工业革命的影响有哪些?三次工业革命分别是什么时间?影响1、工业革命引起了生产组织形式的变化,用机器工厂制代替手工作坊。影响2 工业革命 【详细】
相关新闻
- 【全球热闻】五子棋 - JavaScript 实现 - 两人对战
- 快报:终于有准信了!小米10及青春版、红米K30和至尊版 4月更新MIUI14
- 关注:Web3日报 0204
- 环球简讯:iOS 16.1.2 自定义运营商名称,重启仍然有效
- 国内智能手机2022年出货量创10年来新低,vivo成为全年出货冠军
- 每日速递:全渠客丨外贸跨境电商丨外贸小白进阶必备
- Win10系统正式停售!微软:直接全屏提醒升级Win11 焦点快看
- 最便宜骁龙8 Gen2手机再降价,2699就可以抱回家,买不买?
- 漫威超级英雄实力排名_漫威实力排行
- 【焦点热闻】友宝再闯港交所,无人零售“全村的希望”
- 2023年2月5日IOS的AppStore软件限免6个APP推荐
- 最新消息:#ChatGPT#ChatGTP是什么?未来能否替代人类?他先跟谁抢工作?
- 世界速讯:爸爸偷偷看的小姐姐视频,Python自动下载,一次看个够吧!
- 战斗机器人来了,俄首批战斗机器人投入俄乌战争,打击美德的坦克|热门看点
- 借款人自述:为什么微信支付宝被冻结了,自己才知道被仲裁了呢?|独家焦点
- 比亚迪刚下水,吉利、小鹏就要上天! 全球热讯
- Pro版也将拉开差距?曝iPhone 16 Ultra有独占功能,为啥这样做? 全球今日讯
- 点播看不了怎么办_手机快播完美解决该网站不可点播的方法 环球资讯
- 6个不为人知的黑科技网站,我可以玩一整天
- iPhone14Pro将全系降价700元,覆盖所有授权门店