照着《C#入门经典(第三版)》第十章的扑克牌例子,做了一个简单的程序。但运行有个很奇怪的问题,如图
king这张牌总显示为13,百思不得其解。
代码如下:
类库部分
public enum Rank //枚举1-13
{
Ace,
Deuce,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
king
}
--------------------------------------
public enum Suit //枚举四个花色
{
Club,
Diamond,
Heart,
Spade,
}
---------------------------------------
public class Card //card类,存放每张牌的
{
public readonly Suit suit;//suit 和 rank是前面建立的枚举
public readonly Rank rank;
public Card(Suit newSuit, Rank newRank)
{
suit = newSuit;
rank = newRank;
}
private Card()
{
throw new System.NotImplementedException();
}
public override string ToString()
{
return "the " + rank + " of " + suit + "s";
}
}
}
-------------------------------------------------
public class DECK //存放一副扑克的类,
{
private Card[] cards;//cards为一个前面建立的Card数组
public DECK() //每次迭代创建一张牌
{
cards = new Card[52];
for (int suitVal = 0;suitVal < 4;suitVal++)
{
for (int rankVal = 1;rankVal < 14;rankVal++)
{
cards[suitVal * 13 + rankVal -1] = new Card((Suit)suitVal,
(Rank)rankVal);
}
}
}
public void Shuffle() //创建一个临时的扑克牌数组
{
Card[] newDeck = new Card[52];
bool[] assigned = new bool[52];
Random sourceGen = new Random();
for (int i = 0;i < 52;i++)
{
int destcard = 0;
bool foundCard = false;
while (foundCard == false)
{
destcard = sourceGen.Next(52);
if (assigned[destcard] == false)
foundCard = true;
}
assigned[destcard] = true;
newDeck[destcard] = cards[i];
}
newDeck.CopyTo(cards,0);
}
public Card GetCard(int cardNum) //根据指定下表返回一个card对象
{
if (cardNum >= 0 && cardNum <= 51)
return cards[cardNum];
else
throw (new System.ArgumentOutOfRangeException("cardNum", cardNum,
"Value must between 0 and 51."));
}
}
建一个控制台项目来引用这个类库:
static void Main(string[] args)
{
DECK myDeck = new DECK();
myDeck.Shuffle();
for (int i = 0; i < 52; i++)
{
Card tempCard = myDeck.GetCard(i);
Console.Write(tempCard.ToString());
if (i != 51)
Console.Write(",");
else
Console.WriteLine();
}
Console.ReadKey();
}
运行结果,就如图显示,king总是显示为13。求高手解疑!!!