二十一点卡,字符串或整数的数组?

时间:2013-06-11 19:23:40

标签: c# visual-studio blackjack

看看相关的BlackJack问题,对于什么更适合用于卡片存在混淆,要么制作一个字符串/项目数组或整数。

凭借我的BlackJack游戏Aces只有11和10,J,Q和K都是10,与诉讼无关。是什么让我更容易用卡片,字符串或整数编码?

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

4 个答案:

答案 0 :(得分:2)

卡片是一个对象,所以把它作为自己的类。

应使用套装(Heart,Diamond,Club,Spade)的枚举和Rank(Ace,Jack,10等等,为便于比较而订购)的枚举。你可以从西装派生颜色,所以我不建议将颜色作为构造函数的参数,因为它是多余的。你真的只需要构造函数中的那两个字段,除非你计划复制卡片,比如你在游戏中使用多个套牌。使用这些卡时,建议使用List或类似的类型,因为许多排序操作都是内置的。当你需要洗牌时,使用Knuth shuffle!您可以非常轻松地使用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;
    }
} 

答案 1 :(得分:2)

除了实际文本之外,字符串几乎不是最好的内部表示。字符串适合人;电脑使用数字。对于卡片而言,这是一个明智的选择,因为卡片通常需要按等级进行比较并按值增加。告诉程序12>需要很少的代码。 11或者总计加10比告诉它“K”> “Q”或总计添加“J”。内部使用字符串对于新手程序员来说很常见,他们懒得学习数据表示。

当然,在像C ++这样的面向对象语言中你可以使用对象,但是那些持有卡等级和套装的对象的成员变量应该是整数,这样你就可以索引查找表,比较范围等等。 / p>

我写了一篇关于卡片陈述的文章here

对于二十一点,如果您不需要通用卡表示,那么只使用整数1到10是理想的。使用1代替a而不是11,它会使你的总计算速度更快:你只需要从1到11推广一个ace,但你需要将几个从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;之类的东西(制作王牌1的另一个原因)。我可以在几分钟内模拟数十亿的手。

答案 2 :(得分:1)

二十一点控制台应用程序示例项目(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
}

答案 3 :(得分:0)

对于13个可能的值,

enum将是更好的主意