Лучшая структура данных для представления игрового поля - PullRequest
6 голосов
/ 07 августа 2009

Я пытаюсь перенести настольную игру в компьютерный мир, и доска состоит из 16 мест, 6 для каждой стороны и 4 в середине. Доска имеет ромбовидную форму, и два ее конца представляют собой основы обеих команд. В игре пеисы движутся только вперед к базе противника (конечно, с особыми способностями). Итак, вот мой вопрос: как вы думаете, какая структура данных лучше всего представляет игровое поле? разум был деревом, но мне действительно не нравилась идея, потому что было бы два «корня». Любые предложения?

Доска выглядит так:

    &
   & &
 &  &  &
*  *  *  *
 $  $  $
  $  $
    $

, поэтому команда & может двигаться только к команде $ и наоборот, * будучи нейтральной территорией

Ответы [ 5 ]

11 голосов
/ 07 августа 2009

Это по сути квадрат? Форма ромба просто вопрос толкования? Вот так ..

M A A A
B M A A
B B M A
B B B M

Если это так, возможно, просто используйте 2D-массив и используйте свою систему отображения, чтобы «превратить его» в ромб.

редактировать

Я думаю, что вы можете отобразить, что вы перемещаете набор в массив - если ваши фигуры '$' перемещаются только вверх и влево или вверх и вправо, это сродни моим фигурам 'B', перемещающимся только вверх или 'право'. Аналогично, если фигуры «&» движутся только вниз и влево или вниз и вправо, это похоже на фигуры «А», движущиеся только вниз или влево.

Идея состоит в том, что внутри программы вы должны думать о своих данных «вверх и вниз», но когда вы представляете свое игровое состояние своему пользователю, просто рисуйте в конфигурации алмаза.

4 голосов
/ 07 августа 2009

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

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

Ваша первая задача - как изобразить произведения.

Игровой элемент или игровой автомат - идеальная модель для объектно-ориентированного программирования.

Позвольте мне проиллюстрировать это, отказавшись от таких объявлений, как 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

переведите его на свой язык программирования и добавьте к нему еще одно векторное измерение.

1 голос
/ 07 августа 2009

Как насчет двух деревьев с четырьмя одинаковыми средними полями?(Я имею в виду ссылки на одни и те же объекты)

0 голосов
/ 07 августа 2009

Почему бы не использовать простую структуру массива? Если доска имеет ромбовидную форму, она квадратная / прямоугольная, верно?

Dim myBoard(5,5) As Array

Конечно, если доска странной формы (как будто есть места и предметы в середине), это может не сработать.

0 голосов
/ 07 августа 2009

Я бы использовал вид графика. Как:

class Field
{
     private List<Field> neighbours;
}

Или не список, а массив, который содержит нулевые ссылки на граничные поля. Любая доска может быть представлена ​​с этим.

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