Как лучше всего представлять подземелье в JavaScript, а затем заселять его монстрами? - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь создать MUD как забавный проект для практики JS (я абсолютный новичок, но меня вдохновило учиться на codecademy!), И я надеялся, что смогу получить несколько советов о том, как представлять моего подземелье в JS.

Функции, которые я хотел бы иметь для моего подземелья:

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

Видя, что JS является ОО-языком, я подумал, что лучший способ представить подземелье - это объект:

var dungeon = {
    var room1:roomA,
    var room2:roomB,
    var room3:roomC
}

//RoomX is an object created with the following constructor

function Room(){
    this.description: "Some text",
    this.monsters:[monster1,monster2,monster3],
    this.treasure:[treasure1,treasure2,treasure3]  
}

Затем планируется создать методы для объекта "Комната", позволяющие игроку взаимодействовать с вещами в комнате.

Вопросы:

1) Это хорошая идея / она будет работать?

2) Как создать случайное количество свойств для объекта?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Это довольно открытый вопрос - есть много способов сделать это, которые могут быть одинаково «правильными». Но пара моментов:

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

var dungeon = {
     room1:roomA,
     room2:roomB,
     room3:roomC
} 

Но я думаю, что вам будет лучше с множеством комнат:

var dungeon = [ roomA, roomB, roomC ];

Потому что тогда вы можете легко варьировать количество комнат. Предполагая, что вы генерируете комнаты случайным образом, вы можете легко добавить новые комнаты в массив с помощью dungeon.push(new Room()).

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

var dungeon = [ [ roomA, roomB, roomC ],
                [ roomD, roomE, roomF ],
                [ roomG, roomH, roomI ] ];

Так, чтобы к правому среднему помещению обращались как dungeon[1, 2] (строка 1, столбец 2, отмечая, что индексы массива начинаются с нуля).

Ваш синтаксис присваивания в вашей функции также неверен: вам нужно сказать

this.propertyName = someValue;
// NOT
this.propertyName : someValue;

Двоеточие : используются для создания свойств в синтаксисе литерала объекта { property : value }, но знак равенства = используется для других назначений variableOrProperty = value.

3 голосов
/ 29 февраля 2012

Для меня это звучит как хорошая идея, но ваше описание подземелья на самом деле не имеет смысла.Вы можете сделать подземелье, чтобы быть объектом.Ваш пример почти верен, но вам нужно избавиться от var, например:

var dungeon = {
  'room1': roomA,
  'room2': roomB
  ...
}

. К нему можно обратиться через dungeon.room1 или dungeon['room1']

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

Как насчет того, чтобы вместо этого вы определили подземелье как массив, а затем сгенерировали случайное количество комнат?это просто:

//This generates a random number between min and max
var rand = Math.floor(Math.random() * (max - min) + min);

var dungeon = new Array(rand);

for (var i = 0; i < dungeon.length; i++) {
  //This depends on how do you want to generate random rooms
  dungeon[i] = randRoom();
}

Ваш конструктор для Room также не полностью корректен.Если бы я переписал это в надлежащем JavaScript, это было бы:

function Room(){
  this.description = "Some text";
  this.monsters = [monster1,monster2,monster3];
  this.treasure = [treasure1,treasure2,treasure3];
}

Это инициализируется так:

var room = new Room();

И вы можете получить доступ ко всем полям:

room.description // returns "Some text"
room.monsters    // returns [monster1,monster2,monster3];

: используются при создании объектов с литералами объектов {}, как в первом примере, который я дал.Для объектов, определенных с помощью конструкторов, вы используете =.

...