共计 2072 个字符,预计需要花费 6 分钟才能阅读完成。
我是 HullQin,公众号 线下团聚游戏 的作者(欢送关注公众号,发送加微信,交个敌人),转发本文前需取得作者 HullQin 受权。我独立开发了《联机桌游合集》,是个网页,能够很不便的跟敌人联机玩斗地主、五子棋等游戏,不免费没广告。还开发了《Dice Crush》加入 Game Jam 2022。喜爱能够关注我 HullQin 噢~我有空了会分享做游戏的相干技术。
1. 问题形容
如果让你做个联机《五子棋》游戏,你会怎么存储棋盘上的棋子信息呢?
我的意思是,依据你存储的这些信息,就能够晓得:
- 谁是黑棋?谁是白棋?
- 当初游戏完结了吗?若游戏完结,谁赢了?若没完结,当初该谁下棋了?
- 如果游戏反对悔棋,当初有人在申请悔棋吗?是谁在申请?
- 如果游戏反对认输,从新扫视是否满足第 2 点。
- 以后场上棋子的散布。
请你本人先思考一下,再看下文的解决方案。
2. 解决方案
2.1 谁黑谁白
长处 | 毛病 | 适用范围 | |
---|---|---|---|
计划一:用 1 个变量标识你是哪个玩家;再用 1 个变量标识哪个玩家是黑棋。 | 有玩家号码标识,可扩展性好 | 游戏其它性能须要跟玩家编号有关联时可用该计划。 | |
计划二:用 1 个变量标识你是黑棋或白棋。 | 只须要 1 位 (bit) 即可 | 因为玩家没有固定的玩家号码,所以可扩展性较差 | 不做扩大性能,只做最简洁的联机五子棋时可用该计划。 |
两个计划都是能够的,只是须要看理论场景。如果你只想做个简略的五子棋,用计划二就够了。如果思考扩展性,举荐计划一。
2.2 游戏完结了吗?谁赢了?该谁下棋了?
长处 | 毛病 | 适用范围 | |
---|---|---|---|
计划一:用 1 个变量标识游戏状态。黑赢、黑输、该玩家 1 下棋、该玩家 2 下棋等都是一种状态。 | 少了运算过程,快了几十毫秒。游戏状态的可扩展性好,能够新增状态(例如认输、悔棋等) | 游戏会有多种状态时可用该计划。 | |
计划二:只记录场上棋子的散布状况,通过计算是否有 5 连珠,判断谁输谁赢。 | 占用空间少 | 若要反对认输,只能回到计划一。 | 不做认输性能,只做最简洁的联机五子棋时可用该计划。 |
两个计划都是能够的,只是须要看理论场景。如果你只想做个简略的五子棋,用计划二就够了。如果思考扩展性,举荐计划一。
2.3 悔棋
悔棋有 2 种状态:
- 申请悔棋后,无需对方确认,间接悔棋。
- 申请悔棋后,须要对方批准,能力悔棋胜利。
第一种状态比较简单,悔棋后,间接更新游戏数据即可。
第二种状态,能够通过 2.2 的计划一来实现。游戏状态如下:
- 等黑下棋
- 等白下棋
- 黑胜利
- 白胜利
- 黑申请悔棋
- 白申请悔棋
2.4 认输
认输和悔棋不同,认输是单方面提出认输,游戏即可完结,发表另一方的胜利。
能够通过 2.2 的计划一来实现,游戏状态同 2.3 即可实现认输性能。
2.5 状态机
上面,看看这些状态的转换关系:
图中没把「认输」动作画进去,因为「认输」比较简单,从其它四个状态别离拉 2 个线,指向「黑胜利」和「白胜利」,示意「白认输」和「黑认输」即可。
2.6 场上棋子散布
注:五子棋棋盘通常是 15X15 的布局,也有 AI 对战中,应用更大的棋盘,例如 20X20。这里咱们以 15X15 的棋盘来剖析。
长处 | 毛病 | 适用范围 | |
---|---|---|---|
计划一:用一个列表存储已落的棋子,列表程序表明棋子程序,列表每一项的值代表棋子的地位,值为 0 -224(刚好 225 个值),奇数地位是黑棋,偶数地位是白棋。 | 针对棋子少的棋局,存储空间小于计划二;保留了地位信息,便于悔棋、复盘等。 | 每个棋子须要 8bit 存储,空间利用率约 225/256=88%,并没有充分利用 | 大多数场景。 |
计划二:应用长度为 225 的列表,值为 0 或 1 或 2,别离示意该地位没棋、黑棋、白棋。 | 针对任意棋子散布,占用空间是固定的。若用 3 进制,只需 225bit,转换为 2 进制,只须要 log_2(3^225)=357 位 | 如果想记录程序信息,须要额定空间。 | 你用这个棋盘画画的时候,棋子往往很多,且不须要保留程序信息,可用该计划。 |
场上小于 357/8=45 枚棋子时,计划一占空间更小,否则计划二空间更小。
如果是联机《五子棋》游戏,举荐计划一,毕竟程序信息还是很有用的。而存储空间大一点也是没关系的,影响可忽略不计。
另外补充一句,棋子地位信息存储时能够间接用 0 -224,然而本义给人类时,倡议间接转换为 15 进制,这样它的十位就能够是行信息,个位就能够是列信息。
- 例如 224=
ee
,表明第 e(15)行第 e(15)列; - 例如 0 =
00
,表明第 0 行第 0 列; - 例如 10=
0a
,表明第 0 行,第 a(10)列。
3. 写在最初
这些货色,你不去本人开发《五子棋》,可能不会去思考。然而当你做的时候,会发现,十分好玩儿,实现计划很多,你要选出最适宜你的那一个。
其中,我做了「分享棋局」的性能,正是采纳了十五进制,将棋子信息存在 URL 中,使之具备一点点可读性。参考文章:《我做的《联机五子棋》是如何谋求极致用户体验的?(下)》
我是 HullQin,公众号 线下团聚游戏 的作者(欢送关注公众号,发送加微信,交个敌人),转发本文前需取得作者 HullQin 受权。我独立开发了《联机桌游合集》,是个网页,能够很不便的跟敌人联机玩斗地主、五子棋等游戏,不免费没广告。还开发了《Dice Crush》加入 Game Jam 2022。喜爱能够关注我 HullQin 噢~我有空了会分享做游戏的相干技术。