[教你做小游戏] 《五子棋》怎么存棋局信息?
如果让你做个联机《五子棋》游戏,你会怎么存储棋盘上的棋子信息呢?
我的意思是,根据你存储的这些信息,就可以知道:
谁是黑棋?谁是白棋?现在游戏结束了吗?若游戏结束,谁赢了?若没结束,现在该谁下棋了?如果游戏支持悔棋,现在有人在请求悔棋吗?是谁在请求?如果游戏支持认输,重新审视是否满足第2点。当前场上棋子的分布。请你自己先思考一下,再看下文的解决方案。
2. 解决方案2.1 谁黑谁白
两个方案都是可以的,只是需要看实际场景。如果你只想做个简单的五子棋,用方案二就够了。如果考虑扩展性,推荐方案一。
2.2 游戏结束了吗?谁赢了?该谁下棋了?两个方案都是可以的,只是需要看实际场景。如果你只想做个简单的五子棋,用方案二就够了。如果考虑扩展性,推荐方案一。
2.3 悔棋悔棋有2种形态:
请求悔棋后,无需对方确认,直接悔棋。请求悔棋后,需要对方同意,才能悔棋成功。第一种形态比较简单,悔棋后,直接更新游戏数据即可。
第二种形态,可以通过2.2的方案一来实现。游戏状态如下:
等黑下棋等白下棋黑胜利白胜利黑请求悔棋白请求悔棋2.4 认输认输和悔棋不同,认输是单方面提出认输,游戏即可结束,宣布另一方的胜利。
可以通过2.2的方案一来实现,游戏状态同2.3即可实现认输功能。
2.5 状态机下面,看看这些状态的转换关系:
图中没把「认输」动作画出来,因为「认输」比较简单,从其它四个状态分别拉2个线,指向「黑胜利」和「白胜利」,表示「白认输」和「黑认输」即可。
2.6 场上棋子分布注:五子棋棋盘通常是15X15的布局,也有AI对战中,使用更大的棋盘,例如20X20。这里我们以15X15的棋盘来分析。
场上小于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 噢~我有空了会分享做游戏的相关技术。
版权声明
本文仅代表作者观点,不代表博信信息网立场。