Объектно-ориентированные вопросы проектирования - PullRequest
5 голосов
/ 11 мая 2010

Я собираюсь разработать игру Tic-Tac-Toe, используя Java (или, возможно, другие языки OO). Теперь у меня на уме картина общего дизайна.

Интерфейс: Игрок, тогда я смогу реализовать пару классов Игрока, основываясь на том, каким я хочу быть противником, например, случайный игрок, интеллектуальный игрок и т. Д.

Классы: Класс Board с двумерным массивом целых чисел, 0 обозначает открытый, 1 обозначает меня, -1 обозначает противника. Функция оценки также будет здесь, чтобы возвращать следующий лучший ход на основе текущего расположения доски и чей это ход.

Класс рефери, который создаст экземпляр доски и два экземпляра игрока, а затем запустит игру.

Это грубая идея моего ОО дизайна. Кто-нибудь может дать мне какую-нибудь критику, пожалуйста? Я считаю, что это действительно полезно. Большое спасибо.

Ответы [ 5 ]

8 голосов
/ 11 мая 2010

Когда я думаю о структуре объекта, я думаю о своих методах как о выполнении одной из двух вещей:

1) задаю «объекту» вопрос

2) командую «объектом»сделать что-то

При этом мне не имеет смысла спрашивать «доску», каков следующий лучший ход.Доска должна просто содержать значения и сообщать вам о своем состоянии.

Возможно, у меня есть объект, предназначенный для определения лучшего следующего хода для данного «интеллекта».Давайте назовем это «move_brain».Тогда вы можете сказать: «Эй, move_brain, учитывая эту доску и этот уровень интеллекта, какой следующий лучший ход?»

Класс доски, как вы обрисовали его, теперь имеет много обязанностей: удержание состояния, позволяя пользователямдвигаться и думать о том, как двигаться дальше.Это слишком большая ответственность.

И после всего этого я бы сказал так: учитывая, что эта программа не настолько массивна, почти любое решение будет в порядке.

Удачи!

5 голосов
/ 13 мая 2010

Я бы определил 3 интерфейса:

  • Интерфейс игры
  • Интерфейс IPlayer
  • Интерфейс платы

Вот краткий набросок того, что будет у каждого класса:

Игра:

  • игроков (может вместить только 2 игроков)
  • доска (это может быть другой класс или просто двумерная матрица)
  • старт ();
  • рестарт ();

Iplayer:

  • onTurn () (это событие, которое сообщает вам о своей очереди играть)
  • play (int x, int y);
  • onWin () (это событие говорит о том, что вы выиграли)
  • onLose () (вы проиграли)

Вы можете запустить код следующим образом:

IPlayer meAsAPlayer = new UserPlayer(); //you'd have to implement this
                                        //as an "empty" class that would let the user
                                        //specify the actions
IPlayer AIPlayer = new AIPlayer(); //one AI class you'd have implemented
Game game = new Game(meAsAPlayer, AIPlayer);
game.start(); //this would run one game to the end
game.start(); //this would be the second game already

Это будет класс Game, который решит, какие игры будут правильными, а какие нет. Если игрок попытался сделать неправильную игру, он заблокировал бы его и снова вызвал OnTurn () этого игрока. событие.

Чтобы вместо определения интерфейса IPlayer вы могли определить абстрактный класс APlayer, который позволял бы вам только делать правильные движения.

1 голос

Для одного вы захотите использовать некоторые символические значения, такие как перечисления или константы, для представления состояния слотов на вашей доске.

1 голос
/ 11 мая 2010

Общая идея должна состоять в том, чтобы сделать объекты максимально автономными и целеустремленными. Это позволит вам создавать вещи быстрее и плотнее.

Кроме того, не бойтесь моделировать даже самую маленькую фигуру как свою собственную сущность класса. Взаимодействия намного проще, если вы можете моделировать все с высокого уровня непосредственно с самого начала.

1 голос
/ 11 мая 2010

Я бы сказал, что использование меня и оппонента для ходов игрока не совсем правильно. Это должны быть X и Os или первый и второй игрок. Помимо этого, у вас есть начало. Где будет обрабатываться ввод? Рефери или на доске площадь или еще где? А как насчет отслеживания статистики, которая существует за пределами 1 игры?

Просто несколько идей.

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