我意識到這可能是之前已經問過的,但我一直在尋找,而我從理論上理解我需要做什麼實際上它的工作方式正在暗指我。如何在課堂上定義和訪問列表 - 如何在卡片遊戲中訪問玩家的手
我試圖通過嘗試一個項目來學習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());
感謝你的支持,這是一個進步,但它抱怨說它不能將玩家類轉換爲手形類。唯一的辦法是如果我將player1.hand傳遞給dealcards方法。 – Decosta
對不起,我的壞。我已經解決了匹配的答案:直接傳遞應該沒問題。你可能還想考慮'dealCards'(爲什麼小寫的D?)應該是'Deck'的一部分(它不是進行交易的套牌) - 也許它屬於單獨的'Game'類?將所有字段('Player.hand','Hand.cardsInHand')設爲私有,然後只添加訪問它們所需的公共方法(就像使用'Deck.deckOfCards'),可能是一個好主意。但看起來你很好。也許我會在完成遊戲後開始玩遊戲吧:-) –
請參閱上文,瞭解我是如何解決這個問題的(在這一點上 - 當我走的時候它是否會工作,我不確定,我只知道每隻手都有相同的牌 – Decosta