Вопрос о переменных, функциях и логике за ними? - PullRequest
0 голосов
/ 16 октября 2018

это было некоторое время, так как я был здесь.

Я следую учебному пособию по приключениям с текстовой базой 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;

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Самый простой намек на то, что не так, исходит из ошибки: 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
}
0 голосов
/ 16 октября 2018

Убедитесь, что во всех номерах есть 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>");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...