when I was programming a website with JS, accidentally appears an Uncaught type error, I made all for "fighting" this error but It happened nothing
EDIT: which line would cause it?
Uncaught TypeError: Cannot read properties of undefined (reading 'mano')<br>
at scambiaCarta (script.js:496:16)<br>
at eseguiTurnoCPU (script.js:369:9)<br>
at gestisciTurni (script.js:256:9)<br>
at iniziaGioco (script.js:230:5)<br>
at script.js:221:9
function creaGiocatore(nome) {
return {
nome: nome,
vite: 3,
mano: []
};
}
function eseguiTurnoCPU() {
const giocatoreCorrente = giocatori[turnoCorrente % giocatori.length];
const giocatorePrecedente = giocatori[(turnoCorrente - 1 + giocatori.length)];
if (deveScambiareCarta(giocatoreCorrente)) {
scambiaCarta(giocatoreCorrente, giocatorePrecedente);
} else {
console.log(`${giocatoreCorrente.nome} decide di non scambiare la carta.`);
}
turnoCorrente = (turnoCorrente + 1) % giocatori.length;
setTimeout(gestisciTurni, 2000);
}
function scambiaCarta(giocatore1, giocatore2) {
if (deveBloccareScambioCarta(giocatore1.mano[0])) {
console.log(`${giocatore1.nome} ha il Re in mano. Cucù.`);
return;
}
const index1 = giocatori.indexOf(giocatore1);
const index2 = giocatori.indexOf(giocatore2);
const cartaScambiata = giocatore1.mano.splice(0, 1)[0];
giocatore2.mano.push(cartaScambiata);
const cartaScambiata2 = giocatore2.mano.splice(0, 1)[0];
giocatore1.mano.push(cartaScambiata2);
aggiornaCarte(giocatore1, index1);
aggiornaCarte(giocatore2, index2);
console.log(`${giocatore1.nome} ha scambiato una carta con ${giocatore2.nome}.`);
mostraCarte();
}
function iniziaGioco() {
console.log('Il gioco è iniziato!')
inizializzaConsole();
aggiornaConsoleVite();
gestisciTurni();
mostraCarte();
aggiornaCarte();
}
function gestisciTurni() {
const giocatoreCorrente = giocatori[turnoCorrente % giocatori.length];
if (giocatoreCorrente.vite === 0) {
turnoCorrente = (turnoCorrente + 1) % giocatori.length;
setTimeout(() => {
gestisciTurni();
}, 2000);
return;
}
if (turnoCorrente === 0) {
mostraPulsantiUtente();
} else {
nascondiPulsantiUtente();
eseguiTurnoCPU();
}
if (turnoCorrente === iMazziere) {
eseguiTurnoMazziere();
}
turnoCorrente = (turnoCorrente + 1) % giocatori.length;
}
2
Answers
mano
is returned as part of an object fromfunction creaGiocatore
. It’s not a property ofcreaGiocatore
. In order to be able to use it, you need to invoke the function, like this:let result = creaGiocatore("some nome")
. Then you can do:result.mano[0] ...
.Here’s an example:
To debug this issue, print
giocatore1
andgiocatore2
inside the functionscambiaCarta()
.The error
Cannot read properties of undefined (reading 'mano')
is coming because you have usedmano[0]
&mano.splice(0, 1)[0]
fromgiocatore1
andgiocatore2
. But somehow, one of the values of goicatore1 & giocatore2 is coming undefined.The best possible way to fix this error is to use optional chaining before fetching the mano value. Like –
goicatore1?.mano[0]
orgoicatore1?.mano.splice(0, 1)[0]
orgoicatore2?.mano.splice(0, 1)[0]
.Here, ? will check the value of if the value goicatore1 or goicatore2 & if it’s not undefined, it will go further else it will stop.