繁体   English   中英

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

[英]Array for Blackjack cards, strings or integers?

看了有关BlackJack的问题后,对于制作卡/项或整数数组的卡有什么更好的使用感到困惑。

在我的BlackJack游戏中,A仅11,而J,Q和K都为10,与西装无关。 什么使我更容易用字符串或整数对卡进行编码?

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

卡是一个对象,因此使其成为自己的类。

应该使用西装的枚举(心,钻石,棍棒,黑桃)和等级的枚举(王牌,杰克,10等,为便于比较而相应订购)。 您可以从西装中获取颜色,所以我建议不要将颜色作为构造函数的参数,因为它是多余的。 除非您打算复制卡片,例如您在游戏中使用多个套牌,否则您实际上只需要构造函数中的这两个字段。 使用这些卡时,强烈建议使用列表或类似类型的卡,因为许多排序操作是内置的。 而且,当您需要洗牌时,请使用Knuth洗牌! 您可以在Google上轻松找到它,易于实施,并且快速有效地工作。

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

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;
    }
} 

字符串几乎绝不是实际文本的最佳内部表示形式。 弦是给人的。 计算机使用数字。 尤其对于卡片来说,这很容易,因为卡片通常需要按等级进行比较,并按价值相加。 告诉一个程序12> 11或向总数中添加10所需的代码比告诉它“ K”>“ Q”或向总数中添加“ J”所需的代码少得多。 对于新手程序员来说,内部使用字符串是很常见的,因为他们懒得学习数据表示。

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

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

对于二十一点,如果您不需要通用卡表示形式,那么仅使用1到10的整数是理想的选择。 将1用作A,而不是11,这将使您的总计算速度更快:您只需要将一个A从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;
}

简单,令人眼花fast乱。 如果您代表的是真实的牌,那么您将拥有面卡的等级为11、12、13,那么只需添加类似if (r > 10) r = 10; 在那儿(获得ace 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
}

enum这13种可能的值会更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM