我来这里已经有一段时间了。
我正在关注有关JavaScript文本库冒险的教程。非常基础的教程。我有一个改变房间的功能。我了解其背后的逻辑,并且有效。
直到进入goInside(),它不会给我错误;
property 'description' of undefined
at goInside (core.js:58)
at playerInput (core.js:94)
at HTMLDocument.<anonymous> (core.js:114)
at HTMLDocument.dispatch (jquery-3.2.1.min.js:3)
at HTMLDocument.q.handle (jquery-3.2.1.min.js:3)
goInside @ core.js:58
playerInput @ core.js:94
(anonymous) @ core.js:114
dispatch @ jquery-3.2.1.min.js:3
q.handle @ jquery-3.2.1.min.js:3
function changeRoom(dir) {
if (rooms[currentRoom].directions[dir] !== undefined) {
currentRoom = rooms[currentRoom].directions[dir]
$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
} else {
$('#game-text').append("<p>You cannot go that way!</p>");
}
}
这是房间变量,我花了一点时间来了解格式。我添加了建筑物作为一种选项,其作用与指示类似。
var rooms = {
"start": {
"description": "You are in Town waiting for something to happen",
"details": "You notice a house and a shop. Should you explore?",
"directions": {
"north": "bridge",
"west": "clearing"
},
"buildings": {
"shop": "shop",
"house": "house"
},
"items": ["water", "stick"],
"minlvl": "1",
},
当前房间开始。您可以输入“向北”。它将改变房间的罚款。但是,如果我想使用4种以上的不同方式怎么办?我以为这可能有效,但无法弄清楚我哪里出了问题。我重用了该功能,但切换了各个元素。
function goInside(building) {
if (rooms[currentRoom].buildings[building] !== undefined) {
currentRoom = rooms[currentRoom].buildings[building],
$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
} else {
$('#game-text').append("<p>You cannot go that way!</p>");
}
}
不找人为我编程,只是在解释我可能会缺少的逻辑。对于任何反馈,我们都表示感谢。谢谢。
编辑。
查看您的解决方案时,我使用了if语句,但仍然出现以下错误。我不明白,因为changeRooms可以很好地显示说明,而goInside是changeRooms的副本。
Uncaught TypeError: Cannot read property 'description' of undefined
at goInside (core.js:58)
at playerInput (core.js:94)
at HTMLDocument.<anonymous> (core.js:114)
at HTMLDocument.dispatch (jquery-3.2.1.min.js:3)
at HTMLDocument.q.handle (jquery-3.2.1.min.js:3)
goInside @ core.js:58
playerInput @ core.js:94
(anonymous) @ core.js:114
dispatch @ jquery-3.2.1.min.js:3
q.handle @ jquery-3.2.1.min.js:3
第58行
$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
第94行是goInside函数
case "explore":
var building = input.split(" ")[1];
goInside(building);
break;
答案 0 :(得分:0)
确保所有房间都具有buildings
属性。如果您没有其他可从该房间进入的建筑物,则该属性应为空对象,例如
"buildings": {},
否则,尝试访问rooms[currentRoom].buildings[building]
时会出错。即使您正在测试是否已定义此对象,如果没有开头的对象,它也无法使用[building]
索引对象。
或者您需要对此进行goInside()
功能检查。
function goInside(building) {
if (rooms[currentRoom].buildings && rooms[currentRoom].buildings[building]) {
currentRoom = rooms[currentRoom].buildings[building],
$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
} else {
$('#game-text').append("<p>You cannot go that way!</p>");
}
}
答案 1 :(得分:0)
关于错误的最直接的提示来自错误:Uncaught TypeError: Cannot read property 'description' of undefined
。看一下您在哪里尝试阅读description
:
$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");
因此,rooms[currentRoom]
返回undefined
。一个合理的解释是,如果您尝试输入例如“商店”,但尚未定义rooms['shop']
。确保您有一个为“商店”定义的房间,即
rooms = {
"shop": {
// definition similar to "start" etc.
}
// ... the rest of the rooms
}