2015-08-28 3 views
-1

Я реализую небольшую игру в терминале, используя C#, игру «четыре в ряд». Я покончил с реализацией (игра воспроизводится), но я хочу немного переработать ее в отношении объектно-ориентированного дизайна.Дизайн класса для маленькой игры

скажем, у меня есть несколько классов: игра, доска, игрок, сообщение и т. Д., Хранящие информацию об ассоциировании объектов.

Как и в случае с текущим дизайном и реализацией, объект игры состоит из объекта Board, нескольких других свойств игры (текущий цвет, следующий цвет, currentTurn и т. Д.) И список игроков, на которые ссылаются объекты Player. Игрок может быть либо пользователем, либо процессором, в зависимости от того, какой переход происходит от пользовательского ввода или вычисляется каким-либо AIPlayer соответственно (для этого я создаю класс AIPlayer, наследующий от Player, и соответственно переопределяет метод MakeAMove().

Другие проектные решения включают в себя наличие классов Server/Client с функцией main() для запуска игры, получения данных сокетов и отображения уведомлений, классов Client/ServerHandler для обработки игровой логики и вызова других классов выше.

Ответственность за принятие решения если ход действителен или он получает очко, тем не менее, остается класс Game, который, очевидно, должен управлять объектом Board.

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

  1. Объекта игры принимает входной и изменяет его собственное состояние (включая обновление его игроки должны один заработает точку) как Игра состоит из списка объектов игрока ,

  2. Это объект игрока, который получает его ход (ввод пользователя или вычисление процессора) и обновляет состояние игры. При этом нет никакой связи между игроком и игрой, и игрок обновляет свой счет в соответствии с тем, что возвращается методом объекта Game.

Мой вопрос: Моя игра работает, используя (1), но думать над тем, что если (2) является более подходящим (т.е. больше OO чиста, как есть меньше связь между Игроком и игры). Но если это (2) использовать, то как мне связать игру и игрока (как я должен связать точку игрока с игрой)?

+2

Каков ваш вопрос? –

+0

@WinterMute Прежде чем рекомендовать что-нибудь, прочитайте раздел справки на этом веб-сайте. Это не касается темы обзора кода, так как нет кода для проверки. Из того, что я могу прочитать, код еще не закончен, а O.P спрашивает, как что-то писать. Это три причины не по теме. –

+0

http://gamedev.stackexchange.com/ – Bauss

ответ

1

Эта проблема слишком велика, чтобы просто предоставить один ответ. Нужно будет посмотреть, что у вас есть, и сделать предложения по рефакторингу. Книга, которая действительно помогла мне с моим мышлением ООП, была Design Patterns: Elements of Reusable Object-Oriented Software. Это очень популярная книга, и я очень рекомендую ее.

Что касается вашего Player и независимо от того, управляется ли оно AI, вы можете использовать аналогичный подход, как то, что они делают в Grand Theft Auto (GTAV, чтобы быть конкретным), Reassembly или некоторых других популярных играх. Каждый объект контролируется извне, независимо от того, что контролирует его. Таким образом, вы можете переключаться между игроком и AI во время выполнения.

Существует несколько различных способов приблизиться к этому. Одним из способов было бы инкапсулировать какой-то EntityIntelligence в Player, который может быть расширен по мере необходимости (для игрока и AI).

Наконец, на самом деле может быть лучше пойти с метод 1, sorta .. В этом случае кусок должен сделать запрос на плату, чтобы изменить, и плата должна внести соответствующие изменения в себя. Таким образом, вы получите лучшее из обоих миров!

Удачи вам в игре и сообщите мне, есть ли что-нибудь, что мне нужно для уточнения!

+1

Один из способов также может состоять в том, чтобы символы были «куклами»: они выставляют методы для выполнения определенных действий. Класс 'Controller' будет управлять« Player ». Таким образом, вы можете переключаться между несколькими «мозгами» AI, пользовательским управлением и даже разрешать управление сетью (многопользовательская игра)! –

+0

@ IsmaelMiguel Я полностью согласен с этим! Это действительно то, что я пытался сказать, но вы сформулировали это намного лучше. Угадайте, что это карма для того, чтобы быть на телефоне ... –

+0

@ IsmaelMiguel Действительно, у меня есть класс контроллера, который получает сообщение от игрового клиента, извлекает его для кода сообщения (новая игра, выход, новый ход и т. Д.) И вызывает другие объекты соответственно – tab87vn

Смежные вопросы