che interessante questione!
non ci ho riflettuto quanto merita...
per ora mi limito a proporre un suggerimento per modificare il tuo algoritmo:
altrimenti sfaso l'angolo ottenuto di 90 gradi e proseguo con il nuovo percorso
questo non può andare bene, perchè facendo questa scelta perdi memoria del "da dove vieni", quindi di fronte ad un ostacolo lungo orizzontale frapposto lungo un percorso verticale puoi davvero arrivare a loopare all'infinito.
nel caso il percorso più breve trovato con il tuo algoritmo sia interrotto da un ostacolo ti propongo
- determinare la direzione per aggirare l'ostacolo (dettaglio dopo), e memorizzare direzione_di_provenienza
- matenere tale direzione fino a quando la direzione_di_provenienza è libera e muoverti in quella direzione riprendendo l'algoritmo originale
- se anche nella nuova direzione trovi un ostacolo (ostacoli a elle) è un casino... per ora suggerisco di applicare la stessa strategia creandoti direzione_prv[0] [1] [3] [4] (gli ostacoli concavi tipo spirale con pg all'interno non sarebbero gesititi: gli ostacoli devono essere convessi!)
- di sicuro si deve prevedere anche la possibilità di invertire il moto... ma questo prendilo in considerazione in uno step successivo
per determinare la direzione per aggirare l'ostacolo:
versione 0: tira a caso tra +90° e -90° rispett odirezione originale
versione 1: eslpora le caselle adiacenti per valutare in quale delle due direzioni troverai per primo il passo successivo
ovvio che questa proposta non sta assolutamente ottimizzando il percorso, ostacoli successivi potrebbero scombussolare il percorso migliore.
Hai preso in considerazione l'A*? Hai già la matrice per determinare i collegamenti poco costosi e quelli a costo infinito...