skip to Main Content

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


  1. mano is returned as part of an object from function creaGiocatore. It’s not a property of creaGiocatore. 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:

    function creaGiocatore(nome) {
        return {
            nome: nome,
            vite: 3,
            mano: [1,2,3]
        };
    }
    
    // You have to invoke the function to recieve its return value
    let result = creaGiocatore("foo");
    
    // Then you can use the return value
    console.log(result.mano);
    Login or Signup to reply.
  2. To debug this issue, print giocatore1 and giocatore2 inside the function scambiaCarta().

    The error Cannot read properties of undefined (reading 'mano') is coming because you have used mano[0] & mano.splice(0, 1)[0] from giocatore1 and giocatore2. 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] or goicatore1?.mano.splice(0, 1)[0] or goicatore2?.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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search