Вы беспокоитесь не только о том, как изобразить доску, но также и о том, как изобразить фигуры, потому что доска и фигуры должны сообщать об их взаимном присутствии и эффектах.
Следовательно, то, как вы представляете свою доску, будет зависеть от того, как вы представляете свои фигуры и правила игры, ограничивающие доску и фигуры.
Ваша первая задача - как изобразить произведения.
Игровой элемент или игровой автомат - идеальная модель для объектно-ориентированного программирования.
Позвольте мне проиллюстрировать это, отказавшись от таких объявлений, как public, static и т. Д.
abstract class BasicUnit
{
// determine constraints of movement here.
// update position and return new position
abstract Position move(Direction d);
abstract Position getPosition();
Arsenal arsenal;
}
class Worker
extends BasicUnit
{
Position move(Direct d)
{
//whateveer, etc
}
}
class farmer
extends Worker
{
Position move(Direct d)
{
//whateveer, etc
}
}
class Warrior
extends BasicUnit
{
Position move(Direct d)
{
//whateveer, etc
}
}
class Sniper
extends Warrior
{
Position move(Direct d)
{
//whateveer, etc
}
}
Теперь вам нужно решить, будет ли положение фигур на доске
- доска ориентирована: позиции фигур регистрируются только на доске
- шт. В центре: позиции регистрируются только на фигурах
- избыточный: вы должны избыточно обновлять и фигуру, и доску, когда фигура перемещается.
Для большинства настольных игр центрирование по частям не было бы хорошей идеей, потому что вам пришлось бы искать каждую фигуру, чтобы определить, занята ли позиция.
Если доска ориентирована, вам нужно будет искать каждую позицию доски, чтобы найти позицию фигуры.
В случае избыточности вы должны убедиться, что позиции, зарегистрированные как доской, так и фигурами, не выровнены. Если вы планируете разрешить играть в свою игру через Интернет, где сеансы можно приостанавливать и переводить в спящий режим - у вас могут возникнуть проблемы с синхронизацией.
Итак, ответ на ваш вопрос - хешированный вектор для представления доски.
Хешированный вектор - это коллекция с двумя дверями доступа: одна доступна по позиции, вторая - по ключу. Ваш хешированный вектор позволит вам получить доступ к
- доска по позиции, чтобы узнать, какая единица находится на позиции
- идентификатор фигуры, чтобы узнать, где она находится на доске.
Вы не можете представлять доску в виде дерева, если у вас нет многомерной настольной игры. Дерево необходимо, когда у вас есть дерево, лестница или замок, который находится на позиции доски, так что, когда юнит достигает этого горизонтального положения доски, ему необходимо продвинуться к вертикальному положению лестницы или замка. , А в замке отряд нужно отвести в многочисленные комнаты. Или на дереве есть ведьма, способная захватить отряд в бутылку с запутанным выходом. Следовательно, использование древовидной структуры для представления вашей доски было бы ненужным осложнением при программировании вашей игры.
Неважно, является ли это квадрат алмаза или круга и т. Д. Вам просто нужно перечислить положение доски. Метод перечисления должен быть удобным для ваших правил для захвата.
Это означает, что вы не должны перечислять один кусок как (1,3), а затем перечислять соседний кусок как (2,7) - это просто здравый смысл. Поскольку соседями (1,3) являются (0,2), (1,2), (2,2), (0,3), (2,3), (0,4), (1,4 ) и (2,4), но не (2,7).
Поэтому вам нужен двумерный хэшированный вектор.
Чтобы удовлетворить вашу потребность выяснить, какая единица находится на позиции x, y вашей доски:
BasicUnit getPosition(x,y)
Кроме того, выяснение (x, y) позиции юнита.
Position getUnit(BasicUnit unit)
Тогда вы можете запланировать, что ваша игра будет расширяемой, чтобы игрок, достигший победы, мог перейти на следующий уровень, имеющий другую форму доски. Ваш двумерный хэшированный вектор все равно будет использоваться, поскольку вы отделяете уровень представления программного обеспечения от его структуры данных.
Вы просто вставляете больше позиций в свой вектор.
Вы можете посмотреть мою Java-реализацию 1-D хешированного вектора на
http://code.google.com/p/synthfuljava/wiki/HashVector
переведите его на свой язык программирования и добавьте к нему еще одно векторное измерение.