Mysql 回合制游戏数据库设计

Mysql 回合制游戏数据库设计,mysql,ios,database,Mysql,Ios,Database,我正在寻找一些关于使用mysql设计一个高效的基于回合的系统的指导。要求和游戏流程将类似于游戏“与朋友的话”。但以下是我头脑中对系统的要求: 必须存储每次战斗的历史,以便计算战斗统计数据。目前,这只是为了确定胜负 当前的战斗状态必须始终可用(应允许用户通过选择或推送通知关闭应用程序并恢复游戏) 必须高效,并尽可能减少数据库请求。在更大的客户端基础上,每秒可能有许多请求,因此请求越少越好 一般游戏流程: 玩家选择另一个玩家和回合超时值进行战斗,然后等待确认 确认成功后,发起玩家必须轮到他们。转

我正在寻找一些关于使用mysql设计一个高效的基于回合的系统的指导。要求和游戏流程将类似于游戏“与朋友的话”。但以下是我头脑中对系统的要求:

  • 必须存储每次战斗的历史,以便计算战斗统计数据。目前,这只是为了确定胜负

  • 当前的战斗状态必须始终可用(应允许用户通过选择或推送通知关闭应用程序并恢复游戏)

  • 必须高效,并尽可能减少数据库请求。在更大的客户端基础上,每秒可能有许多请求,因此请求越少越好

一般游戏流程:

  • 玩家选择另一个玩家和回合超时值进行战斗,然后等待确认
  • 确认成功后,发起玩家必须轮到他们。转身仅仅意味着选择攻击/移动
  • 所造成的伤害由玩家轮流计算并传播到数据库。然后发送推送通知,通知其他玩家轮到他们了
  • 这个过程一直重复,直到满足获胜条件为止(最有可能的情况是当某个特定玩家的健康水平达到某个水平或者他们的回合结束时)
  • 有人能建议如何将其有效地整合到数据库中吗?

    游戏:

    id-varchar 255(如果游戏规模很大,int 11自动增量可能会耗尽)
    开始日期-日期时间
    结束日期-日期时间
    当前用户-int 11(不太可能耗尽这么多用户)
    map-int 10(取决于您有多少个贴图或它们是否是随机的)
    配子状态-。。。这一部分很大程度上取决于您计划如何将状态发送到应用程序
    令牌-varchar 50(要进行身份验证的对象)
    状态-tinyint 1(如果要挂起、准备就绪、关闭,请使用枚举)

    行动:

    id-varchar 255
    游戏id-varchar 255
    用户id-int 11
    日期时间-日期时间
    动作-tinyint 1(取决于你有多少动作..枚举攻击、移动、防御等)
    数据-关于所做工作的一些细节,但这些数据仅用于统计数据,不发送给其他用户

    用户:

    id-int 11
    用户名-varchar 50(例如)
    等用户并不那么重要,因为id是我们唯一关心的事情

    我并没有疯狂地解释每一个细节,比如unsigned、myisam和innodb等。基本的想法是有一个包含相关游戏数据的游戏表和一个动作关系表,这样你以后就可以处理你的统计数据或时间线等

    这里的关键是游戏数据和令牌,因为这些是您在游戏之间来回传递的内容。理想情况下,令牌是一个哈希值,可以与每个游戏特有的应用程序内进行比较,这样用户就不能只使用浏览器或其他东西,然后发布游戏更新。这背后还有一个完整的哲学,现在可能不重要了

    所以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做游戏的时候了。

    这个问题太宽泛了,不适合StackOverflow。考虑更多的概念性问题。对不起,我是新手。如果我能把它转移到gamedev,我会的。对不起,我不是要教程。更多关于如何构建数据以支持此类游戏的信息。在布局示例方面,DB表示例最多就是我想要的。我不打算运行一个实际上有队列或任何东西的服务器——它都是基于事件的,每个玩家都会根据他们的移动计算新状态并更新服务器上的数据库,然后第二个玩家会读取这个新状态,然后进行移动。好的,好的。但是,即使是一个模糊的答案,也可能需要更多地了解游戏本身。例如,是否有各种各样的地图,是随机生成的地图,它们是在网格上运行还是更像PvP,玩家是否有军队或是集体,等等。我可以尝试在猜测中更新我的答案,但我不确定它是否会有帮助。谢谢,你更新的答案与我所追求的更接近。该游戏没有地图或棋盘,更像是一个1vs1战斗般的口袋妖怪。通信是通过php/json Web服务进行的,我已经有了一个用户和身份验证/令牌系统。我的问题主要是如何表现你的新帖子非常有帮助的游戏/战斗和行动。实际上,我没有想到在数据库中存储一个类似JSON的gamedata列,而是为所需的每一项存储实际的列。不过,使用基于JSON的字段可能更高效、更灵活:)