2012-02-29 38 views
1

我想創建一個MUD作爲有趣的項目來練習JS(我是一個總noob,但已被啓發學習codecademy更多!),我希望我可以得到一些建議,如何去代表我的地牢在JS中。什麼是在JavaScript中表示地牢的最佳方式,然後用怪物填充它?

我想爲我的地牢的特點是:

  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)如何爲對象生成隨機數量的屬性?

謝謝!

回答

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(); 
} 

您的房間構造也是不完全正確。如果我是重寫,在適當的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]; 

:是用於創建具有對象文字的對象{},與我給出的第一個示例中一樣。對於使用=構造函數定義的對象。

+0

啊哈是的,我想我明白了。我正在混合對象字面量和構造函數符號。我使用'var'的原因是爲了讓每個房間成爲一個私人財產,只有使用getter函數才能訪問這個私有財產,而我仍然沒有這樣做。這個項目很可能會過度。 – 2012-02-29 23:48:12

+0

事實上,圍繞主題做了更多的閱讀,似乎你只能使用構造函數創建私有變量,而不能使用對象文本。 – 2012-03-01 00:00:20

+0

是的,我相信是這樣。 http://javascript.crockford.com/private.html上有相當多的關於它的信息。 – mck 2012-03-01 15:43:18

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

相關問題