我该如何处理游戏的卡片分配?

时间:2010-08-31 03:13:54

标签: mysql database-design logic

我已经检查了大部分关于我的标题的问题,但它们与我正在寻找的内容无关,所以我开始自己的问题。

我试图重新创建的在线游戏的游戏被称为Buraco,不确定大多数人或你们中的任何人都知道它。

我已经掌握了游戏的基本功能,例如:

  • 洗牌“
  • 分发卡片

我被困在妈妈身上的是我应该如何处理分配给玩家A,B,C,D的卡片,卡片上留下的卡片,垃圾上的卡片以及将放在卡片上的卡片两队参赛者如果由4名队员或每名队员参赛,如果由2名队员进行比赛。

考虑到我不希望任何玩家欺骗游戏我必须将每个指定的卡保存在数据库中,所以我在想如何创建我的MySQL表以适应这个?

我想到的第一件事就是用游戏会话和所有卡片作为一个列创建一个表但是总共列了104张卡???可能还有很多其他更好的方法来实现这一点。

然后我想起了我可以使用varchar或文本来保存所有给定的卡片,这会使得更难以验证已经递送的每张卡片,仍然在甲板上或者在垃圾桶上或者在表


所以我想我的问题是:

  1. 考虑到多人游戏(用户创建一个可供2或4名玩家服务的房间),哪个数据库对我来说是最好的选择?

  2. 你如何使用MySQL或任何其他数据库来维护每个游戏?

  3. 你如何处理更新(因为你注意到我将使用ajax更新游戏,是否有任何最佳实践,我应该限制每个数据的频率,数量或数据类型更新,因为它将更新房间中的所有用户,并且很可能不是所有用户一起作为1请求,这将是对服务器的使用影响的一个大问题)?

  4. 您如何根据您希望使用的数据库结构比较卡片(查询样本)?

  5. PS:如果你对这个主题有更好的标题,请告诉我这是我当时想到的。

1 个答案:

答案 0 :(得分:1)

这只是部分答案,但关于第2号(表格结构)将其分解并考虑所有游戏资产都是卡片。

创建一个表格,其中包含游戏列,卡片,其值(如果适用),当前所有者(这将是指示特定玩家,堆栈或弃牌堆的值)。为了管理形成的集合,创建另外两个表:一个用于组或一组卡,以及一个链接表,用于显示游戏中卡的成员资格给定一个组(这也可以通过基表中的字符串列来实现)和一些逻辑,但对于纯rdbms方法,拆分表。)

修改

问题1 - 数据库选项

关于MySQL和优化的性能,这里有很多问题。您的游戏需要考虑的最大特点是读取操作与写入操作的频率。标准的MySQL配置可以优化读取性能 - 这可能最适合您描述游戏的方式。

问题2 - 表格配置

为了扩展我之前的评论,我建议如下(随意修改表名 - 只是为了解释):

  • 包含列game_cardsgame_idcard_idvalue
  • owner表格
  • game_sets表,其中包含{set_idgame_idowner
  • card_set_membership表格,其中包含(set_idcard_id

game_cards表最初应该填充一个完整的卡片(但是你会拥有许多卡片,即你添加到表格中的行数)。所有卡片都应该由card_id标识,其中每张卡片代表卡片组中的唯一卡片,对于给定的游戏,所有卡片都应具有game_id的相同值(因为它们是同一游戏的一部分。)

  • 如果适用于您的游戏,game_cards.value列将代表卡固有的点数。
  • game_cards.owner列将包含一个值,用于指示卡片的位置;你的游戏中的例子可以是“deck”,“discard”,“p1”,“p2”,“p3”,“p4”

这使您可以存储您拥有的卡,它们的价值以及它们的位置(每个人拥有拥有者)。默认情况下,如果所有卡片都在套牌上开始,那么您可以设置game_cards.owner = 'deck'的值。当一张牌被“抽出”时,你,比如玩家3,你可以将抽出的牌的值更新为game_cards.owner = 'p3'

下一个难题是将卡片收集到任意中。为了在典型的rdbms中处理这个问题,我使用一个表来创建集合列表(game_sets),另一个表格用于将游戏中的卡片链接到集合(card_set_membership)。当用户开始将卡片收集到一个集合中时,在game_sets表格中创建一条记录,其中包含新的set_id,来自主game_id字段的game_cards.game_id和{{ 1}}到具有该组的玩家(或其他实体,如果可能在您的游戏中)。如果您已经定义了,则使用ownercard_set_membership将记录添加到set_id表中。您不必将card_id保留在此处,因为您知道通过game_id表格。

注意:此配置允许单张卡成为多个套装的一部分。如果您不需要这个(即卡片可能只是一组卡片的一部分),那么您可以在game_sets表格中添加game_id,而不是使用card_set_membership。< / p>

希望能让这一点更加清晰!

问题3 - 数据库更新

简短的回答是,您应该尽量减少客户端和服务器之间的流量。如果您使用的是ajax,请尝试确保消息开销(包装)尽可能小。查看用户可以在客户端执行的操作,然后考虑如何将其转换为服务器端的操作。设计一组消息,实现这些操作并查看他们需要的数据(例如卡或卡,哪个玩家进行移动等)。如果您担心作弊,请考虑嵌入一个密钥(而不仅仅是“p1”或“p2”等),这些密钥不容易被客户端伪造(可能与他们的会话登录有关?)。