2015-10-18 80 views
0

這是作業,擡起頭來。我要寫一個卡牌類,甲板類,必須有Equals(甲板甲板),每8個洗牌應該完全匹配原始甲板,打印20次迭代。我有我的洗牌工作 - 第8次和第16次洗牌是一樣的原始甲板,但等號班不斷返回假。我錯過了一些東西,並一直在仔細研究這一點 - 任何人都可以指導我解決我的錯誤?提前致謝!布爾比較當它應該爲true時返回false

namespace lab2part3 
{ 
    public class DeckOfCards : Card 
    { 
     const int CARDS = 52; 
     private Card[] cards; 

     public void Deck() 
     { 
      cards = new Card[CARDS]; 
      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); 
       } 
      } 
     } 

     public Card GetCard(int cardNum) 
     { 
      if (cardNum >= 0 & cardNum <= 51) 
       return cards[cardNum]; 
      else 
       throw (new System.ArgumentOutOfRangeException("cardNum", cardNum, "Value must be between 0 and 51.")); 
     } 

     public void Shuffle() 
     { 
      Card[] newDeck = new Card[CARDS]; 
      bool[] assigned = new bool[CARDS]; 
      Random sourceGen = new Random(); 

      for (int i = 0; i < 52; i++) 
      { 
       int destCard = 0; 
       bool foundCard = false; 

       while (foundCard == false) 
       { 
        destCard = sourceGen.Next(CARDS); 
        if (assigned[destCard] == false) 
         foundCard = true; 
       } 
       assigned[destCard] = true; 
       newDeck[destCard] = cards[i]; 
      } 
      newDeck.CopyTo(cards, 0); 
     } 

     public void Faro() 
     { 
      Card[] firstDeck = new Card[26]; 
      Card[] secondDeck = new Card[26]; 
      Card[] finalDeck = new Card[CARDS]; 

      Array.Copy(cards, 0, firstDeck, 0, 26); 
      Array.Copy(cards, 26, secondDeck, 0, 26); 

      for (int i = 0, j = 0; i < CARDS; i += 2, j++) 
      { 
       cards[i] = firstDeck[j]; 
       cards[i + 1] = secondDeck[j]; 
      } 
     } 

     public bool Equals(DeckOfCards other) 
     { 
      for (int i = 0; i < CARDS; i++) 
      { 
       if (cards[i] != other[i]) 
       { 
        return false; 
       } 
      } 

      return true; 
     } 

     public Card this[int i] 
     { 
      get { return cards[i]; } 
     } 
    } 
} 

-

namespace lab2part3 
{ 
    public class Card 
    { 
     public enum Suit { H, C, D, S } 
     public enum Rank { _A = 1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _J, _Q, _K } 
     public Suit suit { get; set; } 
     public Rank rank { get; set; } 

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

     public Card() { } 

     public override string ToString() 
     { 
      StringBuilder s = new StringBuilder(rank.ToString()); 
      s.Remove(0, 1); 
      return (s + "" + suit); 
     } 

     public bool Equals(Card other) 
     { 
      return rank == other.rank && suit == other.suit; 
     } 
    } 
} 

-

namespace lab2part3 
{ 
    public class CardTester 
    { 
     public static void Main() 
     { 
      DeckOfCards MyDeck = new DeckOfCards(); 
      DeckOfCards CopyDeck = new DeckOfCards(); 
      Card tempCard = new DeckOfCards(); 
      MyDeck.Deck(); 
      CopyDeck.Deck(); 

      // initial deck setup 
      for (int i = 0; i < 52; i++) 
      { 
       tempCard = MyDeck.GetCard(i); 
       Console.Write(tempCard.ToString()); 

       if (i != 51) 
        Console.Write(", "); 
       else 
        Console.WriteLine(); 

       if (i == 12 || i == 25 || i == 38) 
        Console.WriteLine(); 
      } 

      // 20 looped shuffles 

      for (int j = 0; j < 20; j++) 
      { 
       MyDeck.Faro(); 
       Console.WriteLine("\nShuffle #" + (j + 1) + ":\n"); 
       for (int i = 0; i < 52; i++) 
       { 
        tempCard = MyDeck.GetCard(i); 
        Console.Write(tempCard.ToString()); 

        if (i != 51) 
         Console.Write(", "); 
        else 
         Console.WriteLine(); 

        if (i == 12 || i == 25 || i == 38) 
         Console.WriteLine(); 
       } 

       // compare 
       Console.WriteLine("does this deck equal the original deck? {0}", CopyDeck.Equals(MyDeck)); 

       // print original deck 
       for (int i = 0; i < 52; i++) 
       { 
        tempCard = CopyDeck.GetCard(i); 
        Console.Write(tempCard.ToString()); 

        if (i != 51) 
         Console.Write(", "); 
        else 
         Console.WriteLine(); 

        if (i == 12 || i == 25 || i == 38) 
         Console.WriteLine(); 
       } 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
+2

爲什麼'DeckOfCards'從'Card'繼承?一副撲克牌不是一種特殊類型的卡片 –

+0

我已經對代碼進行了重構,以便您可以看到代碼是如何寫入的 - 也許可以從中學習。它按照描述正確工作。你可以在這裏找到它(https://dotnetfiddle.net/uUmStC)。 – Enigmativity

回答

2

cards[i] != other[i]檢查使用!=操作引用類型時使用(除非你明確地超負荷吧)引用相等。你已經實現了一個Card.Equals方法,用它來代替:

for (int i = 0; i < CARDS; i++) 
{ 
    if (!cards[i].Equals(other[i])) 
    { 
     return false; 
    } 
} 

而是定義新Equals方法,你應該重寫object.Equals方法。 你可以閱讀thisthis article以獲得更多關於C#中的平等的信息。

0

好吧,首先,你的洗牌方法是超在有效的,所以我必須解決這個問題:

public void Shuffle() 
     { 
      Random sourceGen = new Random(); 

      for (int i = 0; i < 52; i++) 
      { 
       Card temp = cards[i]; 
       int pos = sourceGen.Next(CARDS); 
       cards[i] = cards[pos]; 
       cards[pos] = temp; 


      } 
     } 

至於你的問題,你需要兩個對象的數據之間的比較。

for (int i = 0; i < CARDS; i++) 
      { 
       if (!cards[i].Equals(other[i])) 
       { 
        return false; 
       } 
      } 

第三,DeckOfCards不應Card繼承,他們沒有任何關係

所述的方法,public void Deck應該DeckOfCards

1

變化的構造......

public bool Equals(DeckOfCards other) 
{ 
    for (int i = 0; i < CARDS; i++) 
    { 
     if (cards[i] != other[i]) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

對此改爲...

public bool Equals(DeckOfCards other) 
{ 
    for (int i = 0; i < CARDS; i++) 
    { 
     if (!cards[i].Equals(other[i])) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

晚自習適當的方式來覆蓋的Object.Equals,以及處理運算符重載的!=等

+0

謝謝 - 這解決了我的整個問題! – JRags

相關問題