Come determinare se in una partita di Bejeweled ci sono ancora delle mosse disponibili?
L'input della funzione è una matrice MxN in cui il valore rappresenta uno dei colori.
Per stabilire se ci siano ancora mosse possibili, ho pensato sia sufficiente ricercare nella matrice se ci sono tre pattern fissi, e naturalmente i relativi pattern inversi, che però sono già compresi se effettuo il controllo in tutte e quattro le direzioni.
I pattern sono i seguenti:
XXyX XyX X XXy X
Ed y deve essere diversa da X, oppure si può ignorare? Io voglio che sia diversa, casomai basta eliminare il confronto!
Poi ho pensato che invece di verificare a mano se le coordinate sono fuori dalla matrice, ci starebbe bene un bel TRY...EXCEPTION! Provo a cercare il pattern... se viene sollevata un'eccezione, vuol dire che il pattern non c'è! Spero non sia un sacrilegio... sono pigro lo so... però è il modo migliore per rendere leggibile il codice!
Questo è il mio codice Python... linguaggio che ancora non conosco bene! Quindi ci saranno sicuramente dei giganteschi errori di stile (ehm ad esempio non c'è un modo migliore per gestire le matrici??) ma speriamo ci siano solo quelli, e che la soluzione sia abbastanza corretta!
# esempio di matrice di colori matrice = [ [1, 1, 2, 4, 4], [1, 2, 9, 3, 4], [8, 9, 8, 9, 8], [7, 6, 5, 4, 3] ] altreMosse = False def cella(direzione, a, b): # restituisce la cella a,b della matrice, ruotata secondo la direzione try: if direzione==0: return matrice[a][b] elif direzione==1: return matrice[len(matrice)-1-a][b] elif direzione==2: return matrice[a][len(matrice[0])-1-b] elif direzione==3: return matrice[len(matrice)-1-a][len(matrice[0])-1-b] except: raise Exception def Pattern1(direzione, a, b): # ricerca il pattern XXyX try: return (cella(direzione, a, b) == cella(direzione, a, b+1) and cella(direzione, a, b) != cella(direzione, a, b+2) and cella(direzione, a, b) == cella(direzione, a, b+3)) except: return False def Pattern2(direzione, a, b): # ricerca il pattern XyX # X try: return (cella(direzione, a, b)!=cella(direzione, a, b+1) and cella(direzione, a, b)==cella(direzione, a+1, b+1) and cella(direzione, a, b)==cella(direzione, a, b+2)) except: return False def Pattern3(direzione, a, b): # ricerca il pattern XXy # X try: return (cella(direzione, a, b)==cella(direzione, a, b+1) and cella(direzione, a, b)!=cella(direzione, a, b+2) and cella(direzione, a, b)==cella(direzione, a+1, b+2)) except: return False for direzione in range(0, 4): for a in range(0, len(matrice)): for b in range(0, len(matrice[0])): altreMosse = altreMosse or Pattern1(direzione, a, b) altreMosse = altreMosse or Pattern2(direzione, a, b) altreMosse = altreMosse or Pattern3(direzione, a, b) print "Ancora mosse? ", altreMosse
Nessun commento:
Posta un commento