1

看看相关的二十一点问题,对于什么更好地用于卡片存在混淆,要么制作字符串/项目数组或整数。

在我的二十一点游戏中,A 只有 11,而 10、J、Q 和 K 都是 10,这与花色无关。什么能让我用字符串或整数对卡片进行编码更容易?

Visual Studio C# 2010,Windows 窗体应用程序

4

4 回答 4

2

Card 是一个对象,所以让它成为它自己的类。

应使用 Suit 枚举(Heart、Diamond、Club、Spade)和Rank 枚举(Ace、Jack、10 等,为便于比较而相应排序)。您可以从西装中获取颜色,因此我不建议将颜色作为构造函数的参数,因为它是多余的。您实际上只需要构造函数中的这两个字段,除非您计划复制卡片,例如您在游戏中使用多个套牌。使用这些卡片时,强烈建议使用 List 或类似类型,因为很多排序操作都是内置的。当您需要洗牌时,请使用 Knuth 洗牌!你可以很容易地在 Google 上找到它,它很容易实现,并且工作快速高效。

这种方法来自我的 CS 教授,我也倾向于欣赏它。您的代码对现实生活的建模越多,就越容易理解和扩展。您可以使用 int 或 string 常量,但它们是您不需要做的额外工作,也不优雅。

public class Card
{
    public Suit Suit { get; private set; }
    public Rank Rank { get; private set; }

    public Card(Suit suit, Rank rank)
    {
         this.suit = suit;
         this.rank = rank;
    }
} 
于 2013-06-11T20:59:10.017 回答
2

字符串几乎从来都不是实际文本的最佳内部表示。弦乐是给人的;计算机使用数字。尤其是对于卡片来说,这是不费吹灰之力的,因为卡片通常需要按等级进行比较并按价值添加。告诉程序 12 > 11 或将 10 添加到总数中所需的代码比告诉程序“K” > “Q”或将“J”添加到总数中要少得多。对于懒得学习数据表示的新手程序员来说,在内部使用字符串是很常见的。

当然,在像 C++ 这样的面向对象语言中,您可以使用对象,但那些持有牌点和花色的对象的成员变量应该是整数,以便您可以索引查找表、比较范围等。

我在这里写了一篇关于卡片表示的文章。

对于二十一点,如果您不需要通用的卡片表示,那么只使用整数 1 到 10 是理想的。将 1 用于 ace,而不是 11,它将使您的总计算速度更快:您只需将一个 ace 从 1 提升到 11,但您需要将几个从 11 降级到 1。

例如,如果您有一个代表手牌的整数数组,则将手牌总数相加是这样的(当然,充实):

int total = 0, acefound = 0, soft = 0;

for (int i = 0; i < cardsinhand; ++i) {
    total += hand[i];
    if (1 == hand[i]) acefound = 1;
}
if (acefound && total < 12) {
    soft = 1;
    total += 10;
}

简单,而且速度极快。如果您代表的是实际卡片,那么您将拥有等级为 11、12、13 的面卡,那么只需在其中添加类似if (r > 10) r = 10;的东西(另一个使 ace 成为 1 的原因)。我可以像这样在几分钟内模拟数十亿只手。

于 2013-06-12T12:41:50.210 回答
1

Blackjack 控制台应用程序示例项目 (C#) GitHub:

https://github.com/koistya/Blackjack

public class Card
{
    public Card(Rank rank, Suite suite)
    {
        this.Rank = rank;
        this.Suite = suite;
        this.IsFaceUp = true;
    }

    public Rank Rank { get; private set; }

    public Suite Suite { get; private set; }

    public bool IsFaceUp { get; private set; }

    public void Flip()
    {
        this.IsFaceUp = !this.IsFaceUp;
    }
}

public enum Rank : byte
{
    Ace   = 1,
    Two   = 2,
    Three = 3,
    Four  = 4,
    Five  = 5,
    Six   = 6,
    Seven = 7,
    Eight = 8,
    Nine  = 9,
    Ten   = 10,
    Jack  = 11,
    Queen = 12,
    King  = 13,
}

public enum Suite : byte
{
    Club    = 1,
    Diamond = 2,
    Heart   = 3,
    Spades  = 4
}
于 2013-12-27T12:01:27.620 回答
0

enum对于 13 个可能的值会更好

于 2013-06-11T19:30:03.190 回答