Categoria:

Il gioco del memorize

15/02/2018 10:20 Pubblicato da

In questo tutorial andremmo a realizzare il gioco del memorize utilizzando java swing. I tasselli del gioco sono delle JLabel le quali hanno associate ognuna una icon. Inizialmente tutte le label hanno la stessa icon. Quando l’utente clicca su una label, essa cambia la icon con quella associata da una funzione random. Il gioco mostra anche lo score dell’utente il cui valore viene aggiornato alla fine di ogni azione dell’utente. Oltre allo score abbiamo anche il valore del tempo trascorso il quale viene aggiornato grazie ad uno Thread.

  Github

Andiamo adesso ad esaminare il codice.

Nella classe vengono dichiarate delle variabili private di tipo JLabel. Le JLabel che presentano un nome di variabile che inizia per lblNewLabel rappresentano i nosri tasselli. Mentre lblScore e lblTime rappresentano rispettivamente lo score e il tempo trascorso. La List di JLabel jlabels invece ci servirà per immagazinare tutte le JLabel tasselli per eseguire operazioni di gruppo e controlli.

In questo frammento di codice viene instanziata una classe anonima, Runnable, che fa l’override del metodo run(). Successivamente la classe anonima viene passata al metodo statico EventQueue.invokeLater(). Questo metodo aggiunge l’oggetto all’eventQueue. Nell’eventQueue ci sono svariati eventi come quelli della tastiera o del mouse. Esiste un thread che si occupa proprio dell’esecuzione del metodo run() di ogni oggetto che sta all’interno della eventQueue. MyFrame window = new MyFrame(); non viene eseguita all’interno del thread principale, ma in quello dell’event dispatching. Invcando il metodo setVisible(true) facciamo mostrare a schermo il frame. Mentre invocando il metodo setLocationRelativeTo() posizioniamo la finestra al centro dello schermo.

Il costruttore della classe MyFrame effettua l’inizializzazione invocando il metodo initialize().

In questo frammento di codice andiamo a creare un nuovo thread il quale ci servirà per determinare il tempo trascorso.

La parte successiva consiste nel creare una lista casuale di percorsi di immagini. Per prima cosa aggiungiamo tutte le nostre immagini in un ArrayList di URL. Successivamente creiamo una Map che ci consentirà di tenere conto delle immagini che sono state aggiunte. In seguito andiamo a creare la List di URL che conterrà la lista delle URL disposte in maniera casuale.

Il passo successivo consiste nel creare il mouse listener, il MouseAdapter. La classe MouseAdapter conterrà il metodo mouseClicked() che verrà eseguito ogni volta che l’utente preme sulla label. Il metodo mouseClicked inizialmente verifica se la label non è sun.png, infatti nel caso in cui fosse vero bisogna disabilitare il pulsante, quindi abbiamo un return. Se la icon della label non è sun.png allora verrà invocato il metodo resetIconsOneByOne() il quale provvederà a resettare le immagini nel caso in cui vi fossero due immagini che non siano sun.png e lascerà intatte quelle immagini che hanno la stessa URL. Il ciclo for serve per individuare la label che ha ricevuto il mouse click. Una volta individuata viene cambiata la icon della label con quella presente nella lista images la quale è stata generata precedentemente usando la funzione random. Alla fine viene eseguito un controllo sullo score invocando il metodo updateScore() il quale restituisce il valore del punteggio. Se lo score è pari a 8 allora viene stoppat il thread che si occupa dell’aggiornamento del tempo trascorso. Infine, per ogni JLabel, viene aggiunto il mouse listener che abbiamo creato precedentemente.

Il metodo resetIcons() viene invocato alla fine del metodo . Esso provvede a settare per tutte le JLabel l’icona sun.png.

Il metodo resetIconsOneByOne() può essere suddiviso in due segmenti di codice: il primo segmento, che inizia con il ciclo for, serve per individuare il numero delle label che hanno un’immagine che non sia sun.png e che non si ripeta, mentre il secondo segmento di codice, che viene eseguito solo se la size della list è maggiore o uguale a 2, ossia il numero delle immagini che non si ripetono, è maggiore o uguale a 2, serve per settare l’immagine sun.png a quelle immagini che non si ripetono. In altre parole questo metodo se trova una label che fa riferimento all’immagine sun.png, la ignora, se invece trova due immagini che hanno la stessa URL, le ignora e se trova due immagini che hanno URL diversa le sostituisce con sun.png.

updateScore() ha la stessa logica del metodo precedente e serve per aggiornare il punteggio.

Per rendere il gioco funzionante dobbiamo creare un’altra classe, la TimerThread.java.

Il TimerThread .java si occupa dell’aggiornamento del tempo trascorso all’interno del gioco. Implementa l’interfaccia Runnable e fa l’override del metodo run() il quale viene invocato quando facciamo t.start() all’interno del metodo initialize() della classe MyFrame.

16/02/2018 20:54