class Cards
{
private Random random = new Random();
private List<Card> playerDeck = new List<Card>();
private List<Card> computerDeck = new List<Card>();
private List<int> usedPlayerNrs = new List<int>();
private List<int> usedComputerNrs = new List<int>();
public enum Card
{
AceClubs = 11,
AceDiamonds = 11,
AceHearts = 11,
AceSpades = 11,
DeuceClubs = 2,
DeuceDiamonds = 2,
DeuceHearts = 2,
DeuceSpades = 2,
EightClubs = 8,
EightDiamonds = 8,
EightHearts = 8,
EightSpades = 8,
FiveClubs = 5,
FiveDiamonds = 5,
FiveHearts = 5,
FiveSpades = 5,
FourClubs = 4,
FourDiamonds = 4,
FourHearts = 4,
FourSpades = 4,
JackClubs = 11,
JackDiamonds = 11,
JackHearts = 11,
JackSpades = 11,
KingClubs = 13,
KingDiamonds = 13,
KingHearts = 13,
KingSpades = 13,
NineClubs = 9,
NineDiamonds = 9,
NineHearts = 9,
NineSpades = 9,
QueenClubs = 12,
QueenDiamonds = 12,
QueenHearts = 12,
QueenSpades = 12,
SevenClubs = 7,
SevenDiamonds = 7,
SevenHearts = 7,
SevenSpades = 7,
SixClubs = 6,
SixDiamonds = 6,
SixHearts = 6,
SixSpades = 6,
TenClubs = 10,
TenDiamonds = 10,
TenHearts = 10,
TenSpades = 10,
ThreeClubs = 3,
ThreeDiamonds = 3,
ThreeHearts = 3,
ThreeSpades = 3
}
public void createDecks()
{
playerDeck = Enum.GetValues(typeof(Card)).Cast<Card>().ToList();
computerDeck = Enum.GetValues(typeof(Card)).Cast<Card>().ToList();
usedPlayerNrs = new List<int>();
usedComputerNrs = new List<int>();
}
public Card getPlayerCard()
{
int index = random.Next(playerDeck.Count());
usedPlayerNrs.Add(index);
while (usedPlayerNrs.Contains(index))
{
index = random.Next(playerDeck.Count());
}
Card randomCard = playerDeck[index];
return randomCard;
}
public Card getComputerCard()
{
int index = random.Next(computerDeck.Count());
usedComputerNrs.Add(index);
while (usedComputerNrs.Contains(index))
{
index = random.Next(computerDeck.Count());
}
Card randomCard = computerDeck[index];
return randomCard;
}
}
我需要从一副牌中得到一张牌,但我只被允许得到一次。但是,当我将随机生成的数字放入数组中以排除该数字再次出现时,我仍然会得到相同的卡片。已经尝试了很多,这就是为什么代码在这一点上有点混乱的原因。
usedPlayerNrs
和usedComputerNrs
将始终具有唯一值,但playerDeck
和computerDeck
具有重复的值,并且您正在根据唯一索引获取卡,如下所示:
Card randomCard = playerDeck[index]
因为,playerDeck
有重复的值,你会多次得到同一张卡。
获得"相同结果"的原因是,您在枚举中为多个项目分配了相同的值。相反,请为每个项目指定一个唯一的值。
public enum Card
{
AceClubs = 11,
AceDiamonds = 12,
AceHearts = 13,
AceSpades = ...,
}
此外,您可以通过比较枚举项的名称(而不是分配给枚举项的值(来检查样本的唯一性。这样:
var propertyName = typeof(Card).GetEnumName(Card.AceClubs);
你在这里有一个错误:
public Card getPlayerCard(List<int> usedPlayerNrs, List<Card> playerDeck)
{
int index = random.Next(playerDeck.Count());
while (usedPlayerNrs.Contains(index))
{
index = random.Next(playerDeck.Count());
}
usedPlayerNrs.Add(index);//Only add your index to the userplayednumbers here!
Card randomCard = playerDeck[index];
return randomCard;
}
此外,查找洗牌算法,它将有助于以更有效的方式随机收集卡片。
如前所述,拥有多个具有相同值的枚举是一种代码异味。您确定不想将它们编号为 1-52 吗?或者选择面向对象的设计并添加一个数字 + 黑桃/钻石/...枚举到该类。