Ha pasado un tiempo desde que estoy aquí.

Estoy siguiendo un tutorial sobre aventuras basadas en texto JavaScript. Tutorial muy básico. Tengo una función para cambiar las habitaciones. Entiendo la lógica detrás de esto y funciona.

No me da errores hasta que llego a 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>");
    }
}

Aquí está la variable de habitación que me tomó un minuto entender el formato. Agregué edificios como una opción que actúa como lo harían las instrucciones.

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",
    },

Se inicia la sala actual. Puede escribir "ir al norte". y cambiará bien las habitaciones. Pero, ¿y si quisiera más de 4 caminos diferentes? Pensé que esto podría funcionar, pero no puedo averiguar dónde me equivoqué específicamente. Reutilicé la función pero cambié los elementos.

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

No busco a alguien que me programe, solo me explique la lógica que podría estar perdiendo. Cualquier comentario sería apreciado. Gracias.

Editar.

Al buscar su solución, utilicé la declaración if y todavía recibo el error a continuación. No entiendo porque changeRooms funciona bien para mostrar la descripción y goInside es una copia de 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

Línea 58

$('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");

La línea 94 es la función goInside

case "explore":

            var building = input.split(" ")[1];
            goInside(building);
            break;
2
Xander Dee 16 oct. 2018 a las 02:36

2 respuestas

La mejor respuesta

La pista más sencilla sobre lo que está mal proviene del error: Uncaught TypeError: Cannot read property 'description' of undefined. Mirando dónde intentas leer description:

 $('#game-text').append("<p>" + rooms[currentRoom].description + "</p>");

Por tanto, rooms[currentRoom] devuelve undefined. Una explicación plausible es que si está intentando ingresar, p. Ej. "comprar", sin embargo, no hay rooms['shop'] definido. Asegúrese de tener una habitación definida para "tienda", es decir.

rooms = {
  "shop": {
    // definition similar to "start" etc.
  }
  // ... the rest of the rooms
}
0
vijoc 16 oct. 2018 a las 06:29

Asegúrese de que todas las habitaciones tengan una propiedad buildings. Si no hay otros edificios a los que pueda ir desde esa habitación, la propiedad debe ser un objeto vacío, p. Ej.

"buildings": {},

De lo contrario, obtendrá un error al intentar acceder a rooms[currentRoom].buildings[building]. Aunque esté probando si esto está definido, no puede indexar un objeto con [building] si no hay ningún objeto allí para empezar.

O necesita hacer que la función goInside() verifique esto primero.

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>");
    }
}
0
Barmar 16 oct. 2018 a las 01:42