关于扑克牌类库的问题
照着《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。求高手解疑!!!

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。求高手解疑!!!
...全文
相关推荐
CardLib 扑克牌类 完成洗牌功能
也算是一个比较初级的类,使用C#实现了扑克牌类,有洗牌功能,并生成的.lib文件,供另一个工程调用,打印出洗好的52张牌。
实现CardLib扑克牌类的洗牌功能
Fisher-Yates洗牌算法,也被称作Knuth洗牌算法,是一种高效的随机化算法。其核心思想是:从数组的最后一个元素开始,每次随机选择一个元素与当前元素交换位置,直到达到数组的第一个元素。这样可以确保每个元素被选中的概率都是相等的,从而达到随机洗牌的目的。算法的步骤如下:1. 从数组的最后一个元素开始,用一个循环来遍历数组中的每一个元素。2. 在每次循环中,生成一个随机索引。3. 将当前元素与随机索引指向的元素交换。4. 当循环到数组的第一个元素时停止。
所有扑克牌图片
所有扑克牌图片img,可以用于设计小游戏和数据库等。所有扑克牌图片img,可以用于设计小游戏和数据库等。
C#摄像头对扑克牌识别.zip
c# 利用Aforge技术进行摄像头识别,里面附有ppt图文教程说明,根據使用c#代碼利用攝像頭識別撲克牌需求,採用Aforge組件技術去識別
VC扑克牌游戏
VC扑克牌编程源码,绝对好用。入门上手必备



