关于前端:教你做小游戏-五子棋怎么存棋局信息

4次阅读

共计 2072 个字符,预计需要花费 6 分钟才能阅读完成。

我是 HullQin,公众号 线下团聚游戏 的作者(欢送关注公众号,发送加微信,交个敌人),转发本文前需取得作者 HullQin 受权。我独立开发了《联机桌游合集》,是个网页,能够很不便的跟敌人联机玩斗地主、五子棋等游戏,不免费没广告。还开发了《Dice Crush》加入 Game Jam 2022。喜爱能够关注我 HullQin 噢~我有空了会分享做游戏的相干技术。

1. 问题形容

如果让你做个联机《五子棋》游戏,你会怎么存储棋盘上的棋子信息呢?

我的意思是,依据你存储的这些信息,就能够晓得:

  1. 谁是黑棋?谁是白棋?
  2. 当初游戏完结了吗?若游戏完结,谁赢了?若没完结,当初该谁下棋了?
  3. 如果游戏反对悔棋,当初有人在申请悔棋吗?是谁在申请?
  4. 如果游戏反对认输,从新扫视是否满足第 2 点。
  5. 以后场上棋子的散布。

请你本人先思考一下,再看下文的解决方案。

2. 解决方案

2.1 谁黑谁白

长处 毛病 适用范围
计划一:用 1 个变量标识你是哪个玩家;再用 1 个变量标识哪个玩家是黑棋。 有玩家号码标识,可扩展性好 游戏其它性能须要跟玩家编号有关联时可用该计划。
计划二:用 1 个变量标识你是黑棋或白棋。 只须要 1 位 (bit) 即可 因为玩家没有固定的玩家号码,所以可扩展性较差 不做扩大性能,只做最简洁的联机五子棋时可用该计划。

两个计划都是能够的,只是须要看理论场景。如果你只想做个简略的五子棋,用计划二就够了。如果思考扩展性,举荐计划一。

2.2 游戏完结了吗?谁赢了?该谁下棋了?

长处 毛病 适用范围
计划一:用 1 个变量标识游戏状态。黑赢、黑输、该玩家 1 下棋、该玩家 2 下棋等都是一种状态。 少了运算过程,快了几十毫秒。游戏状态的可扩展性好,能够新增状态(例如认输、悔棋等) 游戏会有多种状态时可用该计划。
计划二:只记录场上棋子的散布状况,通过计算是否有 5 连珠,判断谁输谁赢。 占用空间少 若要反对认输,只能回到计划一。 不做认输性能,只做最简洁的联机五子棋时可用该计划。

两个计划都是能够的,只是须要看理论场景。如果你只想做个简略的五子棋,用计划二就够了。如果思考扩展性,举荐计划一。

2.3 悔棋

悔棋有 2 种状态:

  1. 申请悔棋后,无需对方确认,间接悔棋。
  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 噢~我有空了会分享做游戏的相干技术。

正文完
 0