2

私は C# が初めてで、このフォーラムも初めてです。2 か月前に C# を学ぶことに決め、Beginning Visual C# 2010 から始めました。今まで助けは必要ありませんでした。この章 (ch10) では、カードのデッキを作成する必要がありました。すでにランクとスーツで 2 つの列挙型を作成しました。この後、カードクラスを作成しました:

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はから始まるので、11 を引く必要があります。

于 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

最高ランクまでずっと。これで、デッキには 1 つのスートがあり、13 枚のカードが から までの位置にあり0ます12132 番目のスートのエースの場合、次のインデックス位置は になります。

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インデックスから 1 つを削除して補正する必要があります。

于 2013-09-30T11:26:40.813 に答える