2014-05-03 29 views
0

我意識到這可能是之前已經問過的,但我一直在尋找,而我從理論上理解我需要做什麼實際上它的工作方式正在暗指我。如何在課堂上定義和訪問列表 - 如何在卡片遊戲中訪問玩家的手

我試圖通過嘗試一個項目來學習C#和麪向對象的編程概念。這個特別的項目是複製頂級王牌遊戲。我的主題將是權力的遊戲。

我的問題是,當我初始化玩家1和計算機手時,我難以置信。我可以看到卡片從甲板上消失,但我無法在玩家的手中看到它們(儘管當我做斷點/引腳來源時,我可以看到cardinHand填充了)

問題是遊戲最終以他們手中的60張卡片(總共)而不是15張(我在創建卡座時加載了30行XML) 你能檢查我的代碼,指出我錯誤的地方嗎?我知道我需要通過卡牌對象,我擔心我只是缺少一些簡單的東西,我覺得這是重要的一部分,因爲我想根據玩家手中的形式顯示卡片。 GameStart方法

public static void startGame() 
    { 
    Player player1 = new Player(); 
    Player computer = new Player(); 

    var newdeck = new Deck(); 
    newdeck.Shuffle(); 

    while (newdeck.CountCards() != 0) 
    { 
     newdeck.dealCards(); 
    } 

    MessageBox.Show("New Game Started"); 

這是我的甲板類

public class Deck 
{ 

private List<Card> deckofCards = new List<Card>(); 


//indexer on the deck 
// Define the indexer, which will allow client code 
// to use [] notation on the class instance itself. 

public Card this[int i] 
{ 
    get 
    { 
     // This indexer is very simple, and just returns or sets 
     // the corresponding element from the internal array. 
     return deckofCards[i]; 
    } 
} 


public Deck() 
{ 
    resetDeck(); 
} 

public void resetDeck() 
{ 

    XmlDocument xmldata = new XmlDocument(); 
    xmldata.Load(@"C:\GameofThronesXml.xml"); 
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldata.NameTable); 

    XmlNodeList nodeList; 
    XmlElement root = xmldata.DocumentElement; 
    nodeList = xmldata.SelectNodes("//CharacterData/record", nsmgr); 

    foreach (XmlElement data in nodeList) 
    { 
     Card singlecard = new Card(); 
     singlecard.CardID = int.Parse(data.SelectSingleNode("./CardID").InnerText); 
     singlecard.Name = data.SelectSingleNode("./Name").InnerText; 
     singlecard.Intelligence = int.Parse(data.SelectSingleNode("./Intelligence").InnerText); 
     singlecard.Ruthlessness = int.Parse(data.SelectSingleNode("./Ruthlessness").InnerText); 
     singlecard.Status = data.SelectSingleNode("./Status").InnerText; 
     singlecard.Prestige = int.Parse(data.SelectSingleNode("./Prestige").InnerText); 
     singlecard.FightingSkill = int.Parse(data.SelectSingleNode("./FightingSkill").InnerText); 
     singlecard.AppearedIn = int.Parse(data.SelectSingleNode("./AppearedIn").InnerText); 
     singlecard.Description = data.SelectSingleNode("./Description").InnerText; 
     deckofCards.Add(singlecard); 
    } 

    //string path = @"C:\GameofThronesXml.xml"; 
    //XElement doc = XElement.Load(path); 
    //deckofCards = (from items in doc.Descendants("CharacterData") 
    //    select new Card(
    //      int.Parse(items.Element("CardID").Value), 
    //      items.Element("Picture").Value, 
    //      items.Element("Name").Value, 
    //      int.Parse(items.Element("Intelligence").Value), 
    //      int.Parse(items.Element("Ruthlessness").Value), 
    //      items.Element("Status").Value, 
    //      int.Parse(items.Element("Prestige").Value), 
    //      int.Parse(items.Element("FightingSkill").Value), 
    //      int.Parse(items.Element("AppearedIn").Value), 
    //      items.Element("Description").Value)).ToList(); 
} 

public void Shuffle() 
{ 

    deckofCards = deckofCards.OrderBy(c => Guid.NewGuid()) 
       .ToList(); 

} 

public int CountCards() 
{ 

    int number = deckofCards.Count(); 
    return number; 

} 

public Card dealCards() 
{ 

    Hand hand = Player.hand; 
    //Hand computerHand = Player.hand; 

    if (this.deckofCards.Count == 0) 
     throw new InvalidOperationException("There are no cards to deal."); 

    Card card = deckofCards[0]; 

    hand.cardsinHand.Add(card); 
    deckofCards.RemoveAt(0); 
    return card; 

} 
} 

