11

これが私のコードで、次のように言ってエラーをスローしていCannot convert type "int" to Cards.Suitsます Cannot convert type "int" to Cards.Rank

private Card[] cards;
public Deck()
{
    cards = new Card[52];
    for (int suitVal = 0; suitVal < 4; suitVal++)
    {
        for (int rankVal = 0; rankVal < 14; rankVal++)
        {
            cards[suitVal * 13 + rankVal - 1] = new Card((Suits)suitVal, (Rank)rankVal);
        }
     }
}

カードのコンストラクタは

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

現在、Suits enum と Rank enum は ACE = 1 で始まる通常のカードのデッキであり、スーツは DIAMONDS、CLUBS、HEARTS、SPADES です。上記のエラーが発生する理由を誰か教えてください。次のコードは本から取ったものです。ありがとう!

*編集

    public enum ranks
    {
        ACE = 1,
        TWO,
        THREE,
        FOUR,
        FIVE,
        SIX,
        SEVEN,
        EIGHT,
        NINE,
        TEN,
        JACK,
        QUEEN,
        KING,
    }

    public enum Suit
    {
        DIAMOND,
        CLUB,
        HEART,
        SPADE,
    }
4

4 に答える 4

2

enum 宣言によると、Suit は [0..3] の範囲にあり、ranks は [1..13] の範囲にあるため (ranks はゼロベースではないことに注意してください)、内側の for ループを修正する必要があります。 :

  for (int rankVal = 0; rankVal < 13; rankVal++) // <- 14 changed for 13: [0..13] has the same length as [1..14] 
  { 
    cards[suitVal * 13 + rankVal] = new Card((Suits)suitVal, (Rank)(rankVal + 1)); // <- removed -1 from index; add 1 to rankVal, we need [1..14], not [0..13]
    ...
于 2013-08-02T05:59:12.150 に答える
1

このようにあなたの行を変更してください

 cards[suitVal * 13 + rankVal] = new Card(((Suit)suitVal), ((ranks)rankVal));

クラスはコンストラクターで列挙型を取得しているため、次のように変更します

public readonly Suit suit;
public readonly ranks rank;
public Card(Suit newSuit, ranks newRank)
{
    suit = newSuit;
    rank = newRank;
}
于 2013-08-02T05:46:55.157 に答える
0

「インデックスが配列の境界外でした」という他のエラーが発生することがわかります

suitVal = 0 かつ rankVal = 0 の場合、cards[suitVal * 13 + rankVal - 1] =-1 は配列インデックスの外側にあります。

于 2013-08-02T06:06:36.940 に答える
0

これはうまくいっていますが、これを修正してください

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

ここ

カード内[suitVal * 13 + rankVal - 1]

[Loop 1:]
suitVal =0
rankVal=0

[suitVal * 13 + rankVal - 1]= [0*13+0-1]= [-1] ! おっとっと!

そしてあなたのプログラムで:

public readonly Suit  suit; //not Suits
public readonly ranks rank; //not Rank 
于 2013-08-02T10:41:56.947 に答える