2013-08-02 16 views
8

Hier ist mein Code, das ist ein Fehler werfen Cannot convert type "int" to Cards.Suits und Cannot convert type "int" to Cards.RankWie konvertiert man int in enum Wert?

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

die Karten Konstruktor ist

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

Nun ist die Anzüge Enum und Rang Enum sagen, wie ein regelmäßiges Kartenspiel bei ACE Start = 1 usw. und Anzüge sind DIAMANTEN, CLUBS, HEARTS, SPADES. Kann mir jemand sagen, warum ich den obigen Fehler bekomme. Der folgende Code entnahm einem Buch. Danke!

* EDIT

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

    public enum Suit 
    { 
     DIAMOND, 
     CLUB, 
     HEART, 
     SPADE, 
    } 
+0

zeigen Ihnen die Definition für 'Suits' und' Rank'? –

+0

Kein Duplikat, da diese Methode verwendet wird und trotzdem einen Fehler zurückgibt – MikaAK

+1

Sie verwenden '(Suits) suitVal', aber die von Ihnen gepostete Enum wird eigentlich' Suit' genannt. –

Antwort

1

Änderung Ihrer Linie in für wie diese

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

und als Klasse Aufzählungen in Konstruktor nehmen wird, so dass es wie dieser nach

public readonly Suit suit; 
public readonly ranks rank; 
public Card(Suit newSuit, ranks newRank) 
{ 
    suit = newSuit; 
    rank = newRank; 
} 
+0

Intellisense leitet mich immer noch zur Verwendung der öffentlichen readonly Suits Anzug; wie zu deiner Antwort opfernd. Ich sollte erwähnen, dass dies eine Klassenbibliothek ist. – MikaAK

+0

Ich habe Suits Suit zu Suit Suit aktualisiert; Sie übergeben Enumeration als Parameter, der Suit ist (in dem Code, den Sie oben angegeben haben). nicht passt. – Ehsan

+0

Dies funktioniert nicht, wenn ich es tun musste, es war Suits.Suit und Ranks.rank – MikaAK

2

ändern Ihre Enum-Deklarationen, Suit ist im [0..3] Bereich, während Ränge im [1..13] Bereich sind (achten Sie darauf, diese Ränge nicht Null basiert), so dass die inneren for-Schleife korrigiert werden sollte:

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] 
    ... 
+0

-1, weil der obige Code einen Fehler wirft, wenn sowohl suitval als auch ranval 0 sind, was diese Karten [suitVal * 13 + rankVal - 1] zu Karten [- 1] auswerten wird. Daher Index außerhalb des Bereichs. – Ehsan

+0

@Ehsan Ullah: Danke, ich habe Index in Karten korrigiert [...] –

0

werde ich sehen, daß es andere Fehler erhalten wird „Index außerhalb der Grenzen des Arrays war“

Wenn suitVal = 0 und rankVal = 0, Karten [suitVal * 13 + rankVal - 1] = -1 was außerhalb des Array-Index steht.

0

Das läuft gut aber korrigieren

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

Hier

Karten [suitVal * 13 + rankVal - 1]

[Loop 1:] 
suitVal =0 
rankVal=0 

[suitVal * 13 + rankVal - 1] = [0 * 13 + 0 -1] = [-1]! Hoppla!

und in Ihrem prgm:

public readonly Suit suit; //not Suits 
public readonly ranks rank; //not Rank