Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с кодом js

Денис Дуков Ученик (66), на голосовании 1 год назад
Почему-то студент не получает урон, и вылезает ошибка
game.js:20 Uncaught TypeError: Cannot read properties of undefined (reading 'title')
at goToRoom (game.js:20:59)
at HTMLButtonElement.<anonymous> (game.js:62:17)
 function isGameOver() { 
return student.life <= 0 ||
Rooms[roomId].actions.length === 0;
}

function restart() {
var button = document.createElement('button');
items.protein=0;
button.innerHTML = 'Ещё разок или зассал?';
button.className = 'red-button';
button.addEventListener('click', function () {
roomId = 'start';
goToRoom();
});
document.getElementById('actions').appendChild(button);
}

function goToRoom() {
var room = Rooms[roomId];
document.getElementById('roomTitle').innerHTML = room.title;
document.getElementById('roomDescription')
.innerHTML = room.description;
document.getElementById('studentLife').innerHTML = "Здоровье:"+student.life;
document.getElementById('eat').innerHTML = "Тараканов в кармане:" + items.protein;
document.getElementById('roomImage').src = room.img;
document.getElementById('actions').innerHTML = '';
if (isGameOver()) {
document.getElementById('studentLife').innerHTML = "Вы умерли";
restart();
return;
}
for (var i = 0; i < room.actions.length; i++) {
(function(i) {
var button = document.createElement('button');
button.innerHTML = room.actions[i].title;
button.className = 'green-button';
button.addEventListener('click', function() {
if (room.actions[i].eats){
items.protein+=1;
room.actions[i].eats=0;
}
document.getElementById('eat').innerHTML = "Тараканов в кармане:" + items.protein;
if(items.protein > 0) {
var buttonEatRoach = document.createElement('button');
buttonEatRoach.innerHTML = "Съесть таракана";
buttonEatRoach.className = 'blue-button';
buttonEatRoach.addEventListener('click', function() {
if (items.protein >= 1){
items.protein -= 1;
student.life += 10;
}
document.getElementById('studentLife').innerHTML = "Здоровье:"+student.life;
document.getElementById('eat').innerHTML = "Тараканов в кармане:" + items.protein;
});
document.getElementById('actions').appendChild(buttonEatRoach);
if (room.actions[i].damage>=1){
student.life+=room.actions[i].damage;
document.getElementById('studentLife').innerHTML = "Здоровье:"+student.life;
}
}
roomId = room.actions[i].id;
goToRoom();
});
document.getElementById('actions').appendChild(button);
})(i);
}
}
Вот структура самого data.js

 var student = { 
life: 100
}
var roomId = "start";
var items = {
protein:0,
vodka:0,
бабосики:0
}
var Rooms = {
start: {
title: "Клоповник",
description: "Комната из шараги, нравитЬся не нравитЬсяС-терпи моя
title: "Окно",
description: "Надо было делать домашку",
img: "img/window.jpg",
actions: []
Дополнен 1 год назад
 var student = {
life: 100
}
var roomId = "start";
var items = {
protein:0,
vodka:0,
бабосики:0
}
var Rooms = {
start: {
title: "Клоповник",
description: "Комната из шараги, нравитЬся не нравитЬсяС-терпи моя красавица",
img: "img/start.jpg",
actions: [
{ title: "Окно", id: "window", damage: -1 },
{ title: "коридор", id: "tall", damage: -1 }
]
},
window: {
title: "Окно",
description: "Надо было делать домашку",
img: "img/window.jpg",
actions: []
},
kitchen: {
title: "Кухня",
description: "Орды тараканов, мышей и голодных чертей орудуют в это месте",
img: "img/kitchen.jpg",
actions: [
{ title: "Сьесть потрясающий борщ", id: "ponos", damage: -1 },
{ title: "Выйти обратно в коридор", id: "tall", damage: -1 }
]
},
tall: {
title: "Коридор",
description: "Коридор как коридор, мышки бегают",
img: "img/tall.jpg",
actions: [
{ title: "Пойти в туалет", id: "toulet", damage: -1 },
{ title: "Идти в комнату", id: "start", damage: -1 },
{ title: "Выйти на пропускной пункт" , id: "kpp", damage: -1 },
{ title: "Пойти хавать", id: "kitchen", damage: -1 },
{ title: "Поднять таракана", eats:1}
]
},
kpp: {
title: "Пропускной пункт",
description: "Баба зина как понос, может быстро заставить тебя вылететь из комнаты",
img: "img/kpp.jpeg",
actions: [
{ title: "Пойти в коридор", id: "tall", damage: -1 },
{ title: "Выйти на улицу", id: "street", damage: -1 },
{ title: "Поцеловать красоку", damage: -99 }
]
Голосование за лучший ответ
Matz Просветленный (36091) 1 год назад
Ты используешь в game.js данные из data.js, но в game.js нет импорта из data.js поэтому game.js не видит эти данные. Нужно видеть полную структуру приложения, как всё подключено и взаимодействует между собой.
Sergio 2.1 Оракул (67303) 1 год назад
Судя по всему, проблема заключается в том, что при переходе в комнату (goToRoom), вы ищите комнату с идентификатором roomId, который, в какой-то момент, становится undefined.

В методе goToRoom вы вызываете var room = Rooms[roomId]; и если значение roomId не является действительным ключом в объекте Rooms, room будет undefined. Позже, при попытке доступа к свойствам этого undefined (в данном случае title и description), вы получаете ошибку Cannot read properties of undefined.

Комментарий, добавленный к возвращаемой функции isGameOver, указывает, что когда жизнь студента <= 0, roomId используется как индекс для room.actions в объекте Rooms, а затем переопределяется до undefined, когда жизнь студента остается без значений.

Вы должны проверить, корректно ли вы устанавливаете значение roomId. Убедитесь, что при переходе из комнаты вы правильно обновляете roomId. В частности, следует проверить, все ли действия в каждой комнате устанавливают roomId для существующего ключа в Rooms.

Ниже приведен исправленный фрагмент вашего кода:
 button.addEventListener('click', function() {  
if (room.actions[i].eats){
items.protein+=1;
room.actions[i].eats=0;
}
document.getElementById('eat').innerHTML = "Тараканов в кармане:" + items.protein;
if(items.protein > 0) {
// Код
if (room.actions[i].damage>=1){
student.life+=room.actions[i].damage;
document.getElementById('studentLife').innerHTML = "Здоровье:"+student.life;
}
}

if (Rooms.hasOwnProperty(room.actions[i].id)) {
roomId = room.actions[i].id;
goToRoom();
} else {
console.error('Invalid roomId: ' + room.actions[i].id);
}
});
Здесь добавлена проверка, содержит ли объект Rooms ключ room.actions[i].id, перед установкой значения roomId и вызовов функции goToRoom. Если ключ не найден, в консоль будет выведено сообщение об ошибке с невалидным roomId.
Похожие вопросы