1

我正在尝试创建一个 MUD 作为练习 JS 的有趣项目(我是一个完全的菜鸟,但受到 codecademy 的启发而学习更多!)我希望我能得到一些关于如何在 JS 中代表我的地牢的建议.

我想为我的地牢拥有的功能是:

  1. 地牢应该有随机数量的房间(在指定的参数内)
  2. 房间应该自动填充怪物
  3. (我们现在可以忽略房间是如何连接的)

鉴于 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) 如何为对象生成随机数量的属性?

谢谢!

4

2 回答 2

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];

:{}在我给出的第一个示例中使用对象字面量创建对象时使用。对于使用构造函数定义的对象,您使用=.

于 2012-02-29T01:21:36.360 回答
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

于 2012-02-29T01:22:23.833 回答