Ищу советы по объектно-ориентированному программированию - PullRequest
2 голосов
/ 21 февраля 2011

Я не уверен, смогу ли я выразить это разумно.

Я пытаюсь написать простую неграфическую игру.Пользователь будет играть в игру в кости против компьютера.

(Если быть более точным, эта игра: цель игры в кости «Свинья» - стать первым игроком, набравшим 100 очков. Ход каждого игрока состоит из неоднократно.бросание кубика. После каждого броска игрок сталкивается с двумя вариантами: бросить снова или удерживать (отказаться от броска снова).

  • Если игрок бросает 1, игрок ничего не получает истановится ходом противника.
  • Если игрок бросает число, отличное от 1, число добавляется к общему количеству хода игрока, и ход игрока продолжается.
  • Если игрок удерживает, общее количество ходасумма бросков за ход добавляется к счету игрока и становится ходом противника.)

Я написал программу, но теперь хочу сделать это в объекте.ориентированный путь.Это моя проблема:

У меня есть абстрактный класс Player.Класс Human_player и класс Computer_player расширяют класс Player.Другой класс, называемый Game_Controller, контролирует ход игры.Скажем, у Computer_Player есть определенная стратегия, что, если «начальная сумма» меньше 20, он продолжает бросать кости (что означает, что он находится в определенном цикле).С другой стороны, Game_Controller продолжает бросать кубики для Computer_Player столько времени, сколько он пожелает и сколько сможет (это означает, что эта часть программы находится в определенном цикле).Поэтому, когда Computer_Player выбрасывает «1», Game_Controller дает ход Human_Player.Как заставить Compter_Player завершить его цикл?

Более того, мне трудно реализовать Computer_Player в качестве конкретного игрока (потому что я новичок в программировании, и я особенно новичок в этом видевзаимодействие).Как правильно обращаться с этим? --- То есть класс Game-Controller взаимодействует с классом Computer_Player, а класс Computer_Player взаимодействует с классом Game_Controller.

Спасибо, что сэкономили ваше время.

Редактировать1: Есть ли хороший источник (веб-сайт, книга) о таких вещах?Я не ищу эти продвинутые исходники для программирования игр, просто простые и фундаментальные вещи.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Игрок либо active, либо inactive.Как только он активен, он должен принять решение до roll() или hold().У каждого игрока есть стратегия для этого процесса принятия решения - игрок-человек имеет в виду стратегию , компьютерному игроку нужна стратегия, реализованная в коде.Эта стратегия может предложить метод: decide(int myScore, int oppenentsScorce) и дать результат: катиться или не катиться .

Класс Player может выглядеть следующим образом:

 public class Player {
   enum Decision { ROLL, HOLD }
   private Controller gameController;
   public Player(Controller gameController) {
      this.gameController = gameController;
   }

   // this is the real players strategy (-> Strategy pattern)
   abstract Decision decide(int myScore, int opponentsScore); 

   // this method is called by the controller
   public void doTurn() {
     Decision decision = decide(gameController.getScore(this), gameControlle.getOpponentsScore(this);
     if (decision == ROLL)
        gameController.roll(this);
     if (decision == HOLD)
        gameController.hold(this);
   }
 }

Подкласс HumanPlayer может открыть диалог для игрока-человека, который показывает реальные результаты и предлагает две кнопки: вращение / удержание.Реализация ComputerPlayers будет использовать алгоритм для принятия решения.

Контроллер контролирует игру, бросает кости и сохраняет счет.И контроллер проверяет после каждого хода, есть ли победитель.

0 голосов
/ 21 февраля 2011

Если Player предоставляет метод DoYouWantToThrow, конкретные классы могут реализовать это с решением вернуть true или false.Если бросок приводит к 1, игровой контроллер не будет вызывать этот метод вообще.Для любого другого значения рассчитывается оценка, и вопрос представляется игроку.Если игрок является игроком-человеком, этот метод реализует диалог с вопросом для пользователя.Для компьютерного проигрывателя вопрос реализован в виде логики, которая выглядит следующим образом (псевдокод).

return 
  (self.TurnScore < 20) or // Always throw again if under 20.
  (self.Bravery <= 1 and self.TurnScore < 25) or // Scared
  (self.Bravery = 2 and self.TurnScore < 40) or // Moderate
  (self.Bravery = 3 and self.TurnScore < 70) or // Gambler
  (self.Bravery = 4); // All or nothing

Таким образом, компьютерный проигрыватель фактически не имеет цикла.Его только спрашивают, хочет ли он снова бросить.Цикл фактически находится в игровом контроллере и прерывается, если бросок приводит к 1, или ThrowAgain возвращает False или когда последний бросок заставляет игрока достичь 100. В примере я добавил некоторый простой уровень храбрости.Вы также можете добавить некоторую случайность, но суть та же: компьютер только решает, бросать ли снова или сдавать ход.Цикл находится в игровом контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...