手工類

public class Hand 
    { 

    /// <summary> 
    /// The deck in the hand 
    /// </summary> 
    public List<Card> cardsinHand = new List<Card>(); 

    public int GetNumberofCards() 
    { 
     int count = cardsinHand.Count; 
     return count; 
    } 

    public void AddCard(Card card) 
    { 
     cardsinHand.Add(card); 
    } 



} 

Player類

public class Player 
{ 

    public static Hand hand = new Hand(); 


} 

TL;博士 - 想擁有Player類的兩名球員在那裏我可以在這種情況下訪問髮卡數,每個卡15個卡 - 我知道它與hand.cardsinhand.Count有關 - 我只是無法使用定義的播放器類訪問它。

解決方案 -

 Player Player1 = new Player(); 
     Player Computer = new Player(); 

     Deck newdeck = new Deck(); 
     Hand CompHand = new Hand(); 
     Hand PlyrHand = new Hand(); 

     newdeck.Shuffle(); 

     while (newdeck.CountCards() != 0) 
     { 
      //The Hand adds the return dealt cards to the respective lists. 
      CompHand.AddCard(newdeck.dealCards()); 
      PlyrHand.AddCard(newdeck.dealCards()); 
     } 

     MessageBox.Show("New Game Started"); 

     //Snoopy Dance - Each card has 15 cards in each hand. 
     MessageBox.Show(CompHand.cardsinHand.Count().ToString()); 
     MessageBox.Show(PlyrHand.cardsinHand.Count().ToString()); 

回答

1

這段代碼在startGame不斷處理,直到沒有卡左:

while (newdeck.CountCards() != 0) 
{ 
    newdeck.dealCards(); 
} 

dealCards正在訪問的靜態(即由類的所有實例共享)Player.hand,所以所有的卡都加入到了這個。 (我想你在爲兩名球員添加每張牌時得到了60分,而當其中一名球員被註釋掉時,你只能得到30分,就像在問題中那樣)。

你不想全部玩家共享同一隻手,因此請將Player.Hand更改爲不靜態(即刪除static關鍵字)。然後通過你的兩個初始化玩家的牌(player1.handcomputer.hand)作爲參數爲dealCards

public Card dealCards(Hand hand, Hand computerHand) 
... 

我覺得有一些整理做關於哪些類有做什麼(也許張貼到codereview.stackexchange責任一旦你有遊戲的工作),但這種改變應該讓你啓動並運行。

+0

感謝你的支持,這是一個進步,但它抱怨說它不能將玩家類轉換爲手形類。唯一的辦法是如果我將player1.hand傳遞給dealcards方法。 – Decosta

+0

對不起,我的壞。我已經解決了匹配的答案:直接傳遞應該沒問題。你可能還想考慮'dealCards'(爲什麼小寫的D?)應該是'Deck'的一部分(它不是進行交易的套牌) - 也許它屬於單獨的'Game'類?將所有字段('Player.hand','Hand.cardsInHand')設爲私有,然後只添加訪問它們所需的公共方法(就像使用'Deck.deckOfCards'),可能是一個好主意。但看起來你很好。也許我會在完成遊戲後開始玩遊戲吧:-) –

+0

請參閱上文,瞭解我是如何解決這個問題的(在這一點上 - 當我走的時候它是否會工作,我不確定,我只知道每隻手都有相同的牌 – Decosta