2015-10-30 113 views
0

我正在研究由4個房間組成的文本遊戲。房間佈置成一個箱子,分爲4個部分(NW,NE,SE,SW)。您將在NW房間開始旅行房間,順時針方向在SW房間結束。使用swtich添加附加條件

無論如何,我有包含在交換機的基本走勢:

switch (input) { 

case "help": 
    $("#messageHelp").properDisplay(); 

break; 

    case "take sword": 
if (currentRoom == "nwRoom") { 
    $("<p>You picked up a sword.</p>").properDisplay(); 

} else { 
    $("<p>The sword is not here.</p>").properDisplay(); 

} 
break; 

case "go east": 
    if (currentRoom == "nwRoom") { 
     currentRoom = "neRoom"; 
     $("<p>You are now in the North East Room.</p>").properDisplay(); 

    } else { 
     $("<p>You can't go that way.</p>").properDisplay(); 

    } 
    break; 

case "go west": 
    if (currentRoom == "neRoom") { 
     currentRoom = "nwRoom"; 
     $("<p>You are now in the North West Room.</p>").properDisplay(); 

    } else { 
     $("<p>You can't go that way.</p>").properDisplay(); 

    } 
    break; 

case "go south": 
    if (currentRoom == "neRoom") { 
     currentRoom = "seRoom"; 
     $("<p>You are now in the South East Room.</p>").properDisplay(); 

    } else { 
     $("<p>You can't go that way.</p>").properDisplay(); 

    } 
    break; 

case "go north": 
    if (currentRoom == "seRoom") { 
     currentRoom = "neRoom"; 
     $("<p>You are now in the North East Room.</p>").properDisplay(); 

    } else { 
     $("<p>You can't go that way.</p>").properDisplay(); 

    } 
    break; 

這裏是我的問題 - 需要複製西方的方向,因爲你應該能夠在樓上的房間前往東/西爲以及較低的房間。我怎麼做?我本來以爲一個或布爾的:

if (currentRoom == "swRoom" || "nwRoom")

但隨後剩餘的代碼將毫無意義。由於第一次使用中斷,我無法複製整個陳述。如果可能的話,我想堅持使用SWITCH作爲大部分代碼,因爲它比大量if語句清晰得多。最終,我想繼續使用它將它變成一個更大的遊戲,但是我正在使用這4個房間來教會我自己的基本知識。

謝謝!

+1

標識提出一個完全不同的方法,使物體來代表您的每一個房間,然後每個房間可以知道什麼其他房間連接到 –

+0

這將包括能夠做下來,櫥櫃納尼亞,傳送器等 –

+0

@KeithNicholas - 我有一個對象的基本瞭解,並在我搬到開關之前就朝着這個方向前進。你能告訴我一個如何創建對象的例子,以便你可以在多個方向上移動? 我猜是這樣的: VAR seRoom = { 門1: 「nwRoom」 門2: 「swRoom」 }; 或者沿着這些線?我的問題是我可以在其他對象中複製相同的命令(door1,door2),但結果不同? (即seRoom.door1 vs nwRoom.door1) – megler

回答

2

大廈,你可以代表房間作爲一個單獨的對象,這樣的事情:

var rooms = { 
    northWest: { 
    name: "North East", 
    hasSword: true, 
    paths: { 
     east: "northEast", 
     south: "southWest" 
    } 
    }, 
    northEast: { 
    name: "North East", 
    paths: { 
     west: "northWest", 
     south: "southEast" 
    } 
    }, 
    southWest: { 
    name: "South West", 
    paths: { 
     east: "southEast", 
     north: "northWest" 
    } 
    }, 
    southEast: { 
    name: "South East", 
    paths: { 
     west: "southWest", 
     north: "northEast" 
    } 
    }, 
}; 

設置你的currentRoom當你的遊戲開始

var currentRoom = rooms["northWest"]; 

由於在任何一個方向上傳輸的功能都比較相似,但您希望儘可能多地使用代碼。您可以創建一個旅行功能,如下所示:

var travel = function(direction) { 
    var newRoom = rooms[currentRoom.paths[direction]]; 
    if(!newRoom) { 
    $("<p>You can't go that way.</p>").properDisplay(); 
    } 
    else { 
    currentRoom = newRoom; 
    $("<p>You are now in the " + currentRoom.name + " Room.</p>").properDisplay(); 
    } 
}; 

此功能將採用字符串方向,如「東」或「西」。第一個變量賦值將嘗試從上面創建的對象中獲取空間。舉例來說,我們在西北部的房間,方向輸入是東部。這條線將有效地做到這一點

currentRoom.paths["east"] 

由於我們在西北房間,這將返回字符串:

northWest: { 
    name: "North East", 
    paths: { 
    east: "northEast", // This string will be returned. 
    south: "southWest" 
    } 
} 

有了這個字符串,我們現在可以讓我們轉移到使用新的房間:

rooms["northEast"] 

所以把他們放在一起是

rooms[currentRoom.paths[direction]]; 

現在,如果這恰好沒有返回,即。當前房間中不存在方向爲「東」的路徑,我們的變量將爲undefined,它將評估爲false

這對下一步很重要,因爲它可以讓我們檢查是否能夠進入新房間。評價意味着我們不是,這就是我們告訴玩家。

如果返回房間,我們將其設置爲當前房間。顯示房間的名稱,我們就完成了。然後,您可以從您的switch語句中運行這些旅遊功能:

var receiveInput = function(input) { 
    switch(input) { 
    case "help": 
     $("#messageHelp").properDisplay(); 
     break; 
    case "take sword": 
     takeSword(); 
     break; 
    case "go east": 
     travel("east"); 
     break; 
    case "go west": 
     travel("west"); 
     break; 
    case "go north": 
     travel("north"); 
     break; 
    case "go south": 
     travel("south"); 
     break; 
    } 
} 

獎金拿刀劍功能:

var takeSword = function() { 
    if(currentRoom.hasSword) { 
    $("<p>You picked up a sword.</p>").properDisplay(); 
    } 
    else { 
    $("<p>The sword is not here.</p>").properDisplay(); 
    } 
}; 
+0

謝謝@JamesHay,這讓我的noob大腦更有意義。我沒有意識到物體可能如此牽涉。我最初的想法是讓每個房間成爲一個對象,但我無法將這個概念轉化爲遊戲中的功能模型。我很感謝你的詳細解答。它確實幫助我使用並從中學習。非常感謝! – megler

+0

沒問題。有無數的方法可以模擬,所以這只是我的看法。從我的答案中取得的關鍵之一是儘可能地嘗試和抽象常用功能。 –

+0

表示同意。這原本是一個巨大的if else語句。從那裏開始,我開始嘗試學習新的想法,使其更加緊密和高效。所有的StackO人都非常有幫助,讓我從一個階段到另一個階段。 – megler

1

它看起來像你試圖通過使用條件來模擬數據結構。爲什麼不使用graph

這裏是你如何可以結構的房間對象:

var Room = function(name, treasure) { 
    this.name = name; 
    this.treasure = treasure; 
    this.exit = { 
     north: null, 
     south: null, 
     east: null, 
     west: null 
    }; 

    this.addAdjacentRoom = function(Room, location) { 
     var oppositeDirection = { 
      north: "south", 
      south: "north", 
      east: "west", 
      west: "east" 
     } 
     if (location in exits) { 
      this.exit[location] = Room; 
      Room.exit[oppositeDirection[location]] = this; 
     }  
    }; 
}; 

現在讓我們添加一些東西來支持所有這些房間:

var Dungeon = function(Room) { 
    this.currentRoom = Room; 
    this.changeRoom = function(direction) { 
     var nextRoom = this.currentRoom.exit[direction]; 
     if (nextRoom) { 
      $("<p>You are now in the " + nextRoom.name +" Room.</p>").properDisplay(); 
      this.currentRoom = nextRoom; 
     } else { 
      $("<p>You can't go that way.</p>").properDisplay(); 
     } 
    }; 
    this.pickUpTreasure = function() { 
     var treasure = this.currentRoom.treasure; 
     if (treasure) { 
      $("<p>You picked up a " + treasure + ".</p>").properDisplay(); 
     } else { 
      $("<p>There is no treasure here.</p>").properDisplay(); 
     } 
    }; 
}; 

現在你可以開始構建你的地牢和去你的冒險!在基思尼古拉的想法

var entrance = new Room("entrance"); 
var lobby = new Room("lobby"); 
// this room has treasure! 
var treasureCave = new Room("treasure cave", "magical sword of destiny"); 
var prison = new Room("prison"); 

entrance.addAdjacentRoom(lobby, "west"); 
lobby.addAddAdjacentRoom(treasureCave, "north"); 
lobby.addAddAdjacentRoom(prison, "south"); 

var myDungeon = new Dungeon(entrance); 

myDungeon.changeRoom("west"); 
myDungeon.changeRoom("north"); 
myDungeon.pickUpTreasure(); 
+0

哦,哇,@喬納森,這比我的小威尼物體更多!我明白這是做什麼的,但我必須真的看看這一段時間,弄清楚它爲什麼會這樣做。我不完全明白每個功能。我會努力的。謝謝! – megler

+0

@megler試着在javascript類上查找一些文章。 [這個有點老](http://www.phpied.com/3-ways-to-define-a-javascript-class/),但它很可讀,你可能會發現它有幫助。現在JavaScript實際上正在改變,現在你可以[直接定義類](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes)。 – jperezov

+0

非常感謝。我一定會這樣做。我決定嘗試這個小遊戲來更好地學習一些JS概念。這是一個很好的決定。我已經學到了更多,而不僅僅是學習抽象概念。再次感謝您的幫助! – megler