mercoledì 29 luglio 2015

Il gioco del 15

Il gioco del 15 è quel giochino composto da 15 tessere che bisogna rimettere in ordine, facendone scorrere solo una alla volta, sfruttando la posizione vuota che si viene a creare.
Farlo in livecode è veramente facile e veloce, vediamo come.
Create uno stack con 16 pulsanti:
Numerate i pulsanti e ordinatele in modo che siano equidistanti. Vi consiglio di selezionarle in righe e colonne e usare i pulsanti di allineamento e distribuzione del property inspector.
Fatto ciò nel codice del pulsante 16 mettete il seguente codice:

on mouseUp
   lock screen   
   put the loc of me into locme
   put the loc of button "16" into loc16
   if distanza(locme,loc16) < 97 then
      set the loc of me to loc16
      set the loc of button "16" to locme
   end if   
   unlock screen
   controllaVittoria
end mouseUp

function distanza aa,bb
   put ((item 1 of aa) - (item 1 of bb) )^2 into xx
   put ((item 2 of aa) - (item 2 of bb) )^2 into yy
   return sqrt(xx + yy)
end distanza

Come vedete il codice controlla se il pulsante premuto è sufficientemente vicino al pulsante 16, in tal caso lo scambia di posto col pulsante 16. In pratica fa un controllo se si trova accanto al pulsante 16 applicando la formula della distanza di geometria analitica √(ΔX2 + ΔY2) applicata ai baricentri (proprietà loc). Chiaramente io ho impostato 97 pixel, voi dovrete controllare quale valore rappresenta l'adiacenza dei pulsanti rispetto a quanto grandi li avete fatti.
Ora rendete invisibile il pulsante 16:
Impostate come behaviour di tutti i pulsanti quello del pulsante 16 e metà del gioco è già completo.
Se provate a premere su un pulsante esso si sposterà solo se è vicino alla casella vuota.
Ora mettete nella card il seguente codice:

on openCard
   mescola
end openCard

on controllaVittoria
   put the soluzione of me into ordine
   repeat with i=1 to 16
      put (the loc of button i ) & cr after temp
   end repeat
   if ordine = temp then
      answer "Hai vinto!"
   end if
end controllaVittoria

on impostaVittoria
   repeat with i=1 to 16
      put (the loc of button i ) & cr after temp
   end repeat
   set the soluzione of me to temp
end impostaVittoria

on mescola
   put "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" into temp
   put the soluzione of me into posizioni
   repeat with i=1 to 16
      put the number of items of temp into nn      
      put random(nn) into elemento
      put item elemento of temp & CR after ordineBottoni
      delete item elemento of temp #così leva anche la virgola
   end repeat   
   repeat for each line tLine in ordineBottoni
      set the loc of button tLine to the first line of posizioni
      delete the first line of posizioni
   end repeat
end mescola

lanciate il comando impostaVittoria e avete finito!
Lanciando il messaggio impostaVittoria salvate le posizioni dei pulsanti vincenti, quindi il messaggio controllaVittoria controlla se tutte le posizioni sono quelle giuste.
Il messaggio mescola serve per mescolare le carte.
Potete anche aggiungere un pulsate per poter rimettere tutti i pulsanti in ordine con il seguente codice:

on mouseUp
   put the soluzione of this card into temp
   repeat with i=1 to 16
      set the loc of button i to line i of temp
   end repeat
end mouseUp

Così:
Ora tocca a voi divertirvi ad aggiungere un timer, il numero di mosse utilizzato per vincere e qualche elemento grafico!
Se avete dubbi chiedete pure nei commenti.
NOTA: non tutte le combinazioni casuali generano un gioco del 15 risolvibile. Per l'esattezza solo la metà di tutte le possibili configurazioni (16! / 2), in un prossimo post spiegherò come capire se una combinazione è risolvibile.