用JavaScript表示地下城,然后在其中填充怪物的最佳方式是什么?

用JavaScript表示地下城,然后在其中填充怪物的最佳方式是什么?,javascript,architecture,mud,Javascript,Architecture,Mud,我正在尝试创建一个MUD as fun项目来练习JS我是一个彻头彻尾的noob,但受到codecademy的启发,我想学习更多!我希望我能得到一些关于如何在JS中代表我的地下城的建议 我希望我的地下城有以下特点: 在指定的参数范围内,地下城应该有随机数量的房间 房间应该自动填充怪物 现在我们可以忽略房间之间的连接方式 鉴于JS是OO语言,我认为表示地下城的最佳方式是将其作为对象: var dungeon = { var room1:roomA, var room2:roomB,

我正在尝试创建一个MUD as fun项目来练习JS我是一个彻头彻尾的noob,但受到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]  
}
计划是为房间对象创建方法,允许玩家与房间中的物品进行交互

问题:

这是个好主意/行得通吗

2如何为对象生成随机数目的属性


谢谢

总的来说,我觉得这是个好主意,但你对地下城的描述没有什么意义。你可以把地下城变成一个物体。您的示例几乎是正确的,但您需要去掉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();
}
这是这样初始化的:

var room = new Room();
您可以访问所有字段:

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

:在创建对象文本为{}的对象时使用,如我给出的第一个示例中所示。对于使用构造函数定义的对象,您使用=。

对我来说总体上是个好主意,但您对地下城的描述并没有真正意义。你可以把地下城变成一个物体。您的示例几乎是正确的,但您需要去掉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();
}
这是这样初始化的:

var room = new Room();
您可以访问所有字段:

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

:在创建对象文本为{}的对象时使用,如我给出的第一个示例中所示。对于用构造函数定义的对象,您使用=。

这是一个相当开放的问题-有很多方法可以做到这一点,但都是同样正确的。但有两点:

您的对象文字语法无效-您需要从属性名称中删除var关键字,使其如下所示:

var dungeon = {
     room1:roomA,
     room2:roomB,
     room3:roomC
} 
但我认为你最好有一系列的房间:

var dungeon = [ roomA, roomB, roomC ];
因为这样你可以很容易地改变房间的数量。假设您以某种方式随机生成房间,您可以使用dungeon.pushnew Room轻松地将新房间添加到阵列中

此外,如果您的房间位于规则网格中,您可能希望使用数组数组来表示:

var dungeon = [ [ roomA, roomB, roomC ],
                [ roomD, roomE, roomF ],
                [ roomG, roomH, roomI ] ];
这样,右中间的房间将作为副本[1,2]第1行第2列访问,注意数组索引是从零开始的

函数中的赋值语法也不正确:您需要

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

冒号:用于对象文字{property:value}语法中的属性创建,但等号=用于其他赋值variableOrProperty=value。

这是一个相当开放的问题-有很多方法可以做到这一点,它们都是同样正确的。但有两点:

您的对象文字语法无效-您需要从属性名称中删除var关键字,使其如下所示:

var dungeon = {
     room1:roomA,
     room2:roomB,
     room3:roomC
} 
但我认为你最好有一系列的房间:

var dungeon = [ roomA, roomB, roomC ];
因为这样你可以很容易地改变房间的数量。假设您以某种方式随机生成房间,您可以使用dungeon.pushnew Room轻松地将新房间添加到阵列中

此外,如果您的房间位于规则网格中,您可能希望使用数组数组来表示:

var dungeon = [ [ roomA, roomB, roomC ],
                [ roomD, roomE, roomF ],
                [ roomG, roomH, roomI ] ];
这样,右中间的房间将作为副本[1,2]第1行第2列访问,注意数组索引是从零开始的

函数中的赋值语法也不正确:您需要

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

冒号:用于对象文字{property:value}语法中的属性创建,但等号=用于其他赋值variableOrProperty=value。

Aha是的,我想我理解。我把对象文字和构造函数符号弄混了。我之所以使用var,是为了使每个房间都成为一个私有财产,只能使用getter函数访问,而我还没有创建getter函数。这对这个项目来说可能太过分了
事实上,在对这个主题做了更多的阅读之后,您似乎只能使用构造函数而不是对象文本来创建私有变量。是的,我相信是这样的。有相当多的关于它的信息。啊哈,是的,我想我明白了。我把对象文字和构造函数符号弄混了。我之所以使用var,是为了使每个房间都成为一个私有财产,只能使用getter函数访问,而我还没有创建getter函数。对于这个项目来说,这可能有点过头了。事实上,在对这个主题做了更多的阅读之后,似乎您只能使用构造函数而不是对象文本来创建私有变量。是的,我相信是这样的。网站上有很多关于它的信息。