gpt4 book ai didi

sql - 在数据库中存储一副纸牌的最佳方式是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:42:57 24 4
gpt4 key购买 nike

我正在开发一个需要在数据库中存储一副牌的应用程序。我不确定在数据库中表示此内容的最佳方式是什么。

应用程序会将一副牌预先分配到 4 手,每手持有 13 张牌。之后,我需要存储手牌和附加数据,如花色分布等......

是否最好为每只手创建一个单独的行并将其与一副牌相关联?或者将它们排成一排会更好?

此外,我不确定是否应该将它们保留为文本或数字。这是一个例子:

Sorted by suit and separated by dot
AK.32.6543.AKQ98

或者

(52 = Largest rank or largest suit or 02 = 2 of smallest suit)
405251282717161514012322200908

有什么想法吗?

PS:存卡是有原因的。我们需要分析手牌分布、高牌点等...

最佳答案

我认为最自然的做法是为纸牌创建一张表,为一副牌中的每张纸牌创建一条记录,然后为手牌创建一条记录,为手中的每张纸牌创建一条记录.如果有关于整手牌的数据——玩家的名字?他坐在 table 的哪个位置?他有多少筹码?不管怎样——那么你需要一张单独的 table 来存放这手牌而不是手中的牌。我还会为西装创建一个查找表。

(我们可以在这里争论使用合成键还是使用自然键,但那是另一个主题。)

card (cardid, suitid, rank)
suit (suitid, suitname)
hand (handid, playername, whatever)
handcard (handcardid, handid, cardid)

我的第一个冲动是让“rank”成为一个从 1 到 13 的数字,并在输出时将 1 翻译成“Ace”,将 11 翻译成 13 到“Jack”、“Queen”和“King”。您可以将它们存储为文本,但如果需要这样做的话,将很难比较排名。即决定 13>10 对数据库来说是否容易; King>10,没那么多。

我绝对不会尝试将多张卡片的标识塞进一个字段中,无论是用句点分隔还是固定长度的 ID 或其他。这样做需要你的程序有代码来把这个字段分开来得到你想要的数据,而不是让数据库检索你想要的数据,这就是数据库的用途。

我不知道你想用这些牌手做什么,但你可能想做的大多数事情都可以通过我描述的结构来做成一个单一的领域。比如,“谁有黑桃 K?”简单:

select playername
from hand
join handcard using (handid)
join card using (cardid)
join suit using (suitid)
where suit.name='Spades' and card.rank=13

或者,“每个玩家有多少张人头牌?”

select playername, count(*)
from hand
join handcard using (handid)
join card using (cardid)
where card.rank between 11 and 13

当然是“玩家 #3 有什么牌?”也很简单:

select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3

使用打包格式执行这些查询需要棘手的字符串提取调用。字符串操作总是很痛苦。就像你总是遇到这样的问题,如果我在文本中搜索 2,我如何排除属于 '12' 的 2?等等

关于sql - 在数据库中存储一副纸牌的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com