[英]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.