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.