Closed salva00 closed 3 years ago
il codice è disordinato ma onestamente non richiede strutture dati eccessivamente complesse. Dunque non ha senso fare header
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
Allora:
la struttura dei while è nello pseudo codice, quindi non ho potuto scegliere un modo diverso di operare. Sicuramente non avrei fatto così.
Modifico il valore in existValidMove perché se esiste deve sceglierla per andare avanti. Ora mi hai illuminato sul problema centrale, ho fatto il check della posizione nella funzione sbagliata. Provo a passarlo nella funzione existValidMove. Però il problema é che, comunque, deve poter tornare indietro : se sbaglia deve poterlo fare. Ora, la soluzione più intelligente a questo è fare un algoritmo di path finding: così da non sbagliare mai, però si perde l'essenza della stack. Quindi sono indeciso.
https://github.com/salva00/ProgrammiCeck_P1/blob/ded52e60fd1f462352dacb430db0e54be8538ac0/EserciziClasse/Labirinto/main.cpp#L114