看看相关的BlackJack问题,对于什么更适合用于卡片存在混淆,要么制作一个字符串/项目数组或整数。
凭借我的BlackJack游戏Aces只有11和10,J,Q和K都是10,与诉讼无关。是什么让我更容易用卡片,字符串或整数编码?
Visual Studio C#2010,Windows窗体应用程序
答案 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)
enum
将是更好的主意