| |||
| © Perl Mongers Italia. Tutti i diritti riservati. | |||
Qualche mese fa mi feci un bel regalo comprandomi un Pocket PC. Quando però, per caso, mia moglie scoprì che al suo interno c'erano anche dei giochi, iniziai a perderne il possesso! In particolare fu attratta da "Jawbreaker" un giochino di quelli "scacciapensieri" nel quale lo scopo è quello di ripulire lo schermo cliccando su palline colorate dello stesso colore, purché vicine orizzontalmente o verticalmente. All'inizio sembrava facile e anche un po' stupido come gioco, ma quello che lo rese interessante fu il fatto che per poter realizzare più punti (vero scopo del gioco) occorreva eliminare maggiori quantità di palline con un solo click. Ciò è possibile combinando insieme dei "serpentoni" di palline dello stesso colore, che aumentano così in modo esponenziale il punteggio realizzabile. Ora, siccome rivolevo il mio palmare :), pensai di riscrivere il giochino. E con Perl e il Web il tutto è stato un vero "gioco". E' possibile visualizzare o se si vuole anche giocare con "dodobreaker" (così l'ho chiamato) su http://www.isogest.org/cgi-bin/dodobreaker .
Come funzionaVolendo realizzare il tutto in modo semplice ma soprattutto veloce, mi sono tenuto lontano da interfacce grafiche ed ho optato per una soluzione web-based. Così grazie a Perl per l'elaborazione, l'Html per la presentazione e i Cookie per la registrazione della posizione delle palline sulla maschera e del punteggio realizzato è stato possibile in poche righe assemblare il tutto. Iniziamo a definire l'ambienteCome si è detto dodobreaker è in Perl, quindi subito indichiamo l'amata shebang e richiamiamo il modulo CGI con i suoi "metodi standard". Tale modulo infatti permette di gestire e creare in modo semplice e veloce pagine html dinamiche, proprio quello che occorre al nostro progetto. Ovviamente il tutto per funzionare dovrà girare in un completo sistema client/server web, vale a dire che lo script dovrà essere eseguito lato server da un web-server, presumibilmente Apache, e lato client il giocatore dovrà utilizzare un normale browser con il quale raggiungere il web-server. Inseriti gli opportuni richiami alla shebang e al modulo CGI, definiamo alcune variabili lessicali che saranno visibili nell'intero script e che impostano la grandezza della griglia (così chiameremo lo schema grafico del gioco), il percorso per rintracciare le immagini che costituiranno le palline e le variabili per il punteggio e la posizione delle palline.
Il Work FlowSi è suddiviso lo script in procedure per meglio far comprendere il flusso dell'esecuzione che si alternerà tra un click dell'utente e l'altro. Difatti trattandosi di uno script cgi, dobbiamo entrare nell'ottica che ad ogni click dell'utente lo script dovrà rielaborare tutto il gioco eseguendo il flusso sotto descritto.
Crea una nuova griglia o la ricostruisce se già esisteLa griglia contenente la posizione e il colore di ogni pallina è definita all'interno dell'array multidimensionale @ball il quale ha come indici di riferimento rispettivamente la posizione x e y della pallina, e 0 o 1 a seconda se si vuol ottenere il valore del colore della pallina o del punteggio ottenuto cliccando sul di essa. Come si vede dal codice la prima operazione è la verifica che lo script non sia chiamato con un "action" uguale a "new" il che creerebbe una nuova maschera per il gioco. Dopodiché estrae lo schema e il punteggio dai cookie "dodoschema" e "dodopoint", e popola l'array @ball.
Cancella dalla griglia le palline selezionate dall'utenteOgni click del giocatore su una pallina richiama lo stesso script ma con i parametri "x" e "y" valorizzati dalla posizione della pallina che si vuol eliminare. Con questi parametri lo script, grazie alla sub get_snake, intercetta la posizione di tutte le palline confinanti con la pallina selezionata e ne cambia i valori all'interno dell'array @ball, mettendo a 0 sia il colore che il punteggio. Da notare la formula
Rielabora la griglia muovendo le palline in basso a destraAd ogni eliminazione delle palline selezionate dall'utente, per effetto della gravità dobbiamo translare tutte le palline sovrastanti verso il basso. Non solo, il gioco originale oltre a spostarle verso il basso, le spinge verso destra in modo da non lasciare spazi vuoti tra esse. La procedura seguente è suddivisa in due cicli, nella prima spostiamo tutte le palle verso il basso, e nella seconda le spostiamo verso destra, ma in realtà la logica applicata è la stessa per entrambe le parti. Il tutto si svolge molto semplicemente esaminado la griglia dal basso verso l'altro nella prima parte, e da destra verso sinistra nella seconda, se ci sono spazi vuoti seguiti da spazi pieni. Nel caso si verifichi questa situazione lo script sposta le palline semplicemente manipolando il contenuto di @balls.
Salva la posizione delle palline e visualizza la grigliaSiamo giunti alla fine dello script, abbiamo la nuova griglia da mostrare all'utente, dobbiamo solo farne il rendering in html e salvarla per poterla riutilizzare nella sessione successiva al click dell'utente. Notoriamente il sistema più pratico per mantenere informazioni tra sessioni http sono i cookie. Con questi lo sviluppatore può salvare informazioni sul client del visitatore e richiamarle ad ogni successiva sessione. Lo script quindi salverà in un cookie l'intero schema della griglia aggiornandolo ad ogni click dell'utente. Abbiamo detto che le informazioni inerenti la griglia sono contenute nell'array Si noti nello script la definizione dell'attributo "alt" del tag "img" che permetterà all'utente spostando il mouse, di visualizzare il punteggio che otterrà cliccando su una determinata pallina piuttosto che su un'altra.
Procedure interneLe procedure sopra descritte hanno bisogno di due piccole procedure "get_nearest" e "get_snake". Cerca le coordinate delle palline vicino la posizione selezionataMolto semplicemente questa procedura restituisce un array contenente la posizione x/y delle palline vicine ad una determinata pallina. Vale a dire la posizione delle pallina superiore e inferiore e quella destra e sinistra di una determinata coordinata, escludendo ovviamente quelle posizioni non facenti parte della griglia esistente.
Restituisce la posizione del serpentoneIl nome di questa procedura ne fa comprendere lo scopo. Per il calcolo del punteggio o anche l'eliminazione delle palline dello stesso colore e vicine alla pallina selezionata, abbiamo bisogno delle relative coordinate. Questa procedura restituisce un array contenente le coordinate x e y, di tutte le palline facenti parte del serpentone dello stesso colore, che si eliminerà cliccando su una determinata pallina.
Ottimizzare lo scriptNonostante la sua semplicità, lo script presentato offre la possibilità di provare il funzionamento di molteplici aspetti che riguardano la programmazione in Perl e in special modo la programmazione in un ambiente web-based. Difatti in poche righe di codice abbiamo potuto vedere sia come Perl interagisce con l'ambiente CGI ma anche come conservare informazioni tra sessioni web. Gli aspetti che mancano e che lasciamo alla fantasia del lettore potrebbero riguardare:
Buon divertimento! | |||