2013-03-17 71 views
1

我正在創建一個BlackJack遊戲,並且到目前爲止我已創建一個卡類 和Deck Class,我給我的甲板類打印功能以查看是否創建了 卡並對它們進行了洗牌正常。但是,當我運行該程序時,我得到這個 錯誤,分段錯誤:11,但構建成功。分段錯誤:11 - 但建立成功

主類

using System; 
    using System.Collections.Generic; 
    using System.Text; 

    namespace BlackJackGameX 
    { 
     public class MainClass 
     { 
      public static void Main (string[] args) 
      { 

       Deck CardDeck = new Deck(); 

       CardDeck.Print(); 

      } 
     } 
    } 

卡類

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace BlackJackGameX 
{ 
    public enum Suit {Spades, Hearts, Clubs, Diamonds} 
    public enum FaceValue {Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King} 

    public class Card 
    { 
     public Suit CardSuit; 
     public FaceValue CardValue; 
     public int iValue; 

     public Card (Suit cardSuit, FaceValue cardValue, int ivalue) 
     { 
      CardSuit = cardSuit; 
      CardValue = cardValue; 
      iValue =ivalue; 
     } 

     public Card() 
     { 

     } 
    } 
} 

甲板類

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace BlackJackGameX 
{ 
    public class Deck 
    { 
     Random rNumber = new Random(); 

     List<Card> Cards; 

     public int iValue1 = 11; 
     public int iValue2 = 2; 
     public int iValue3 = 3; 
     public int iValue4 = 4; 
     public int iValue5 = 5; 
     public int iValue6 = 6; 
     public int iValue7 = 7; 
     public int iValue8 = 8; 
     public int iValue9 = 9; 
     public int iValue10 = 10; 
     public int iValue11 = 10; 
     public int iValue12 = 10; 
     public int iValue13 = 10; 

     public Deck() 
     { 
      Cards = NewDeck(); 
      Shuffle(); 
     } 

     public void Shuffle() 
     { 

      for (int i = 0; i <= 51; ++i) 
      { 
       int c = rNumber.Next (1, 53); 

       Cards.Add(Cards[c]); 
      } 
     } 

     private List<Card> NewDeck() 
     { 
      var AllSuits = new Suit[] 
      { 
       Suit.Spades, 
       Suit.Hearts, 
       Suit.Clubs, 
       Suit.Diamonds 
      }; 

      var AllFaces = new FaceValue[] 
      { 
       FaceValue.Ace, 
       FaceValue.Two, 
       FaceValue.Three, 
       FaceValue.Four, 
       FaceValue.Five, 
       FaceValue.Six, 
       FaceValue.Seven, 
       FaceValue.Eight, 
       FaceValue.Nine, 
       FaceValue.Ten, 
       FaceValue.Jack, 
       FaceValue.Queen, 
       FaceValue.King 
      }; 

      var AllValues = new int[] 
      { 
       iValue1, 
       iValue2, 
       iValue3, 
       iValue4, 
       iValue5, 
       iValue6, 
       iValue7, 
       iValue8, 
       iValue9, 
       iValue10, 
       iValue11, 
       iValue12, 
       iValue13 
      }; 

      for (int i = 0; i <= 3; i++) 
      { 
       for (int j = 0; j <= 12; j++) 
       { 
        Card newCard = new Card(AllSuits[i], AllFaces[j], AllValues[j]); 
        NewDeck().Add(newCard); 
       } 
      } 

      return NewDeck(); 
     } 

     public void Print() 
     { 
      Console.WriteLine(Cards[1].CardSuit); 
      Console.WriteLine(Cards[1].CardValue); 
      Console.WriteLine(Cards[1].iValue); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

你在遞歸調用newDeck()很多地方沒有多大意義.. – Oren 2013-03-17 16:20:07

+0

這是在單聲道? – tomsv 2013-03-17 16:21:04

+0

是的,我正在使用單聲道 – 2013-03-17 16:40:30

回答

2

您的問題在方法private List<Card> NewDeck()中的Deck類中。當您編寫NewDeck().Add(newCard);時,您一次又一次地調用遞歸函數,直到發生堆棧溢出。解決的辦法是爲你的牌組定義一個新的本地List<Card>變量,你要添加牌並返回這個變量而不是NewDeck()

就在你的兩個for循環添加List<Card> myDeck = new List<Card>();和改線NewDeck().Add(newCard);myDeck.Add(newCard);return NewDeck();return myDeck;

+0

溢出棧確實是另一種獲得分段錯誤的方法。 – Jean 2013-03-17 16:24:25

+0

工作完美,非常感謝你,我一直試圖讓這工作幾天[: – 2013-03-17 16:44:13

1

當生成是這意味着編譯器能夠從您的代碼生成目標二進制文件。但是,這並不意味着你的應用沒有bug。這僅表示彙編成功。

A Segmentation fault是一個內存錯誤,它發生在運行時。所以你必須首先有一個成功的構建。這是預料之中的。

你需要做的是調試你的代碼,以確定爲什麼發生這種內存錯誤。

你是否解除引用NULL指針?你是否正在執行超出數組限制的操作?你溢出一個緩衝區(並覆蓋一個指針)?這些是seg的常見原因。故障。錯誤。

所以,我會說你的問題是更多關於調試(如何調試分段錯誤錯誤)。爲此,我們需要知道在什麼情況下發生了錯誤。