数组为二十一点卡,字符串或整数?
看看相关的大酒杯问题,有什么更好的用于卡,或者制作一个字符串/项目或整数数组混淆混淆。数组为二十一点卡,字符串或整数?
随着我的大酒杯游戏王牌只有11和10,J,Q和K都是价值10,无关紧要。什么可以让我更容易地使用字符串或整数对卡片进行编码?
的Visual Studio C#2010,Windows窗体应用程序
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)。我可以在这样的几分钟内模拟数十亿手。
比我的答案要好得多,我应该花时间正确地布置班级,而不是寻找快速答案,特别是我应该知道优化的粉丝比发布这样一个马虎的答案更好,很高兴的成员保留每个其他达到鼻烟在这个网站上! –
酒杯控制台应用程序示例项目(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
}
有趣的问题:没有。我会创建一个专用的'Card'类,并且可能为13个可能的值提供'enum'支持。 –
听起来更容易 –
没有“最好”或“舒适”的方式来做到这一点。有些人会说52个值的枚举。其他人会说一个具有价值的“卡”对象,并且可能是西装的枚举。有些人可能会在同一个应用程序中找到两个理由。你是否与从未做过面向对象的人一起工作?那么也许你不应该使用一个对象。这些问题对于StackOverflow来说并不是很好的问题。用一种方法,并了解它为什么不起作用。但要认识到,在编程中没有什么“最好”的方式来做任何事情,因为每个人的经验和项目都不同。 –