salva00 / ProgrammiCeck_P1

Repository che contiene tutti i progetti di Programmazione I (fatti a lezione e non) ;)
1 stars 0 forks source link

Labirinto va sempre tra 0 e 1 in x e y. Spottare il problema logico grazie #11

Closed salva00 closed 3 years ago

salva00 commented 3 years ago

https://github.com/salva00/ProgrammiCeck_P1/blob/ded52e60fd1f462352dacb430db0e54be8538ac0/EserciziClasse/Labirinto/main.cpp#L114

salva00 commented 3 years ago

il codice è disordinato ma onestamente non richiede strutture dati eccessivamente complesse. Dunque non ha senso fare header

TheRealSalvo commented 3 years ago

Vista l' ora tarda, mi scuserete se scriverò come un ragazzo delle medie che ha provato per la prima volta dell' erba.

Mi sarebbe piaciuto commitare un codice risolutivo, ma qui il problema è molto profondo del previsto. Notizia buona: il codice fa quello che deve fare. Cattiva notizia: il codice fa quello che deve fare. Prendiamo l'angolo in altro a sinistra del labirinto:

0 1 0 1 0 0 0 1 1

Partiamo da quello zero in corsivo, ci muoviamo quindi a sud-est:

0 1 0 1 0 0 0 1 1

Adesso il programma cerca la prima direzione valida in cui muoversi scorrendo ordinatamente il vettore directions, la prima che trova è nord-ovest

0 1 0 1 0 0 0 1 1

Entriamo quindi in un loop infinito avanti e indietro tra la coordinata 0,0 e la coordinata 1,1

A rigo 111 il programma cerca di evitare questa cosa però nel modo sbagliato, la direzione prev da prendere non è quella dell' oggetto in ingresso curr, bensì quella opposta: se mi muovo a Nord la direzione che devo evitare successivamente è il Sud, si può scrivere facilmente uno switch che per ogni caso di direzione ritorna la sua opposta.

Ahimé il programma però ancora non vuole andare, ciononostante chiuderò l'issue siccome il problema logico dovrebbe essere questo.

Se ho capito bene il funzionamento del programma, carico nello stack tutte le possibili mosse che posso fare finché non calcolo quella corretta, il movimento viene calcolato all' interno della funzione resolveLabirint(), eppure mi puzza la funzione existAValidMove() in cui pure viene calcolato (e soprattutto modificato!) un movimento.

Altro sospetto è il secondo while della funzione resolveLabirint() (rigo 132 per intenderci), questo while continua finché existAValidMove() ritorna un valore true, dopodiché c'è una struttura if else-if else dove secondo me l'else non si attiverà mai: la funzione existAValidMove() può ritornare true se e solo se moveIsValid() ritorna vero, e questa è la condizione dell' else-if. Sarò onesto temo però di non aver capito bene il codice di resolveLabirint(), complice il sonno, quindi qui potrei aver preso un granchio.

Ricapitolando, cose da fare secondo me:

Edit:piccola correzione, il punto come prima mossa si muoveva a sud est, non nord est

salva00 commented 3 years ago

Allora: