用JavaScript表示地牢,然后用怪物填充地牢的最佳方式是什么

What is the best way to represent a dungeon in JavaScript and then populate it with monsters?

本文关键字:是什么 最佳 方式 填充 然后 JavaScript 表示 怪物      更新时间:2023-09-26

我正试图创建一个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) 如何为对象生成随机数目的属性?

谢谢!

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

您的对象文字语法无效-您需要从属性名称中删除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.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];

在创建具有对象文字CCD_ 12的对象时使用CCD_。对于使用构造函数定义的对象,可以使用=