Помощь в разработке шахматной игры - PullRequest
2 голосов
/ 25 сентября 2010

Я программист на C ++, пытающийся научиться проектировать, вначале я пытаюсь научиться проектировать, поставив перед собой задачу создать ОО-дизайн для игры в шахматы. Это не домашняя работа, а просто попытка развивать некоторые навыки. Вот краткое изложение того, что я имею в виду до сих пор: Класс "Piece", который будет хранить текущую позицию фигуры на доске. специализированные классы "Верблюд", "Лошадь", "Королева", "Рыцарь", "Пешка" и "Слон", которые будут производными от класса "Кусок". Каждый из этих классов будет содержать по 2 члена: «Нет мест, в которых разрешено перемещаться» и «Правило перемещения», и методы get для его получения.

Базовый класс "Player", который будет расширен за счет классов "BlackPiecePlayer" и "WhitePiecePlayer". Каждый из этих классов будет содержать другой экземпляр класса под названием «PieceManager». Класс «PieceManager» будет определять логику перемещения фигур на доске.

Класс "Шахматная доска", который будет содержать отображение всех фигур на доске и иметь доступ к набору правил, с помощью которых можно перемещать фигуры. Он предоставит интерфейсы для проверки подлинности перемещения, рассчитанного «PieceManager», а затем выполнит перемещение при обновлении своих собственных сопоставлений.

Вот общий поток, который я могу визуализировать. Классу «WhitePiecePlayer» предлагается сделать ход, он попросит собственный «WhitePieceManager» сделать ход. «WhitePieceManager» будет получать доступ к позициям фигур на доске, используя интерфейсы класса «Board». Затем он будет использовать свою внутреннюю логику для расчета перемещения для фигуры. Каждая фигура сохраняет свою позицию, чтобы вычислить позицию для этой фигуры. Затем аутентифицировать перемещение можно, вызвав метод класса Board, а затем выполнить перемещение, используя интерфейс класса Board ... и т. Д.

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

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

Несколько предложений

  • Ваша иерархия классов, связанных с фигурками, кажется разумной (хотя использование имен для фигур, рыцарей и грабителей, вероятно, предпочтительнее лошадей, верблюдов и слонов).
  • Я бы не стал хранить количество квадратов, которым разрешено перемещать фигуру. Вы хотели бы закодировать это в методе «правила движения» хотя бы потому, что это может меняться в зависимости от ситуации. Пешка может передвигаться на два поля в своем начальном движении и затем на один квадрат в последующих ходах. Король может двигаться только на одну клетку, если только он не рокирует.
  • Ваши классы фигур должны иметь какой-то метод, чтобы получить список всех допустимых ходов фигур, чтобы предоставить их движку, который собирается выбрать ход.
  • Вам не нужны классы BlackPiecePlayer и WhitePiecePlayer. Вам просто нужно создать два экземпляра класса Player и убедиться, что есть атрибут «color».
  • Класс ChessBoard является хорошей идеей и должен представлять позиции фигур, но он не должен реализовывать логические оценки ходов. Это то, что нужно сделать двигателю движения.

Как обсуждает Хавьер, создание шахматной программы, скорее всего, потребует немало усилий для разработки эффективного алгоритма выбора хода. Предполагая, что вы намереваетесь применять концепции ОО, а не углубляться в дискуссии о том, как создать шахматный движок (который часто жертвует ОО-чистотой, для повышения производительности), и предполагать, что вы хотите создать что-то, что может играть достаточно хорошо, Интересно, что вы можете рассмотреть возможность реализации antihess вместо обычных шахмат. С точки зрения ОО, это, по сути, идентичная проблема, но конечный результат - это то, что играет неплохо, не тратя сотни часов на освоение шахматных алгоритмов. Это гораздо более приятный результат, чем шахматная программа, которая играет ужасно.

1 голос
/ 25 сентября 2010

Несколько комментариев

1) Самая важная вещь в шахматном прграме - это алгоритм выбора хода. Обычно это алгоритм обрезки альфа-бета. Для того, чтобы этот алгоритм был эффективным, очень важно, как представлены фигуры на доске. Вы можете прочитать это в этом разделе о реализации раздела википедии. Я прочитал бы это для основы представления доски. В интернете много дискуссий и таких открытых движков, как Crazy или Fruit. Я сомневаюсь, что они используют OO, хотя - я не знаю, есть ли какой-либо объектно-ориентированный движок в дикой природе.

2) Что такое верблюд, слон и т. Д.? Какие шахматы вы пытаетесь изобразить? Я не знаком с этим, извините. Является ли слон ладьей, а верблюд епископом?

3) В чем заключается полезность наличия двух разных классов, WhitePlayer и BlackPlayer? Чем они будут отличаться от игрока? Разве у вас не должно быть двух разных экземпляров класса Player, называемых белым и черным?

Удачи в вашем проекте. Я надеюсь, что вы многому научитесь из этого! :)

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