Каков наилучший способ представить подземелье в JavaScript, а затем заселить его монстрами?
Я пытаюсь создать MUD как забавный проект для практики JS (я абсолютный нуб, но меня вдохновило учиться на codecademy!), И я надеялся, что смогу получить несколько советов о том, как представлять свое подземелье в JS,
Особенности, которые я хотел бы иметь для моего подземелья:
- Подземелье должно иметь случайное количество комнат (в пределах указанных параметров)
- Комнаты должны быть автоматически заселены монстрами
- (Мы можем игнорировать, как комнаты связаны сейчас)
Поскольку 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 ответа
Это довольно открытый вопрос - есть много способов сделать это, которые могут быть одинаково "правильными". Но пара моментов:
Неверный синтаксис вашего объекта - вам нужно удалить 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
,
В общем, для меня это звучит как хорошая идея, но ваше описание подземелья на самом деле не имеет смысла. Вы можете сделать подземелье, чтобы быть объектом. Ваш пример почти прав, но вам нужно избавиться от var
, в качестве таких:
var dungeon = {
'room1': roomA,
'room2': roomB
...
}
Это может быть доступно через dungeon.room1
, или же dungeon['room1']
Но было бы излишне сложно создать случайное количество комнат для этого. Вам нужно будет получить последний элемент, получить номер с конца, увеличить на единицу и только потом добавить еще одну комнату.
Как насчет того, чтобы вместо этого вы определили dungeon как массив, а затем легко сгенерировать случайное количество комнат:
//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];
:
используются при создании объектов с объектными литералами {}
как в первом примере, который я дал. Для объектов, определенных с помощью конструкторов, вы используете =
,