首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

提取枚举值有关问题

2012-01-18 
提取枚举值问题using Systemusing System.Collections.Genericusing System.Textnamespace ConsoleAppl

提取枚举值问题
using System; 
using System.Collections.Generic; 
using System.Text; 


namespace ConsoleApplication1 

  public enum Suit 
  { 
  红心, 
  梅花, 
  方片, 
  黑桃, 
  } 
  public enum Rank 
  { 
  Ace, 
  Deuce, 
  Three, 
  Four, 
  Five, 
  Six, 
  Seven, 
  Eight, 
  Nine, 
  Ten, 
  Jack, 
  Queen, 
  King 
  } 
  public class Deck 
  { 
  private Card[] cards; 
  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 Card GetCard(int cardNum) 
  { 
  if (cardNum >= 0 && cardNum <= 51) 
  return cards[cardNum]; 
  else 
  throw new System.ArgumentOutOfRangeException("错误!!!"); 
  } 
  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 class Card 
  { 
  public readonly Rank rank; 
  public readonly Suit suit; 
  public Card(Suit newSuit, Rank newRank) 
  { 
  suit = newSuit; 
  rank = newRank; 
  } 
  private Card() 
  { 
  throw new System.NotImplementedException(); 
  } 
  public override string ToString() 
  { 
  return suit + "" + rank; 
  } 
  } 
  class Program 
  { 
  static void Main(string[] args) 
  { 
  Deck myDeck=new Deck(); 
  myDeck.Shuffle(); 
  bool isFlush = false; 
  for(int i=0;i <2;i++) 


  { 
  Rank flushSuit = myDeck.GetCard(i).rank; 
  if (myDeck.GetCard(i + 1).rank != flushSuit) 
  { 
  isFlush = true; 
  break; 
  } 
  } 
  if (isFlush) 
  { 
  for (int card = 0; card < 3; card++) 
  { 
  Console.WriteLine(myDeck.GetCard(card)); 
  } 
  Console.WriteLine("不是豹子"); 
  } 
  else 
  { 
  for (int card = 0; card < 3; card++) 
  { 
  Console.WriteLine(myDeck.GetCard(card)); 
  } 
  Console.WriteLine("是豹子"); 
  } 
  Console.ReadKey(); 
  } 
  } 

=========================================================== 
为什么myDeck.GetCard(i).rank会出现13这个值? 
我在枚举Rank只有: 
{  
  Ace, 
  Deuce, 
  Three, 
  Four, 
  Five, 
  Six, 
  Seven, 
  Eight, 
  Nine, 
  Ten, 
  Jack, 
  Queen, 
  King 

这几个值,为什么会出现13这个值呢? 
如果只是枚举的长度,那么为什么myDeck.GetCard(i).suit不会出现4这个值? 
能给我解释一下吗?

[解决办法]
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);
}
}


第一次循环时:
cards[0] = new Card((Suit)0, (Rank)1);

for (int rankVal = 1; rankVal < 14; rankVal++)
应该改为
for (int rankVal = 0; rankVal < 13; rankVal++)吧
[解决办法]
要这样定义才行
public enum Suit
{
红心 = 1,
梅花,
方片,
黑桃,
}
public enum Rank
{
Ace = 1,
Deuce,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King
}
否则枚举是从0开始计数的。

[解决办法]
楼上正解
楼主可以分两种方案进行解决,第一指定枚举的始值为1,就像2楼那个,要么改变其读取循环,让遍历从0开始
[解决办法]
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);
}
}

你这里不是把rankVal 的范围指定为1-13

热点排行