0

我正在为纸牌游戏创建一个基于 Java 的服务器,客户端可以在其中连接以进行“游戏”。每个“游戏”(Java 类)拥有一副 104 张牌(普通牌乘以 2)。所以我得到的基本课程是:游戏,甲板,卡片。一个游戏只有一个牌组,一个牌组最多有 104 张牌。我已经使用 Hibernate 和 PostgreSQL 数据库为服务器制作了基本结构。我的问题是如何为数据库建模。

由于只有 52 张不同的牌,因此在“牌组”表中为每个牌组制作 52 张牌是没有意义的。但是,甲板需要洗牌。我想有一些聪明的方法可以做到这一点,但数据库建模不是我的强项。

在我的脑海中,我想我可以有一张桌子“卡片”,有 52 行,每张卡片一行。然后是另一个表“Deck”,它将在每次创建游戏时创建一行,并包含一个数字列表(104 个数字),该列表在卡片表中两次引用每张卡片的 ID。这听起来像是个好主意吗?以及如何使用 Java 和 Hibernate 来实现这一点?

或者还有其他方法应该这样做吗?由于有很多纸牌游戏,我猜这已经做过一百万次了,并且有一些解决这个问题的最佳实践,但我无法找到它。我将不胜感激有关此事的任何意见。提前,谢谢!

编辑:我是不是想多了这个问题,应该只使用 Hibernate 将一个 Deck 插入数据库,让数据库处理其余的事情?

4

2 回答 2

1

我认为将卡片存储在数据库中没有意义,它只会让事情变得过于复杂。我要做的只是在名为 CardDistribution 的 java 应用程序中创建另一个类,其中包含 102 个元素的数组。给每个元素一个它持有的卡片的 id。

当您想要保存游戏时,将您的 CardDistribution 对象序列化为 JSON 并将其保存在您的 Game 表的列中。

当您从数据库中读取数据时,只需将您的 CardDistribution JSON 反序列化为 java 对象并使用它。

于 2013-05-10T19:21:36.927 回答
0

一般而言,关于 RDBMS 的一个关键问题(基本上每个 JPA 提供者都会抱怨,如果您不这样做),您通常希望为表提供某种唯一键(即使它最终成为每一列)。
此外,SQL 有一个“保证”,即如果没有明确请求顺序,则返回的行将是“随机的”(这是为了允许优化器采用他们可以使用的任何快捷方式,这意味着顺序可能会意外更改)。

考虑到这一点,Deck最好的设置可能是:

Deck
-----------------
gameId  -- fk reference to Game.id
cardId  -- fk reference to Card.id
deckOrder  -- order of card in deck for this game

整行包含唯一键。

至于将行添加到牌组中……您可能会发现将所有卡片添加到数组中并在 Java 中对其进行洗牌是最简单的(并且“正确地随机”) - 随机排序某些东西非常困难。

于 2013-05-10T19:24:48.580 回答