Yuppie (Normal User)
Newbie
Messaggi: 1
Iscritto: 29/04/2010
|
Ciao a tutti
nel mio gioco in memory sto cercando di creare una tabella con dentro la classifica dei migliori dieci giocatori e che compaia al termine della partita se si vince, ma purtroppo mi compare solo una jframe con il contenuto vuoto e non capisco la motivazione. Metto il file zip e posto le parti di codice.
Main
Codice sorgente - presumibilmente Java |
package memory; /** * @author Nicolò */ /** * In questo semplice main, viene creato un mazzo con le sue carte e viene passato a un oggetto della classe View * che si prendere cura di farlo visualizzare. */ public class Main { public static void main (final String[] args ) { Mazzo mazzo = new Mazzo(); @SuppressWarnings("unused") } }
|
Carta
Codice sorgente - presumibilmente Java |
package memory; /** * @author Nicolò */ import java.awt.Image; import java.awt.Toolkit; /** * Nella classe Carta vengono create funzioni che tendono a memorizzare lo stato della carta, ossia se è presente * (COPERTA o VISIBILE) o se è stata rimossa dal tavolo, e a dirci la sue proprietà, tipo l'immagine */ public class Carta { /** * Queste costanti ci informano dello stato della carta: * - VISIBILE: la carte è visibile con la sua immagine; * - COPERTA: è visibile il retro della carta; * - RIMOSSA: la carta è stata rimossa dal gioco. */ static final int VISIBILE = 1; static final int COPERTA = 0; static final int RIMOSSA = -1; /** * - stato: ci indica se la carta è stata è presente (coperta o girata) o se è stata rimossa dal gioco; * - tipo: indica il seme della carta; * - immagine: variabile di tipo Image contenente l'immagine del seme della carta; * - retro: variabile di tipo image che contiene il retro della carta (uguale per tutte le carte). */ private int stato; private int tipo; /** * Costruttore della classe. Quando un oggetto di tipo Carta viene inizializzato richiede il seme (o tipo) della carta. * Quindi imposta il tipo, poi carica l'immagine del rispettivo simbolo e infine imposta lo stato su COPERTA, * poichè tutte le carte a inizio gioco mostrano il retro. * @param simbolo */ public Carta(int simbolo){ tipo = simbolo; caricaImmagine(simbolo); stato = Carta.COPERTA; } /** * Funzione che ritorna un immagine a seconda dello stato: * - l'immagine se lo stato è VISIBILE; * - il retro se lo stato è COPERTA; * - fa return null se lo stato è RIMOSSA. * @return */ if (stato == Carta.VISIBILE) return immagine; else if(stato == Carta.COPERTA) return retro; else return null; } /** * Funzione utilizzata per girare la carta, quindi può modificare lo stato da COPRTA a VISIBILE e viciversa, * ma non può impostarlo su RIMOSSA. */ public void volta(){ if (stato == Carta.VISIBILE) stato = Carta.COPERTA; else if(stato == Carta.COPERTA) stato = Carta.VISIBILE; } /** * Funzione che imposta lo stato della carta su RIMOSSA. In sostanza la funzione lo scopo di questa funzione è quella di rimuovere dal gioco la carta. */ public void rimuovi(){ stato = Carta.RIMOSSA; } /** *Funzione similie alla funzione rimuovi: in sostanza il compito di questa funzione è quella di riassegnare lo stato * COPERTA alla carta facendola tornare quindi visibile in gioco. */ public void riassegna(){ stato = Carta.COPERTA; } /** * Funzione che ha il compito di caricare le immagini per poi passarle al mediatracker nell classe Mazzo * e quindi renderle visibili. Alla funzione viene passato una variabile di tipo int che rappresenta il seme * della carta e quindi indica alla funzione quale immagine caricare. * @param n */ public void caricaImmagine(int n){ immagine = kit.getImage("carta"+n+".jpg"); retro = kit.getImage("carta_retro.jpg"); } /** *Funzione il cui semplice compito è quello di fare un return simbolo della carta in esame. * @return */ public int simbolo() { return tipo; } /** * Funzione booleana che effettua un comparazione tra la carta che si sta valutando e un altra passata come parametro. * Ritorna true se le carte sono uguali, false in caso contrario. * * @param compara * @return */ public boolean Uguale(Carta compara) { if (compara.simbolo() == tipo) return true; else return false; } /** * Funzione booleana che controlla se la carta analizzata è stata rimossa o è ancora in gioco. * Ritorna true se le carta è stata rimossa, false in caso contrario. * @return */ public boolean Rimossa() { if (stato == Carta.RIMOSSA) return true; else return false; } /** * Funzione booleana che controlla se la carta analizzata è visibile oppure se è coperta o rimossa. * Ritorna true se le carta è visibile, false in caso contrario. * @return */ public boolean Visibile(){ if(stato == Carta.VISIBILE) return true; else return false; } }
|
Mazzo
Codice sorgente - presumibilmente Java |
package memory; /** * @author Nicolò * Nella classe Mazzo vengono creati 16 oggetti di tipo Carta, i quali vengono istanziati con i relativi semi e le relative proprietà. * In questa classe vengono poi mescolate le carte. */ public class Mazzo { private Carta carte[]; /** * Costruttore della classe Mazzo. Qui viene istanziato un vettore di 16 carte che cosituiscono a tutti gli effetti un mazzo. * In seguito le carte vengono mescolate con l'apposita funzione mescola(). */ public Mazzo(){ carte = new Carta[16]; mescola(); } /** * Funzione che viene richiamata nel costruttore per mescolare la carte del mazzo. A ogni indice da 1 a 16 viene assegnato un sign booleano che viene messo a false * per tutti gli indici. In seguito usando un math.random() si sceglie a caso uno dei 16 indici e se il suo sign è a false * allora alll'elemento carta corrispondente a quel numero non è stata ancora dato un seme. Se invece sign è true il ciclo Do..While ripete l'operazione * fino a trovare un indice libero. */ public void mescola(){ boolean sign[] = new boolean[16]; int indice; for(int i = 0; i < 16; i++) sign[i] = false; for(int i = 0; i < 2; i++) for(int s = 0; s < 8; s++){ do{ indice = (int)(Math. random()*16 ); if (indice == 16) indice = 15; } while(sign[indice]); carte[indice] = new Carta(s); sign[indice] = true; } } /** * Semplice funzione che fa il return della carta con le sue relative caratteristiche. Alla funzione viene passato il numero della carta che si intende vedere. * @param i * @return */ public Carta Carta(int i){ return carte[i]; } }
|
Classifica
Codice sorgente - presumibilmente Java |
package memory; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Vector; /** * Classe che astrae la lista di records. * <p> * La lista è implementata tramite il metodo dei riferimenti. * * @author Nicolò Torreggiani */ /** * */ private static final long serialVersionUID = 1L; private static final int MAX_RECORDS = 10; // La radice della lista. private Record radice; // Numero di elementi in lista private int numero; /** * Funzione statica che consente di ricavare da una stringa i dati di un record. * * @param stringa La stringa da cui ricavare i dati del record. * @return Un oggetto Record corrispondente ai dati della stringa, il cui puntatore al record successivo è nullo. * @throws IllegalArgumentException Questa eccezione viene lanciata se non è possibile ricavare tutti i dati dalla stringa. */ int mosse; // Divide la stringa String parti [] = stringa. split(","); // Controlla l'esistenza effettiva delle stringhe try { if (parti[0] == null || parti[1] == null) } // Ricava il nome nome = parti[0]; // Prova a ricavare i numeri try { mosse = Integer. parseInt(parti [1 ]); } return new Record(nome, mosse, null); } /** * Costruttore della lista. Imposta le variabili e la radice. */ public Classifica() { numero = 0; radice = new Record(null, 0, null); } /** * Aggiunge un record alla lista in modo ordinato. L'ordine è decrescente. * * @param record Il record da aggiungere. */ public void Aggiungi(Record record) { Record puntatore = radice; // Scorriamo la lista in cerca del posto giusto while (puntatore.successivo != null) { if (record.Compara(puntatore.successivo) <= 0) break; puntatore = puntatore.successivo; } // Inseriamo il record nel posto giusto record.successivo = puntatore.successivo; puntatore.successivo = record; // Aumentiamo il numero di records numero++; // Controlliamo che non si sia superato il limite if (numero > Classifica.MAX_RECORDS) { RimuoviUltimo(); } } /** * Versione alternativa dell'aggiunta di un record. I parametri sono direttamente i dati del record. * * @param nome Nome del giocatore che ha effettuato il record. * @param punteggio Punteggio del record. * @param altezza Altezza del record. */ //public void Aggiungi(String nome, int punteggio, int altezza) { // Aggiungi(new Record(nome, punteggio, altezza, null)); //} public int Numero() { return numero; } /** * Consente di ottenere il record indice-esimo. * * @param indice L'indice del record che si vuole ottenere. * @return Il record indice-esimo. * @throws ArrayIndexOutOfBoundsException Se l'indice è scorretto viene lanciata una ArrayIndexOutOfBoundsException. */ Record puntatore = radice; // Controlliamo che l'indice sia corretto if (indice < 0 || indice >= numero) // Scorriamo fino al record desiderato for (int i = 0; i <= indice; i++) puntatore = puntatore.successivo; return puntatore; } // Rimuove l'ultimo record, se si è superato il limite private void RimuoviUltimo() { Record puntatore = radice; // Se non ci sono elementi si esce if (radice.successivo == null) return; // Scorre fino al penultimo while (puntatore.successivo.successivo != null) puntatore = puntatore.successivo; // Tronca il collegamento con l'ultimo puntatore.successivo = null; // Diminuisce il numero numero--; } //Salva la rubrica nell'aposito file public void save(){ //Per evitare che qualche listener sia un oggetto di una //classe non serializabile, svuotima la lista dei listener //prima di salvare e poi la ripristiniamo Vector tempListeners = listeners ; try{ out.writeObject(this); out.close(); } System. out. print("An Exception has been raised while saving the file " + file ); } listeners = tempListeners; } public void carica(){ Classifica migliori; try{ o = in.readObject(); } System. out. print("An exception has been raised while reading the file " + file + "\n" + e ); } if((o != null) && (o instanceof Classifica)) migliori = (Classifica)o; } }
|
Record
Codice sorgente - presumibilmente Java |
package memory; import java.io.Serializable; /** * Un elemento della lista dei records. * <p> * Questa classe è utilizzata soltanto dalla ListaRecords. Contiene allo stesso tempo i dati del record e un puntatore al record successivo. * <p> * La classe implementa l'interfaccia Serializable. Infatti i records sono salvati come oggetti nel file dei records. * * @author Nicolò Torreggiani */ /** * */ private static final long serialVersionUID = 1L; /** * Nome del giocatore che ha effettuato il record. */ /** * Numero di mosse fatte dal giocatore */ public int mosse; /** * Puntatore al record successivo. Viene impostato dalla lista quindi è transient. */ transient public Record successivo; /** * Costruttore del record. * * @param n Nome del giocatore che ha effettuato il record. * @param m numero di mosse * @param s Puntatore al record successivo. */ public Record (String n, int m, Record s ) { nome = n; mosse = m; successivo = s; } // // Confronta due records. // @param record Il record da confrontare con questo. // @return 0 se sono uguali, >0 se questo record ha usato più mosse per vincere di quello di confronto, <0 altrimenti. // Poi compare le i nomi dei due record: 0 sono uguali, se < 0 la prima stringa precede la seconda, se > 0 al contrario public int Compara(Record record) { int risultato; // Prima il numero di mosse risultato = this.mosse - record.mosse; // Poi il nome if (risultato == 0) risultato = this.nome.compareTo(record.nome); return risultato; } }
|
View
Codice sorgente - presumibilmente Java |
package memory; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDialog; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; /** * @author Nicolò * La classe View estende JPanel e implementa il MouseListener. L'oggetto di tipo View che verrà creato riceverà * come parametro un oggetto di tipo mazzo, poichè si dovrà occupare di visualizzarlo correttamente e dovrà occuparsi * di rendere visibili tutte le azioni e le modifiche che verranno fatte su di esso tramite il MousePressed. */ /** * */ private static final long serialVersionUID = 1L; private final Mazzo mazzo; private int preselezionata; private Contatore contatore; private int soluzione; private int difficoltà; private int mosse; private Classifica classifica; private GUI_classifica fenetre; /** * Costruttore della classe View, riceve come variabile un oggetto di tipo Mazzo (ovviamente con le carte al suo interno già mescolate). * In seguito viene inizializzato il MediaTracker che si dovrà occupare di rendere visualizzabili le carti nel pannello, due variabili contatore * e soluzione, utilizzate rispettivamente per contare il numero di mosse utilizzate per terminare il gioco * e per vedere se il giocatore ha indovinato tutte le coppie. * @param m */ mazzo = m; preselezionata = -1; contatore = new Contatore(0); soluzione = 0; classifica = new Classifica(); // Viene creato il frame e due JOpitonPane per chiedere al giocatore la difficoltà a cui vuole giocare // e per avveritrlo delle mosse a sua disposizione. frame = new JFrame("Memory 1.0 - Nicolò Torreggiani "); frame.setBounds(450, 200, 400, 420); frame.setResizable(false); frame. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); frame.addMouseListener(this); frame.getContentPane().add(this); frame.setVisible(true); Object[] options = {"Facile", "Media", "Difficile"}; int n = JOptionPane. showOptionDialog(frame, "Scegli la difficoltà:", "Difficoltà", null,options, options[1]); switch(n){ case 0: difficoltà = 56; break; case 1: difficoltà = 36; break; case 2: difficoltà = 24; break; } JOptionPane. showMessageDialog(frame, "Ha inizio una nuova partita!!\nRicorda: hai un massimo di " + difficoltà + " mosse per poter scoprire tutte le coppie!!\nBuon divertimento!!", "Nuova partita", JOptionPane. PLAIN_MESSAGE); Segui(); this.repaint(); } /** * Funzione che si occupa di prendere tutte le immagini e disegnarle. * @param g */ @Override int i = 0; g.clearRect(0,0, 400, 400); for (int x = 0; x < 4; x++){ for(int y = 0; y < 4; y++){ g.drawImage(mazzo.Carta(i).Immagine(), x*100 + 13, y*100, this); i++; } } } @Override /** * Creata poichè si ricorre a dei componenti SWING. */ paint(g); } /** * Funzione il cui scopo e quello di prendere le carte disegnate passarle al Media Tracker che poi si occupera della visulizzazione. * Prima viene passato il retro di tutte le carte, poi vengono volte a vengono passate le immagini dei vari semi. Infine tornano a essere volatate poichè */ public void Segui(){ int id = 0; for(int i = 0; i < 16; i++){ segugio.addImage(mazzo.Carta(i).Immagine(), id); mazzo.Carta(i).volta(); id++; segugio.addImage(mazzo.Carta(i).Immagine(), id); mazzo.Carta(i).volta(); id++; } try{ segugio.waitForAll(); } public void reset(){ mazzo.mescola(); for(int i = 0; i < 16; i++){ if(mazzo.Carta(i).Rimossa()) mazzo.Carta(i).riassegna(); } contatore.setVal(0); soluzione = 0; Object[] options = {"Facile", "Media", "Difficile"}; int n = JOptionPane. showOptionDialog(frame, "Scegli la difficoltà:", "Difficoltà", null,options, options[1]); switch(n){ case 0: difficoltà = 56; break; case 1: difficoltà = 36; break; case 2: difficoltà = 24; break; } JOptionPane. showMessageDialog(frame, "Ha inizio una nuova partita!!\nRicorda: hai un massimo di " + difficoltà + " mosse per poter scoprire tutte le coppie!!\nBuon divertimento!!", "Nuova partita", JOptionPane. PLAIN_MESSAGE); this.repaint(); } int indice; int x, y; x = e.getX() / 100; y = (e.getY()-25) / 100; indice = 4 * x + y; // Controllo che non sia stata rimossa if(!mazzo.Carta(indice).Rimossa()) { // Controllo che sia la prima carta selezionata if(preselezionata == -1) { preselezionata = indice; mazzo.Carta(indice).volta(); contatore.inc(); } else{ // Controllo che non sia la stessa carta if(preselezionata == indice){ System. out. println("E' la stessa carta"); //preselezionata = -1; //mazzo.Carta(indice).volta(); //contatore.inc(); } else { mazzo.Carta(indice).volta(); this.paint(this.getGraphics()); try { } // Controllo che le due carte siano dello stesso tipo if(mazzo.Carta(preselezionata).Uguale(mazzo.Carta(indice))){ mazzo.Carta(preselezionata).rimuovi(); mazzo.Carta(indice).rimuovi(); preselezionata = -1; contatore.inc(); soluzione++; } else{ System. out. println("Diverse"); mazzo.Carta(preselezionata).volta(); mazzo.Carta(indice).volta(); preselezionata = -1; contatore.inc(); } } } } this.repaint(); if((contatore.getVal()) > difficoltà){ JDialog dialog = option. createDialog(frame, "Nuova partita"); dialog.pack(); dialog.setVisible(true); int n = ((Integer)option. getValue()). intValue(); switch(n){ case 0: reset();break; } } if(soluzione == 8){ JOptionPane. showMessageDialog(frame, "Hai vinto in " + contatore. getVal() + " mosse!!", "Complimenti!!", JOptionPane. INFORMATION_MESSAGE); mosse = contatore.getVal(); classifica.Aggiungi(new Record(posizione, mosse, null)); fenetre = new GUI_classifica(classifica); fenetre.Mostra(); try { } fenetre.Nascondi(); System. out. println(posizione + "" + mosse ); JDialog dialog = option. createDialog(frame, "Nuova partita"); dialog.pack(); dialog.setVisible(true); int n = ((Integer)option. getValue()). intValue(); switch(n){ case 0: reset();break; } } } }
|
Contatore
Codice sorgente - presumibilmente Java |
package memory; /** * Classe che crea un oggetto in grado di essere incrementato, decrementato, settato a un valore diverso durante il suo utilizzo * e che è in grado di fare un return del suo valore. */ public class Contatore { private int valore; public Contatore(){ valore = 0; } public Contatore(int valore){ this.valore = valore; } public void setVal(int valore){ this.valore = valore; } public void inc(){ valore++; } public int getVal(){ return valore; } }
|
GUI_classifica
Codice sorgente - presumibilmente Java |
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package memory; // Oggetti grafici swing import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.SwingConstants; // Oggetti awt import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; /** * Grafica per visualizzare i records. * <p> * La classe estende l'oggetto grafico JPanel per comodità (nessun metodo è sovrascritto). * * @author Massimiliano Zanoli * @version 0.1 */ public class GUI_classifica extends JPanel { private static final long serialVersionUID = 1L; // Elementi grafici // Dati private int larghezza; private int altezza; private int numero; // Colori dei font /** * Il costruttore necessita di un'istanza della classe Struttura come riferimento, da cui ricavare i dati. * * @param riferimento La Struttura di riferimento. */ public GUI_classifica(Classifica classifica) { // Ottengo i dati font = "Comic Sans MS"; numero = classifica.Numero(); larghezza = 300; altezza = 300; // Creo i colori titolo = new Color(0, 255, 0 ); dati = new Color(0, 128, 0 ); nome = new Color(64, 255, 192 ); System. out. println("sono al gruppo 1"); // Creo la finestra finestra = new JFrame("Classifica"); finestra.setBounds(0, 0, larghezza, altezza); finestra.setResizable(false); finestra. setDefaultCloseOperation(JFrame. DO_NOTHING_ON_CLOSE); finestra.getContentPane().add(this); System. out. println("sono al gruppo 2"); // Creo il titolo intestazione = new JLabel("Classifica"); intestazione.setForeground(titolo); intestazione. setFont(new Font(font, Font. BOLD, 20 )); System. out. println("sono al gruppo 3"); autore = new JLabel("Giocatore:"); autore.setForeground(dati); autore. setFont(new Font(font, Font. BOLD, 16 )); System. out. println("sono al gruppo 4"); mosse.setForeground(dati); mosse. setFont(new Font(font, Font. BOLD, 16 )); System. out. println("sono al gruppo 5"); // Creo le etichette con i records records = new JLabel[numero ][2 ]; for (int i = 0; i < numero; i++) { records [i ][0 ] = new JLabel(classifica. Record(i ). nome); records [i ][1 ] = new JLabel("" + classifica. Record(i ). mosse); System. out. println(records [i ][0 ]. getText()); System. out. println(records [i ][1 ]. getText()); for (int c = 0; c < 2; c++) { records[i][c].setForeground(nome); records [i ][c ]. setFont(new Font(font, Font. PLAIN, 16 )); } } System. out. println("sono al gruppo 6"); // Messa a punto del pannello this. setBackground(Color. WHITE); this.add(intestazione); this.add(autore); this.add(mosse); for (int r = 0; r < numero; r++) { for (int c = 0; c < 2; c++) { this.add(records[r][c]); } } System. out. println("sono al gruppo 7"); } /** * Visualizza la finestra dei records. */ public void Mostra() { finestra.setVisible(true); } /** * Nasconde la finestra dei records. */ public void Nascondi() { finestra.setVisible(false); } }
|
Nell'oggetto classifica segna un paio di errori ma non dovrebbero influire nel problema che ho io.
|