|
Программирование >> Программирование с использованием ajax
Теперь дошло дело и до кода метода PlayGame (), представляющего собой основное тело всего приложения. Большинство деталей этого метода можно прояснить по комментариям в коде. Ничего сложного в нем нет; просто метод довольно велик. Игра продолжается просмотром каждым игроком карт на своих и руках и перевернутой карты на столе. Они могут либо брать эту карту, либо вытаскивать новую из колоды. После вытаскивания карты каждый игрок должен отбрасывать одну карту, либо заменяя карту на столе другой, если та была взята, либо помещая отбрасываемую карту поверх той, что лежит на столе (и тем самым также добавляя ее в коллекцию discardedCards). При просмотре этого кода, который, кстати, приведен ниже, нужно помнить о том, каким образом осуществляется манипулирование объектами Card. Причина того, почему эти объекты определяются как ссылочные типы, а не типы-значения (с помощью структуры), к этому моменту должна стать совершенно ясной. Любой взятый объект Card может существовать одновременно в нескольких местах, поскольку ссылка не него может присутствовать и в объекте Deck, и в полях hand объектов Player, и в коллекции discardedCards, и даже в объекте playCard (представляющем карту, выложенную на стол в текущий момент). Это упрощает отслеживание карт и, в частности, применяется в коде, отвечающем за вытаскивание новой карты из колоды. Карта принимается только в том случае, если ее нет ни на руках у игроков, ни в коллекции discardedCards. Выглядит весь необходимый для этого код следующим образом: public int PlayGameO { Проводить игру только в том случае, если существуют игроки, if (players == null) return -1; Выполнение первой раздачи карт на руки игрокам. DealHands О; Инициализация имеющих отношение к игре переменных вместе с переменной, представляющей первую карту, которая должна выкладываться на стол, то есть переменной playCard. bool GameWon = false; int currentPlayer; Card playCard = playDeck.GetCard(currentCard++); discardedCards.Add(playCard); Главный цикл игры, который должен продолжать выполняться до тех пор, пока не будет соблюдено условие GameWon == true. Проход по игрокам в каждом раунде игры. for (currentPlayer = 0; currentPlayer < players.Length; currentPlayer++) { Считывание информации о текущем игроке, о том, какие карты имеются у него на руках, и том, какая карта в текущей момент выложена на столе. Console.WriteLine ( {О}s turn. , players[currentPlayer].Name); Console.WriteLine( Current hand: ); foreach (Card card in players[currentPlayer].PlayHand) { Console.WriteLine(card); Console.WriteLine( Card in play: {0} , playCard); Вывод игроку приглашения взять карту со стола или вытащить новую, bool inputOK = false; do { Console.WriteLine ( Press Т to take card in play or D to + draw: ); Нажмите T, чтобы взять разыгранную карту, или D, чтобы вытащить новую string input = Console.ReadLine(); if (input.ToLower0 == t ) { Добавление карты со стола на руки пользователю. Console.WriteLine( Drawn: {0} , playCard); Избавление от отброшенных карт, если возможно (в случае перемешивания колоды их там больше быть не должно). if (discardedCards.Contains(playCard)) { discardedCards.Remove(playCard); players[currentPlayer].PlayHand.Add(playCard); inputOK = true; if (input.ToLower 0 == d ) { Добавление на руки пользователю новой карты из колоды. Card newCard; Добавление карты только в том случае, если ее нет ни на руках у игроков, ни в стопке отброшенных карт. bool cardlsAvailable; newCard = playDeck.GetCard(currentCard++) ; Выполнение проверки на предмет того, не находится ли данная карта в стопке отброшенных карт. cardlsAvailable = ! discardedCards.Contains(newCard); if (cardlsAvailable) { Просмотр карт на руках у всех игроков для выяснения того, не находится ли карта newCard у кого-нибудь из них. foreach (Player testPlayer in players) { if (testPlayer.PlayHand.Contains(newCard)) { cardlsAvailable = false; break; } while (!cardlsAvailable); Выдача вытащенной карты на руки игроку. Console.WriteLine( Drawn: {0} , newCard); players[currentPlayer].PlayHand.Add(newCard) ; inputOK = true; } while (inputOK == false); Отображение игроку приглашения отбросить какую-нибудь карту. inputOK = false; int choice = -1; Console.WriteLine( Choose card to discard: ); Выберите карту для отбрасывания string input = Console.ReadLine(); try { Попытка преобразовать введенные данные в допустимый номер карты, choice = Convert.ToInt32(input); if ((choice > 0) && (choice <= 8)) inputOK = true; catch { Игнорирование неудачных попыток преобразования и продолжение вывода приглашения. } while (inputOK == false); Помещение ссылки на удаляемую карту в playCard (выкладывание карты на стол), затем изъятие карты из рук игрока и добавление ее в стопку отброшенных карт. playCard = players[currentPlayer].PlayHand[choice - 1]; players[currentPlayer].PlayHand.RemoveAt(choice - 1); discardedCards.Add(playCard); Console.WriteLine( Discarding: {0} , playCard); Отбрасывание карты Вывод пустой строки для удобства. Console.WriteLine (); Выполнение проверки на предмет того, выиграл ли игрок в этой игре, и если да, осуществление выхода из цикла. GameWon = players[currentPlayer].HasWon(); if (GameWon == true) break; } while (GameWon == false); Завершение игры с указанием выигравшего игрока, return currentPlayer; На рис. 13.8 показана эта игра в действии. Отображение новой раскладки на руках у игрока с нумерацией карт. Console.WriteLine( New hand: ); for (int i = 0; i < players[currentPlayer].PlayHand.Count; i++) { Console.WriteLine( {0}: {1} , i + 1, players[currentPlayer].PlayHand[i]);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |