Torre (Normal User)
Newbie
Messaggi: 14
Iscritto: 24/11/2009
|
Ciao a tutti!!
sto progettando il gioco del memory, quello insomma dove devi trovare le coppie di carte uguali. Però ho qualche problema con il gestire l'evento del click del mouse per mostrare le carte e poi confrontarle..voi come lo fareste?? io ho creato un frame con un jpanel principale diviso con un gridlayout in 4x4. in ogni cella ho poi inserito un altro jpanel nel quale mettere le carte..per il momento ho creato le seguenti classi:
- Main;
- Frame per la creazione del frame;
- PrincipalPanel per la gestione del JPanel principale
- RetroPanel per la gestione dei 16 singoli pannelli nel gridlayout
- Carte che contiene le stringhe con il percorso del file delle immagini delle 8 carte e una funzione getUrl per passare il percorso del file quando bisogna istanziare le immagini
Grazie mille a chiunque potrà darmi una mano
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
in questa situazione l'ideale è ricorrere al pattern Model-View-Controller.
In pratica così separi la parte dei dati e dell'elaborazione, quindi nel Model hai griglia array n*n con metodi per selezionare l'elemento in (x, y) e fare tutti i controlli e settare lo stato delle varie celle (tutti astrattivamente, senza pensare a jpanel ecc...).
Poi la parte grafica starà nella View che si auto aggiornarà in base ai valori che prenderà dal model.
Infine il Controller gestirà i click intercettando dove è stato fatto e dicendo poi al model che è stata cliccata la cella (x, y) allora il Model aggiornerà il suo stato interno, notificherà la View dell'aggiornamento che si ridisegnerà coi dati aggiornati.
Cercando magari qualche documento su google trovi maggiori spiegazioni su questo pattern fondmentale.
|
|
Torre (Normal User)
Newbie
Messaggi: 14
Iscritto: 24/11/2009
|
Grazie mille! solo una cosa..non ho ben capito il concetto della griglia array n*n..devo farla senza GridLayout? Se sì come?? Io ho pensato a un array di tipo byte
(es.:private byte griglia[][];
griglia = new byte[4][4];
ecc...)
ma poi non posso fare il cast delle immagini se le carico come tipo IMAGE. Quindi?
Ultima modifica effettuata da Torre il 25/11/2009 alle 12:20 |
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
nel modello devi dimenticarti di come poi implementi la View, nel modello fai una struttura dati astratta come un array bidimensionale, poi se nella View usi un gridlaout, disegni a mano in un cavans o altre cose non deve influenzare l'implementazone del modello di base.
cmq usare un tipo di dato byte per rappresentare la griglia di immagini non ha senso, devi usare un tipo di dato che possa rappresentare la griglia di immagini (e con un singolo byte è difficile).
potresti fare un array bidimensionale di tipo short dove con 0 indichi una cella coperta, con 1 una girata, e con 2 una eliminata perchè è stata scartata.
poi crei un altro array n*n di stringhe dove associ alla stessa cordinata (x, y) della griglia si short il nome dell'immagine che sarà poi il nome del file fisico contenente l'immagina.
O meglio ancora fai un array bidimensionale di una classe tuo chiamata Cella dove incapsuli tutte queste caratteristiche.
Ultima modifica effettuata da netarrow il 25/11/2009 alle 21:18 |
|
Torre (Normal User)
Newbie
Messaggi: 14
Iscritto: 24/11/2009
|
ok perfetto grazie mille!! tutto più chiaro...solo un ultima cosa..potresti spiegare meglio la questione dei due array come intendi costruirli?? scusa ma il java non lo adoro..ma l'esame devo darlo
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
No ora che ci penso quella soluzione dei due array è troppo vecchio-stile, in java è più pulita la soluzione della cella.
Nel senso che la cosa migliora dal punto di vista progettuale è fare la classe Cella, che incapsula:
- nome dell'immagine (che sarà anche il nome del file fisico dell'immagine, ma al modello questo non deve interessare)
- uno status in una enum magari dove indichi se è coperta, scoperta o scartata
- magari per comodità incapsuli le sue cordinate x, y nell'array bidimensionale dove è inserita
Poi nel modello dichiari un array bidimensionale che contiene oggetti Cella e metti dentro dei metodi per gestire il gioco quindi gestire la scelta della cella x, y e impostarla su scoperta, confrontare due celle, scartarle se sono uguali ecc...
Praticamente devi fare un Engine del gioco astratto, a tal punto di poterlo provare a console, e poi costruirci attorno una View grafica.
Se fai il programma orientato ai dati anzichè alle funzioni fondamentalmente si scrive da solo.
Ti allego un piccolo progetto che implementa il pattern MVC per giocare a una battagia navale semplficata, così vedi come strutturare questo genere di progetti
Ultima modifica effettuata da netarrow il 26/11/2009 alle 7:44 |
|
Torre (Normal User)
Newbie
Messaggi: 14
Iscritto: 24/11/2009
|
Grazie mille di tutto!!! non potevo chiedere di meglio!
|
|
Torre (Normal User)
Newbie
Messaggi: 14
Iscritto: 24/11/2009
|
Finalmente ho quasi completato il gioco e ho fatto tutto in 4 classi:
Carta
Codice sorgente - presumibilmente Java |
package memory; import java.awt.Image; import java.awt.Toolkit; public class Carta { static final int VISIBILE = 1; static final int COPERTA = 0; static final int RIMOSSA = -1; private short stato; private short tipo; public Carta(short simbolo){ caricaImmagine(simbolo); stato = Carta.COPERTA; } if (stato == Carta.VISIBILE) return immagine; else if(stato == Carta.COPERTA) return retro; else return null; } public void volta(){ if (stato == Carta.VISIBILE) stato = Carta.COPERTA; else if(stato == Carta.COPERTA) stato = Carta.VISIBILE; } public void rimuovi(){ stato = Carta.RIMOSSA; } public void caricaImmagine(int n){ immagine = kit.getImage("C:/Users/Nicolò/Pictures/carta"+n+".jpg"); retro = kit.getImage("C:/Users/Nicolò/Pictures/carta_retro.jpg"); } public int simbolo() { return tipo; } public boolean Uguale(Carta compara) { if (compara.simbolo() == tipo) return true; else return false; } }
|
Mazzo
Codice sorgente - presumibilmente Java |
package memory; import java.awt.*; import java.util.ArrayList; import java.util.Collections; /** * * @author Nicolò */ public class Mazzo { ArrayList<Carta> mazzo; Carta carte[]; public Mazzo(){ carte = new Carta[16]; mazzo = new ArrayList<Carta>(15); mescola(); } public void mescola(){ int i = 0; for(int j = 0; j < 2; j++) for(short p = 1; p <= 8; p++){ carte[i] = new Carta(p); mazzo.add(i, carte[i]); i++; } for (int h = 0; h < mazzo.size(); h++){ carte[h] = mazzo.get(h); } } public Carta[] mazzo(){ return carte; } public void rimuoviMazzo(int i){ carte[i].rimuovi(); } }
|
View
Codice sorgente - presumibilmente Java |
package memory; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.util.Observable; import java.util.Observer; import javax.swing.JFrame; import javax.swing.JPanel; /** * * @author Nicolò */ private int wc, hc, w, h; private final Mazzo m; private Carta c[]; /** * Viene richiamato ogni volta che un componetne grafico * viene aggiornato. */ @Override paint(g); } this.m = m; c = m.mazzo(); this.addMouseListener(this); frame = new JFrame("Memory 1.0 - Nicolò Torreggiani"); frame.setBounds(20, 20, 400, 420); frame.setResizable(false); frame. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); this.setLayout(null); frame.getContentPane().add(this); frame.setVisible(true); } @Override int i = 0; Graphics immagine = buffer. getGraphics(); for (int x = 0; x < 4; x++){ for(int y = 0; y < 4; y++){ immagine.drawImage(c[i].disegna(), x*100, y*100, null); i++; } } } short p = 0; int x, y, i, j; Carta one, two; one = new Carta(p); two = new Carta(p); x = y = i = j = 0; while(j < 2){ if (e.getX() >= x*100 && e.getX() <= (x*100)+74 && e.getY() >= y*100 && e.getY() <= (y*100)+74){ c[i].volta(); i++; j++; two = one; one = c[i]; } } if(one.Uguale(two)){ one.rimuovi(); two.rimuovi(); } else{ one.volta(); two.volta(); } } }
|
Ovviamente c'è anche il main. Quando faccio partire il programma però mi ritorna il seguente errore:
Codice sorgente - presumibilmente Java |
at memory.Main.main(Main.java:13) Java Result: 1 BUILD SUCCESSFUL (total time: 2 seconds)
|
Se non sbaglio significa che ho dimenticato di istanziare qualcosa ma non capisco. Cmq poi volevo anche consigli sulla gestione dell'evento mouse pressed e sulla grafica se secondo voi è ok.
Grazie mille a chiunque riuscirà a rispondermi |
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
allegaci il progetto intero così abbiamo pronto per provare e non dobbiamo noi metterci a copiare file per file.
|
|