我正在尝试创建一个MUD作为练习JS的有趣项目(我是一个总的菜鸟,但受到启发,通过codecademy了解更多!)我希望我能得到一些关于如何代表我的建议JS中的地牢。
我想为我的地下城提供的功能是:
看到JS是OO语言我认为表示地牢的最佳方式是作为对象:
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]
}
计划是为Room对象创建方法,允许玩家与房间内的东西进行交互。
问题:
1)这是一个好主意/它会起作用吗?
2)如何为对象生成随机数量的属性?
谢谢!
答案 0 :(得分:3)
对我来说听起来总体上是一个好主意,但你对地下城的描述并没有多大意义。你可以让地牢成为一个对象。你的例子几乎是正确的,但你需要摆脱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];
在创建具有对象文字:
的对象时使用 {}
,如我给出的第一个示例中所示。对于使用构造函数定义的对象,可以使用=
。
答案 1 :(得分:3)
这是一个相当开放的问题 - 有很多方法可以做到这一点,所有这些都可能同样“正确”。但有几点:
您的对象文字语法无效 - 您需要从属性名称中删除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
。