读书人

提取枚举值有关问题

发布时间: 2012-01-18 00:23:26 作者: rapoo

提取枚举值问题
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

读书人网 >C#

热点推荐