<分区>
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,
visit the help center .
关闭 11 年前 。
我正在寻找一些关于使用 mysql 设计高效的基于回合的系统的指导。要求和游戏流程类似于游戏“Words with Friends”。但这里是我脑海中系统的要求:
必须存储每场战斗的历史记录,以便计算战斗统计数据。目前,这只是为了确定输赢计数。
当前战斗状态必须始终可用(应允许用户关闭应用并通过选择或推送通知继续游戏)。
必须高效并尽可能减少数据库请求。对于更大的客户群,每秒可能会有很多请求,因此请求越少越好!
一般游戏流程:
玩家选择另一名玩家进行战斗和回合超时值,然后等待确认。
确认成功后,发起玩家必须轮到他们。转弯只是意味着选择要执行的攻击/移动。
造成的伤害等由轮到玩家计算并传播到数据库。然后发送推送通知以通知其他玩家轮到他们了。
重复该过程,直到满足获胜条件(很可能是当特定玩家的健康状况达到特定水平或他们的回合超时时)。
谁能建议将其有效地合并到数据库中的方法?
游戏:
id - varchar 255(如果您的游戏很大,int 11 自动递增可能会用完)
开始日期 - 日期时间
结束日期 - 日期时间
current_user - int 11(你不太可能耗尽这么多用户)
map - int 10(取决于你有多少张 map 或者它们是否随机)
gamestate - ...这部分在很大程度上取决于您计划如何将状态发送到您的应用程序
token - varchar 50(用于验证的东西)
status - tinyint 1(或者枚举,如果你想挂起,就绪,关闭)
Action :
id - varchar 255
游戏 ID - varchar 255
user_id - 整数 11
日期时间 - 日期时间
action - tinyint 1(取决于你有多少 Action ..枚举攻击、移动、防御等)
数据 - 有关已完成操作的一些详细信息,但此数据仅用于统计,不会发送给其他用户
用户:
id - 整数 11
用户名 - varchar 50(例如)
等等...用户不是那么重要,因为 id 是我们在这里唯一关心的事情
我并没有疯狂解释每个细节,比如 unsigned、myisam vs innodb 等。基本的想法是有一个包含相关游戏数据的游戏表和一个 Action 关系表,这样你就可以处理你的统计数据或时间线等稍后。
这里的关键是游戏数据和 token ,因为它们是您在游戏之间来回传递的内容。理想情况下, 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 的数据。所以你可以序列化它,加密它,无论如何。但这就是我所说的应该在 gamestate 领域。因此,您可以使用适合需要的任何数据类型,这在游戏本身的更多信息中可能会更加明显。
您也可以查看相关选项,但在不知道游戏本身的亲密度的情况下,这个基本示例适合小型游戏。
总之,这个答案可能不是你想要的,甚至离你还差得很远。但它可能比我最初发布的要好。不过祝你游戏好运。制作游戏有很多乐趣,现在绝对是为 ios 和 android 制作游戏的时候了。