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

问题描述:

看看相关的大酒杯问题,有什么更好的用于卡,或者制作一个字符串/项目或整数数组混淆混淆。数组为二十一点卡,字符串或整数?

随着我的大酒杯游戏王牌只有11和10,J,Q和K都是价值10,无关紧要。什么可以让我更容易地使用字符串或整数对卡片进行编码?

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

+9

有趣的问题:没有。我会创建一个专用的'Card'类,并且可能为13个可能的值提供'enum'支持。 –

+0

听起来更容易 –

+0

没有“最好”或“舒适”的方式来做到这一点。有些人会说52个值的枚举。其他人会说一个具有价值的“卡”对象,并且可能是西装的枚举。有些人可能会在同一个应用程序中找到两个理由。你是否与从未做过面向对象的人一起工作?那么也许你不应该使用一个对象。这些问题对于StackOverflow来说并不是很好的问题。用一种方法,并了解它为什么不起作用。但要认识到,在编程​​中没有什么“最好”的方式来做任何事情,因为每个人的经验和项目都不同。 –

enum对13倍可能的值会是更好的主意

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

应该使用套装(心脏,钻石,俱乐部,黑桃)的枚举和Rank的枚举(Ace,Jack,10等,为了便于比较而相应排序)。你可以从西装中派生颜色,所以我不会建议将颜色作为构造函数的参数,因为它是多余的。你只需要构造函数中的这两个字段,除非你计划重复这些卡片,就像你在游戏中使用多个卡片一样。使用这些卡时,使用List或类似的类型是非常明智的,因为很多排序操作都是内置的。当你需要洗牌时,使用Knuth shuffle!您可以很容易地在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++这样的面向对象语言中,你可以使用对象,但是那些持有卡片等级和套装的对象的成员变量应该是整数,所以你可以索引查找表,比较范围等等。

我写了一篇关于卡片表示的文章here

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

例如,if你有代表的手,这些整数数组,加入手总是这样的(当然,充实了):

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)。我可以在这样的几分钟内模拟数十亿手

+0

比我的答案要好得多,我应该花时间正确地布置班级,而不是寻找快速答案,特别是我应该知道优化的粉丝比发布这样一个马虎的答案更好,很高兴的成员保留每个其他达到鼻烟在这个网站上! –

酒杯控制台应用程序示例项目(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 
}