关于扑克牌类库的问题

zzz9413 2010-05-21 05:35:26
照着《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。求高手解疑!!!
...全文
159 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzz9413 2010-05-22
  • 打赏
  • 举报
回复
rankVal=13时,枚举里并没有13,所以就显示数字13。才发现结果里也是有king的,只是没有ACE
因为rankVal=12就是king,rankVal=0取不到所以没有ACE。完全明白。
zzz9413 2010-05-22
  • 打赏
  • 举报
回复
原来如此,看来定义一定得统一形式才行。书上是不是故意留这么个BUG等着初学者中招,然后才明白这个定义和初始化的重要性。
这样啊,我把初始化数组改成这个通过:
cards = new Card[52];
for (int suitVal = 0;suitVal < 4;suitVal++)
{
for (int rankVal = 0;rankVal < 13;rankVal++)
{
cards[suitVal * 13 + rankVal] = new Card((Suit)suitVal,
(Rank)rankVal);
}
}

deknight 2010-05-21
  • 打赏
  • 举报
回复
顶,ls
兔子-顾问 2010-05-21
  • 打赏
  • 举报
回复
哦。看错了。king是K。你枚举定义的是0开始的。你初始化数组是从1开始的。所以都错位了。


public enum Rank //枚举1-13
{
Ace = 1,
Deuce,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
king
}

枚举用这样定义就可以了。
zzz9413 2010-05-21
  • 打赏
  • 举报
回复
是四个花色,只有52张,没有王。
King是K
mngzilin 2010-05-21
  • 打赏
  • 举报
回复
兔子-顾问 2010-05-21
  • 打赏
  • 举报
回复
你怎么一副牌里有4个王?
zzz9413 2010-05-21
  • 打赏
  • 举报
回复
总是显示 the 13 of ...
其它都显示正确,把king改成其他字母还是显示13,改其他枚举值如ACE改成1,就跟着改变。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