[教你做小游戏] 用 177 行代码写个体验超好的五子棋
我是 HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者 HullQin 授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加 Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。
1. 需求描述
支持本地双人对战的五子棋游戏。
对于刚下的一步棋,要有标记。
要有提示:五联珠后提示谁赢了。
支持重新开局。
适配多种分辨率的屏幕。
面对这样一个五子棋游戏的需求,你会怎么做呢?
2. 技术选型
参考掘金文章《H5 小游戏技术选型分析,低代码?小游戏框架?canvas 或 SVG?还能用 React?》,我们利用文章的决策树进行技术选型:
我们不需要借助现有的游戏模板。
我们不需要素材管理、不涉及物理引擎。
我们不需要动画、不需要每帧渲染。
结论:手撸五子棋。
此外,因为要适配不同的分辨率,所以我们采用 SVG 绘制棋盘和棋子,不用 canvas。
3. 绘制棋盘
背景
棋盘背景选个木头的棕色。
15*15 的线条
我们先通过path
绘制 15 条横线、15 条竖线,每个格子设置为 10 的宽度,那么就是从-70 绘制到 70。
此外,我们还需要适配多种分辨率,参考《2 行代码,让你的 UI 适配移动端、PC 端,快来收藏》,只需 2 行代码!
5 个标记点
五子棋棋盘通常有 5 个标记点,我们再通过rect
画 5 个黑色的矩形。因为可以复用,所以我们采用defs
定义,这样以后可以通过use
来复用。使用defs
就好比我们封装了个可复用的标记组件。
目前,效果如图:
4. 提示功能
为了实现提示,我们参考 antd 的Message
,可以写出这个功能:
调用Message('游戏结束,黑棋胜利!')
的效果如下:
5. 绘制棋子
封装棋子组件
棋子也是组件,这里给出defs
定义。
定义了 2 种渐变色,分别用于填充棋子。棋子就是简单的circle
圆形,半径 4.2,直径就是 8.4。
绘制新下棋子的标记
渲染所有棋子
未下的棋子,设置为透明。一次性把 15*15 个棋子都提前渲染好。
顺便添加了 hover 事件:
鼠标进入时,如果位置当前可以下棋,变成半透明。
鼠标离开时,如果位置当前可以下棋,变成全透明。
顺便添加了点击事件:
如果位置当前可以下棋,那么就把这个棋子变成黑色或白色。
下棋后,如果游戏没结束,当前就该另一方下棋。否则,提示游戏结束。
这里需要给出game
定义:
下棋函数
设置了最新下棋点的标记;并把对应位置的棋子设置为不透明。
6. 判断是否胜利
只需要判断最新下的棋子,是否有五联珠,就知道是否胜利了。
参考文章《《五子棋》怎么判断输赢?你能 5 分钟交出代码吗?》,这里不罗列代码啦。
7. 重新开局功能
弄一个按钮,点它后重置游戏数据即可:
所有棋子变透明。
隐藏最新棋子的标记。
重置
game
变量。
8. 码上掘金
9. 写在最后
我是 HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者 HullQin 授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加 Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。
版权声明: 本文为 InfoQ 作者【HullQin】的原创文章。
原文链接:【http://xie.infoq.cn/article/ea9f5fe66c8e7c4335e82e74e】。文章转载请联系作者。
评论