2

我是 C# 新手,也是这个论坛的新手。两个月前决定学习c#,并从Beginning Visual C# 2010 开始。到现在为止不需要任何帮助。在本章(第 10 章)中,我必须创建一副纸牌。我已经用等级和西装制作了两个枚举。在此之后,我创建了卡片类:

public class Card
{
    public readonly Rank rank;
    public readonly Suit suit;

    private Card()
    {

    }

    public Card(Suit newSuit, Rank newRank)
    {
        suit = newSuit;
        rank = newRank;
    }

    public override String ToString()
    {
        return "The " + rank + "of " + suit + "s";
    }
}

在此之后,我不得不进行甲板课程:

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);**
            }                
        }
    }

甲板类还有更多,但我只是没有得到粗体的部分(13至少有意义,感觉很奇怪,因为每套有13张牌,但我真的不能放置-1)。甲板类中究竟发生了什么,特别是在粗体部分?

提前致谢

4

2 回答 2

1

这是一个范围从0..51

for (int suitVal = 0; suitVal < 4; suitVal++)
{
    for (int rankVal = 1; rankVal < 14; rankVal++)
    {
        int cardIndex = suitVal * 13 + rankVal - 1;
        cards[cardIndex] = new Card((Suit)suitVal,(Rank)rankVal);
    }                
}

这样(suitVal * 13) + (rankVal - 1)您就可以访问阵列中的特定卡。因为从rankVal开始1,你必须减去一个。

于 2013-09-30T11:25:50.410 回答
1

你从

suitVal = 0; rankVal = 1;

并且您需要制作卡片组中的第一张卡片,第一张卡片位于索引位置0

suitVal * 13 + rankVal - 1 = 0 * 13 + 1 - 1 = 0; <-- exactly what you need

然后你得到

suitVal = 0; rankVal = 2;  //index should be 1
suitVal * 13 + rankVal - 1 = 0 * 13 + 2 - 1 = 1; <-- exactly what you need

一直到最高等级。所以现在你有一副花色,有 13 张牌012. 下一个索引位置应该是13,对于第二花色的 A

suitVal = 1; rankVal = 1;  //index should be 13
suitVal * 13 + rankVal - 1 = 1 * 13 + 1 - 1 = 13; <-- exactly what you need

等等等等……直到

suitVal = 3; rankVal = 13;  //index should be 51, last one
suitVal * 13 + rankVal - 1 = 3 * 13 + 13 - 1 = 51; <-- exactly what you need

在 C# 中,所有数组/列表都是基于 0 的,因此当您包含基于 1 的构造时,例如rankVal在您的示例中,您必须通过从其索引中删除一个来进行补偿。

于 2013-09-30T11:26:40.813 回答