Dopo aver disposto gli elementi principali nell'area di lavoro passiamo alla fase di programmazione, che poi è solitamente la fase più complessa di un gioco, anche quando esso è relativamente semplice come "concetto" come appunto Memory.
Il campo di gioco
Per prima cosa dobbiamo creare dinamicamente le carte e disporre i simboli sotto di esse. Per questo possiamo usare il primo fotogramma, inserendo il seguente codice:
Listato 1. Moltiplicare le istanze delle carte
for(n=2;n<17;n++){
// Creiamo una nuova carta
duplicateMovieClip("carta1","carta" add n,-n);
// Posizioniamo la carta creata
tellTarget("carta" add n){
_x = _root.xPos;
_y = _root.yPos;
}
// Impostiamo la posizione della prossima carta
xPos += 30;
if(n%4 == 0){
yPos += 45;
xPos = carta1._x;
}
}
for(s=1;s<9;s++){
call("estrai");
primacarta=numero;
call("estrai");
secondacarta=numero;
duplicateMovieClip("simbolo" add s, "simbolo" add s add "copy",10+s);
duplicateMovieClip("simbolo" add s, "simbolo" add s add "copy2",20+s);
_root["carta" add primacarta].simb = s add "copy";
_root["carta" add secondacarta].simb = s add "copy2";
_root["carta" add primacarta].valore = s;
_root["carta" add secondacarta].valore = s;
_root["simbolo" add s add "copy"]._x = _root["carta" add primacarta]._x;
_root["simbolo" add s add "copy"]._y = _root["carta" add primacarta]._y;
_root["simbolo" add s add "copy"]._visible = false;
_root["simbolo" add s add "copy2"]._x = _root["carta" add secondacarta]._x;
_root["simbolo" add s add "copy2"]._y = _root["carta" add secondacarta]._y;
_root["simbolo" add s add "copy2"]._visible = false;
}
Spieghiamo cosa succede: utilizziamo un ciclo for
per generare le istanze delle varie carte. Un ciclo è una serie di azioni che viene eseguita finchè una determinata condizione è verificata. In questo caso il ciclo viene eseguito finchè la variabile n
risulta minore di 17, e ogni volta questa variabile viene incrementata di una unità.
Durante il ciclo viene creata una nuova carta duplicando la prima (duplicateMovieClip("carta1","carta" add n,-n)
), quindi questa carta viene posizionata nello stage grazie al codice:
Listato 2. Posizionare l'istanza della carta
tellTarget("carta" add n){
_x = _root.xPos;
_y = _root.yPos;
}
A questo punto incrementiamo le variabili xPos
e yPos
in modo da impostare la posizione della prossima carta.
Terminato il primo ciclo (che si occupa di creare e disporre le carte), ha inizio un altro ciclo for
, che crea le diverse "coppie" di carte per ogni simbolo: per prima cosa chiama la funzione estrai()
, quindi crea due copie dei vari simboli e le posiziona sotto alle due carte estratte dalla funzione. Il blocco di codice:
Listato 3. Posizionare i simboli su ogni istanza della carta
_root["simbolo" add s add "copy"]._x = _root["carta" add primacarta]._x;
_root["simbolo" add s add "copy"]._y = _root["carta" add primacarta]._y;
_root["simbolo" add s add "copy"]._visible = false;
_root["simbolo" add s add "copy2"]._x = _root["carta" add secondacarta]._x;
_root["simbolo" add s add "copy2"]._y = _root["carta" add secondacarta]._y;
_root["simbolo" add s add "copy2"]._visible = false;
Si occupa di posizionare i simboli in corrispondenza delle carte e di nasconderli, mentre il codice:
Listato 4. Assegnare simboli e valori alle carte
_root["carta" add primacarta].simb = s add "copy";
_root["carta" add secondacarta].simb = s add "copy2";
_root["carta" add primacarta].valore = s;
_root["carta" add secondacarta].valore = s;
Associa alle carte le variabili simb
e valore
, che saranno utilizzate nel gioco per controllare quando vengono trovati due simboli uguali: le carte con lo stesso simbolo infatti avranno la variabile valore
uguale tra loro.
La funzione estrai()
Inseriamo come fotogramma chiave il terzo della linea temporale, diamogli come etichetta "estrai" (come abbiamo già visto durante questa guida) e inseriamo il seguente codice
Listato 5. Generare l'estrazione casuale
numero = random(16)+1
if(_root["c"+numero] ne 1){
_root["c"+numero] = 1
}
else{
call("estrai")
}
La funzione è molto breve ma è fondamentale. Questa funzione infatti, quando viene richiamata, si occupa di selezionare le coppie di carte in cui inserire i simboli. La scelta è casuale grazie al comando random
.
Per essere certi che la stessa carta non venga scelta più di una volta, impostiamo la variabile "c" + numero
ad 1, così se durante un'altra estrazione casuale uscisse un numero già utilizzato, il controllo (if ...) se ne accorgerebbe e ripeterebbe la funzione fino all'estrazione di una carta non ancora utilizzata.
Azioni dell'utente
L'utente dovrà avere la possibilità di selezionare una carta e visualizzarne il simbolo, quindi selezionare una seconda carta e vedere il simbolo di quest'ultima: se i due simboli sono uguali le carte restano visibili e il punteggio aumenta, altrimenti le carte ritornano coperte. Una volta scoperte tutte le coppie, il giocatore vince.
La funzione che si occuperà del controllo, e che inseriremo nel secondo fotogramma nella linea temporale, con etichetta "controlla", è la seguente:
Listato 6. Gestire le selezioni dell'utente
if(clip_selezionato ne clip_uno){
_click ++;
if(_click == 1){
clip_uno = clip_selezionato;
cartauno = carta;
valore_uno = valore_selezionato;
}
if(_click == 2){
if(valore_selezionato ne valore_uno){
_root["simbolo" add clip_uno]._visible = false;
_root["simbolo" add clip_selezionato]._visible = false;
_root[cartauno]._visible = true;
_root[carta]._visible = true;
} else {
_root[cartauno]._visible = false;
_root[carta]._visible = false;
coppie++;
if(coppie == 8){
vittoria._visible = true;
}
}
_click = 0;
clip_uno = 0;
cartauno = 0;
valore_uno = 0;
}
}
Alcune parti del codice saranno spiegate più a fondo nella prossima lezione, per ora ci basti sapere che _click
, che abbiamo dichiarato all'inizio, avrà due possibili valori:
- 1 l'utente sceglie la prima carta
- 2 l'utente sceglie la seconda carta.
Nel primo caso saranno semplicemente impostate alcune variabili, da usare nel controllo successivo, grazie alle quali possiamo controllare quali carte sceglie l'utente e se i simboli corrispondono.
In caso di corrispondenza, i simboli rimarranno visibili e le carte saranno nascoste e non più selezionabili; in caso contrario, saranno nascosti i simboli.
Quando _click
ha valore 2, dopo il controllo, quale che sia l'esito viene azzerata e torniamo allo stato di "nessuna carta scelta" (infatti dopo aver scelto due carte, siano i lori simboli uguali oppure no, l'utente dovrà selezionare altre due carte). Analogamente vengono impostate a zero anche le variabili relative al controllo delle carte selezionate.
Questa funzione sarà richiamata dal movieclip fittizio che abbiamo creato nella lezione precedente, che a sua volta interagirà col pulsante interno di ogni carta. Vedremo come unire il tutto nella prossima lezione.