2013-08-02 34 views
8

Dưới đây là thats mã của tôi ném một lỗi nói Cannot convert type "int" to Cards.SuitsCannot convert type "int" to Cards.RankLàm thế nào để chuyển đổi int thành giá trị enum?

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

các nhà xây dựng thẻ là

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

Bây giờ Suits enum và Xếp hạng enum như một cỗ thường xuyên của thẻ bắt đầu từ ACE = 1 như vậy và phù hợp với DIAMONDS, CLUBS, HEARTS, SPADES. Bất cứ ai có thể cho tôi biết tại sao im nhận được lỗi trên. Đoạn mã sau đã lấy từ một cuốn sách. Cảm ơn!

* 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

Bạn có thể hiển thị các định nghĩa cho 'Suits' và 'Rank'? –

+0

Không phải là một bản sao như phương pháp đó được sử dụng và vẫn trả về một lỗi – MikaAK

+1

Bạn đang sử dụng '(Suits) suitVal' nhưng enum bạn đăng thực sự được đặt tên là' Suit'. –

Trả lời

1

thay đổi dòng của bạn trong cho như thế này

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

và như lớp học của bạn đang enums trong xây dựng để thay đổi nó như thế này

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

Intellisense vẫn đang hướng tôi sử dụng bộ quần áo phù hợp với người đọc công khai; như trái ngược với câu trả lời của bạn. Tôi nên đề cập đến đây là một thư viện lớp. – MikaAK

+0

tôi đã cập nhật Suits suit phù hợp với Suit; Bạn đang đi qua liệt kê như tham số đó là Suit (trong mã bạn đã nêu ở trên). không phải Suits. – Ehsan

+0

Điều này không hoạt động khi tôi phải làm điều đó là Suits.Suit và Ranks.rank – MikaAK

2

Theo khai báo enum của bạn, Suit nằm trong phạm vi [0..3], trong khi xếp hạng nằm trong phạm vi [1..13] (chú ý, thứ hạng đó không zero based), vì vậy bên trong vòng lặp for nên được sửa chữa:

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 vì mã trên sẽ ném một lỗi khi cả hai giá trị hợp lệ và giá trị gia tăng là 0. sẽ đánh giá thẻ này [suitVal * 13 + rankVal - 1] thành thẻ [- 1]. Do đó, chỉ số nằm ngoài phạm vi. – Ehsan

+0

@Ehsan Ullah: Cảm ơn bạn, tôi đã sửa chỉ mục trong thẻ […] –

0

tôi sẽ nhìn thấy nó sẽ nhận được lỗi khác "Index lại vượt ra ngoài giới hạn của mảng"

Khi suitVal = 0 và rankVal = 0, thẻ [suitVal * 13 + rankVal - 1] = -1 nằm ngoài chỉ mục mảng.

0

này đang chạy tốt nhưng sửa này

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

Đây

trong thẻ [suitVal * 13 + rankVal - 1]

[Loop 1:] 
suitVal =0 
rankVal=0 

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

và trong PRGM của bạn:

public readonly Suit suit; //not Suits 
public readonly ranks rank; //not Rank 
Các vấn đề liên quan