我正在寻找有关使用mysql设计高效回合制系统的一些指导。要求和游戏流程类似于游戏" Words with Friends"。但是这个系统的要求不在我的头顶:
必须存储每场战斗的历史记录,以便计算战斗统计数据。目前,这只是用于确定赢/输计数。
当前的战斗状态必须始终可用(应允许用户关闭应用并通过选择或推送通知继续播放)。
必须高效且拥有尽可能少的数据库请求。可能每秒会有很多请求,客户群越大,请求越少越好!
一般游戏流程:
有人可以建议将这种方法有效地纳入数据库吗?
答案 0 :(得分:2)
游戏:
id - varchar 255(如果您的游戏很大,则int 11自动增量可能会耗尽)
start_date - 日期时间
end_date - datetime
current_user - int 11(不太可能会耗尽这么多用户)
map - int 10(取决于你有多少张地图或者它们是否是随机的)
gamestate - ...这部分很大程度上取决于你计划如何将状态发送到你的应用程序
token - varchar 50(要进行身份验证的内容)
status - tinyint 1(如果你想要挂起,准备好,关闭,则为enum)
动作:
id - varchar 255
game_id - varchar 255
user_id - int 11
datetime - datetime
动作 - tinyint 1(取决于你有多少动作......枚举攻击,移动,防守等)
数据 - 有关已完成内容的一些详细信息,但此数据仅用于统计信息,而不是发送给其他用户
用户:
id - int 11
username - varchar 50(例如)
等等...用户不那么重要,因为id是我们唯一关心的事情
我没有疯狂地解释每个细节,如unsigned,myisam vs innodb等。基本的想法是在游戏桌中包含相关的游戏数据和动作关系表,以便您可以处理您的统计数据或时间表等后面。
这里的关键是gamedata和token,因为那些是你在游戏之间来回传递的东西。理想情况下,令牌是在每个游戏中唯一的应用程序中进行比较的哈希值,因此用户不能仅使用浏览器或其他内容并将更新发布到游戏中。这背后还有一个完整的其他哲学,现在可能并不重要。
所以gamedata可能是一个序列化的数组,文本,blob等。它取决于你传递了多少数据,以及采用何种格式。所以一个反序列化的反应可能就像
[0] => [ // player 1
[0] => [ // army position and status
[0] => '2,2,98,1', //x, y, health, mode (1 => defense, 2 => offense, etc)
[1] => '120,10,45,2', // could also break down into another array layer
[3] => '222,155,100,1'
],
[1] => [ // bases
[0] => '130,45,34', //x, y, health
[1] => '356,25,10'
],
[2] => [ // game data
[0] => '12245' // money
[1] => '41324131232' // timestamp of when last turn began
[2] => 0 // bool whether or not they are up at bat
]
]
这只是玩家1的数据。所以你可以序列化它,加密它,无论如何。但这就是我所说的应该在游戏状态领域。因此,您将使用适合需要的任何数据类型,这可能会更明显,有关游戏本身的更多信息。
你也可以研究关系选项,但不知道游戏本身的亲密关系,这个基本的样本适合小游戏。
无论如何,这个答案可能不是你想要的,甚至是远程关闭。但它可能比我最初发布的更好。祝你的比赛好运。制作游戏的乐趣很多,现在绝对是为ios和android做的时候了。