2013-08-02 16 views
8

Ecco il mio questo è il codice che gettano un errore che dice Cannot convert type "int" to Cards.Suits e Cannot convert type "int" to Cards.RankCome convertire int in enum value?

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

il costruttore carte è

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

Ora la Suits enum e Rank enum sono come un normale mazzo di carte a partire da ACE = 1 e così via e abiti sono DIAMANTI, CLUB, CUORI, SPADE. Qualcuno può dirmi perché sto ottenendo l'errore di cui sopra. Il seguente codice stava prendendo da un libro. Grazie!

* 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

si può mostrare la definizione per '' Suits' e Rank'? –

+0

Non è un duplicato come tale metodo viene utilizzato e restituisce ancora un errore – MikaAK

+1

Stai usando '(Suits) suitVal' ma l'enum che hai postato è in realtà chiamato' Suit'. –

risposta

1

cambiare la vostra riga a come questo

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

e come la classe sta prendendo le enumerazioni nel costruttore in modo da modificare in questo modo

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

Intellisense mi sta ancora indirizzando all'utilizzo di tute Suoni pubbliche di sola lettura; come oppsed alla tua risposta. Dovrei menzionare questa è una libreria di classi. – MikaAK

+0

ho aggiornato la divisa per seme; Stai passando l'enumerazione come parametro che è Suit (nel codice che hai dato sopra). non adatto. – Ehsan

+0

Questo non funziona quando dovevo farlo era Suits.Suit e Ranks.rank – MikaAK

2

Secondo le tue dichiarazioni enum, Suit è nella gamma [0..3], mentre i ranghi sono nella gamma [1..13] (fai attenzione, quella fila è basata non zero), quindi il ciclo for interno deve essere corretta:

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 perché il codice sopra riportato genererà un errore quando sia suitval che runval sono pari a 0. che valuterà queste carte [suitVal * 13 + rankVal - 1] alle carte [- 1]. Quindi l'indice è fuori portata. – Ehsan

+0

@Ehsan Ullah: Grazie, ho corretto l'indice con le carte [...] –

0

vedrò otterrà altro errore "indice era i limiti della matrice"

Quando suitVal = 0 e rankVal = 0, carte [suitVal * 13 + rankVal - 1] = -1 che è al di fuori dell'indice dell'array.

0

Ciò sta funzionando bene ma correggere questo

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

Qui

nelle carte [suitVal * 13 + rankVal - 1]

[Loop 1:] 
suitVal =0 
rankVal=0 

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

e nel tuo prgm:

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