在JavaScript中表示地牢然后用怪物填充它的最佳方法是什么?

时间:2012-02-29 00:40:42

标签: javascript architecture mud

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

我想为我的地下城提供的功能是:

  1. Dungeon应该有一个随机数量的房间(在指定的参数范围内)
  2. 房间应自动填充怪物
  3. (我们现在可以忽略房间的连接方式)
  4. 看到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)如何为对象生成随机数量的属性?

    谢谢!

2 个答案:

答案 0 :(得分:3)

对我来说听起来总体上是一个好主意,但你对地下城的描述并没有多大意义。你可以让地牢成为一个对象。你的例子几乎是正确的,但你需要摆脱var,因此:

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

可以通过dungeon.room1dungeon['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