我正在制作一个BlackJack游戏。我需要确定我的牌组是否包含特定值。
检查我的套牌最简单的方法是什么?最简单的意思是减少代码行数,减少混乱。注意我将给出这些值相关的字符串。 (King,Jack,Queen和Ten等于10。)
这与西装或颜色无关。我将只显示卡符号(K,Q)。
enum deck {Ace=1|11, Two=2, Three=3, Four=4, Five=5, Six=6, Seven=7, Eight=8, Nine=9, Ten=10, Jack=10, Queen=10, King=10};
int a = (int)deck.Ace;
int b = (int)deck.Two;
int c = (int)deck.Three;
int d = (int)deck.Four;
int e = (int)deck.Five;
int f = (int)deck.Six;
int g = (int)deck.Seven;
int h = (int)deck.Eight;
int i = (int)deck.Nine;
int j = (int)deck.Ten;
int k = (int)deck.Jack;
int l = (int)deck.Queen;
int m = (int)deck.King;
答案 0 :(得分:2)
我会用一个枚举代表等级,另一个代表诉讼。
然后将它们封装在Card
类中,如下所示:
public enum Suit
{
Clubs,
Diamonds,
Hearts,
Spades
}
public enum Rank
{
Ace = 1,
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King
}
public class Card: IEquatable<Card>
{
public Rank Rank
{
get;
set;
}
public Suit Suit
{
get;
set;
}
public int Value
{
get
{
switch (Rank)
{
case Rank.Ten:
case Rank.Jack:
case Rank.Queen:
case Rank.King:
return 10;
default:
return (int) Rank;
}
}
}
}
这里需要注意的重要事项是Equals()
方法,它是IEquatable
接口的一部分。实现这一点允许我们利用List.Contains()
等搜索方法。
使用上面的代码,你可以写这样的东西:
List<Card> deck = new List<Card>();
deck.Add(new Card {Rank = Rank.Seven, Suit = Suit.Clubs} );
deck.Add(new Card {Rank = Rank.Five, Suit = Suit.Diamonds} );
Card target1 = new Card {Rank = Rank.Five, Suit = Suit.Diamonds };
Card target2 = new Card {Rank = Rank.Eight, Suit = Suit.Hearts };
Console.WriteLine(deck.Contains(target1)); // Prints true
Console.WriteLine(deck.Contains(target2)); // Prints false
Console.WriteLine(deck.IndexOf(target1)); // Prints 1
请注意我们如何使用deck.Contains(target)
查看套牌是否包含特定卡片。
我们也可以使用IndexOf(target)
来确定卡片在牌组中的确切位置。
另请注意我们如何实施了卡的Value
属性。
我们不需要明确存储此值,因为您可以从卡的等级中派生出来。
了解我们如何为Ten,jack,Queen和King返回显式值。对于其他值,我们利用了这样一个事实,即排名的枚举值从1开始为1,2开始为2,依此类推。这意味着我们可以简单地将枚举转换为int以获得正确的值。
有了这个基础,就可以更容易地创建一个Deck
和一个Hand
类来模拟一副牌和一副牌,还可以做一些像洗牌一样的事情。 (如何做到这一点超出了这个特定问题和答案的范围。)
答案 1 :(得分:0)
使用enums
:
public enum Value
{
V2,
V3,
//...
V10,
J,
Q,
K,
A
}
public enum Suit
{
Diamonds,
Spades,
Hearts,
Clubs
}
public static bool ContainsCard(IEnumerable<Tuple<Suit,Value>> deck, Suit suit, Value value)
{
return deck.Any(c => c.Item1 == suit && c.Item2 == value);
}
答案 2 :(得分:0)
有很多可以接受的方法可以解决这个问题。我尝试的一种方法是制作两种类型的枚举并为每张卡分配它们。例如,
public enum CardNumber { Ace, Two, Three, ... Ten, Jack, Queen, King };
public enum CardSuit { Diamond, Heart, Club, Spade};
创建这两种类型后,您可以为您制作的每张卡声明上述每种类型之一。此时,这些卡可以很容易地存储在您首选的系统中 - 例如数组或列表。