2010-06-06 2 views
2

Я сейчас преподаю себе цель C. Я прошел через учебные пособия, но я считаю, что лучше всего учусь, когда проваливаю свой собственный проект, поэтому я приступил к созданию приложения для нарды.Объект C архитектура вопрос

Теперь, когда я частично, я понимаю, что есть некоторые общие архитектурные вещи, которые я просто не понимаю.

Я создал класс «игрока», класс «штука» и класс «доска». Кусок теоретически принадлежит как игроку, так и доске. Например, у игрока есть цвет, и каждый ход делает ход; поэтому игрок владеет своими кусками. В то же время, когда вы перемещаете кусок, он должен проверить, действительно ли это движение, есть ли куски на доске и т. Д.

Из моего чтения кажется, что он нахмурился, чтобы добраться до классов. Например, когда игрок делает ход, где должна жить функция, которая перемещает кусок? Должна ли она существовать на борту? Это было бы моим инстинктом, поскольку совет должен решить, действителен ли какой-либо шаг; но часть должна инициализировать этот запрос, поскольку его перемещаемый, нет?

Любая информация, чтобы помочь noob будет оценена по достоинству. Спасибо, парни!

+4

Я бы сказал, что это не имеет особого отношения к Objective-C, а к OOP вообще. –

ответ

1

Я думаю, что вы, вероятно, над разработкой своей иерархии классов. Хорошее эмпирическое правило состоит в том, чтобы начать с нескольких классов, функциональность которых не перекрывается, а затем реорганизовать ваш общий дизайн по требованию, когда вы расширяете свою программу.

Класс для моделирования каждого игрока может вообще не понадобиться. Я бы начал с того, что у меня был класс, который управлял «состоянием» игры в нарды, а именно, чей ход, если кубики были перевернуты, при необходимости сверните кости, состояние всех 24 очков + бар + «выключено» «для каждого игрока, состояние куба удвоения, текущая длина совпадения и текущий счет для каждого игрока. (Я написал диплом магистра в области нарды, в том числе программу командной строки для игры в игры, поэтому я довольно хорошо понимаю этот домен.)

@Mark Bessey У меня, конечно же, не было бы дизайна, в котором кусок (checker) знает как двигаться сам.

@Felixyz Определение юридического действия на самом деле немного сложнее в нардах, чем в шахматах. Это особенно актуально, если вы хотите создать полный список юридических ходов в любой момент.

+0

Я только сказал, что вы * можете * сделать так. Независимо от того, хотите ли вы, зависит от общего дизайна. –

2

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

Самое главное не в том, что каждый класс имеет внутренне согласованный набор данных и операций. Таким образом, может иметь смысл иметь «доску», способную ответить на вопрос «это действительный ход», но у игрового устройства есть логика для перемещения из одного места в другое. Кроме того, у вас может быть «игровой» объект, который отслеживает все состояние игры и имеет объект «правил», который позволяет вам играть в игру по разным правилам.

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

0

Прежде всего, вы должны отделить концептуально все, что связано с графическим представлением и анимацией от базовой логики игры. Мой answer to this question, вероятно, имеет отношение к вашей ситуации.

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

Моим первым делом было бы: объект игрового менеджера отслеживает движение, когда пользователь тянет кусок вокруг. Когда кусок входит в конкретный треугольник, менеджер вызывает метод (сам по себе), чтобы проверить, действительно ли перемещено и отображает красную или зеленую рамку, например. Когда пользователь отпускает кусок на действительный треугольник, менеджер сообщает, что плата обновляется. Возможно, объект платы не должен быть больше, чем массив.

Обратите внимание, что здесь существует постоянное взаимодействие между логическим кодом и графическим кодом. Когда предмет перетаскивается, вам нужно наглядно проверить, находится ли он внутри треугольника или область, окружающая треугольник. Затем вам нужно выяснить, какой объект (или просто индексировать в массив) в логике это соответствует для проверки.

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

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