看看相关的二十一点问题,对于什么更好地用于卡片存在混淆,要么制作字符串/项目数组或整数。
在我的二十一点游戏中,A 只有 11,而 10、J、Q 和 K 都是 10,这与花色无关。什么能让我用字符串或整数对卡片进行编码更容易?
Visual Studio C# 2010,Windows 窗体应用程序
看看相关的二十一点问题,对于什么更好地用于卡片存在混淆,要么制作字符串/项目数组或整数。
在我的二十一点游戏中,A 只有 11,而 10、J、Q 和 K 都是 10,这与花色无关。什么能让我用字符串或整数对卡片进行编码更容易?
Visual Studio C# 2010,Windows 窗体应用程序
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;
}
}
字符串几乎从来都不是实际文本的最佳内部表示。弦乐是给人的;计算机使用数字。尤其是对于卡片来说,这是不费吹灰之力的,因为卡片通常需要按等级进行比较并按价值添加。告诉程序 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 的原因)。我可以像这样在几分钟内模拟数十亿只手。
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
}
enum
对于 13 个可能的值会更好