16 dic 2010

Bejeweled: determinare se ci sono ancora mosse disponibili

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: