Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    separare grafica da codice java

    Ciao ragazzi.
    Premetto che sono alle mie prime armi con java. Il prof mi ha detto di separare la grafica dal codice. Il gioco è stile Memory. Qualcuno sa darmi una mano? Grazie in anticipo


    codice:
     
    package soup;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    import java.util.Random;
    
    @SuppressWarnings("serial")
    public class Partita extends JPanel{
    	private Tessera[] ts;	//Contiene le tessere visualizzate
    	private ImageIcon[] v;	//contiene le immagini da associare alle tessere
    	private int[]cont;		//Tiene conto del numero di assegnazioni di un'immagine
    	private Tessera[]confronto=new Tessera[2];	//contiene le tessere selezionate
    	private GridLayout gl;
    	private ScorePanel s;	//Pannello con le informazioni di gioco
    	private Suono ok;		
    	private Suono end;
    	private JDialog avviso;
    	private JDialog avviso2;
    	private int numCoppie;	//Numero di coppie visualizzate
    	private int sel=0;		//Numero di tessere selezionate
    	private int punteggio;
    	private int tentativi;
    	private int finePartita;	//Coppie trovate
    	private Timer pausa;	//Timer per aiuto "svela tessere per 2 secondi"
    	
    	
    	/**
    	 * @param tes
    	 * Numero totale di tessere da visualizzare
    	 * @param imgs
    	 * Numero di immagini da utilizzare
    	 * @param righe
    	 * Numero di righe dell'area di gioco
    	 * @param col
    	 * Numero di colonne dell'area di gioco
    	 */
    	
    	public Partita(int tes,int imgs,int righe,int col){
    		this.s=new ScorePanel();
    		this.ts=new Tessera[tes];
    		this.v=new ImageIcon[10];
    		this.cont=new int[10];
    		this.confronto=new Tessera[2];
    		this.numCoppie=(tes/2);
    		this.gl=new GridLayout(righe,col);
    		
    		setBackground(new Color(45,105,238));
    		setLayout(gl);
    		gl.setVgap(37);
    		gl.setHgap(20);
    		
    		this.ok=new Suono("Data/Cashreg.wav");
    		this.end=new Suono("Data/Applause.wav");
    		
    		this.punteggio=0;
    		this.tentativi=0;
    		this.finePartita=0;
    		
    		v[0]=new ImageIcon("prof/.....jpg");
    		v[1]=new ImageIcon("prof/.....jpg");
    		v[2]=new ImageIcon("prof/.....jpg");
    		v[3]=new ImageIcon("prof/.....jpg");
    		v[4]=new ImageIcon("prof/.....jpg");
    		v[5]=new ImageIcon("prof/.....jpg");
    		v[6]=new ImageIcon("prof/.....jpg");
    		v[7]=new ImageIcon("prof/.....jpg");
    		v[8]=new ImageIcon("prof/.....jpg");
    		v[9]=new ImageIcon("prof/.....jpg");
    		
    		Random r=new Random();	//Generatore di numeri casuali
    		
    		for(int i=0;i<cont.length;i++)
    			cont[i]=0;
    		int conteggio=0;	//Numero di ripetizioni della stessa immagine
    		if(imgs==4)		//Se la difficoltà è facile
    			conteggio=4;
    		else			//Difficoltà intermedia o difficile DA AGGIUSTARE
    			conteggio=2;
    		
    	c:	for(int i=0;i<ts.length;i++){
    			int x=r.nextInt(imgs);	//Sceglie casualmente un'immagine
    			
    			if(cont[x]<conteggio){
    				ts[i]=new Tessera(v[x],x,i);
    				cont[x]++;
    			}
    			if(ts[i]==null){	//Se non è stata associata un'immagine alla tessera
    				i--;
    				continue c;
    			}
    			final int a=i;
    			ts[i].getTB().addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent e){
    					ts[a].getTB().setEnabled(false);
    					
    					if(!s.isRunning())	//La selezione della prima 
    						s.startTimer();	//tessera fa partire il Timer
    					
    					if(sel==0){	//Se non ci sono tessere selezionate
    						confronto[sel++]=ts[a];
    					}
    					else{	//E' già attiva un'altra tessera 
    						confronto[sel]=ts[a];	//quindi si esegue il confronto
    						if(confronto[0].getEQ()==confronto[1].getEQ()){
    							//Le Tessere sono uguali
    							confronto[0].getTB().setEnabled(false);
    							confronto[1].getTB().setEnabled(false);
    							confronto[0].getTB().setVisible(false);
    							confronto[1].getTB().setVisible(false);
    							tentativi++;
    							punteggio+=10;
    							sel=0;
    							finePartita++;
    							ok.play();
    							s.aggiornaPunti(punteggio,tentativi);
    						}
    						else{
    							//Tessere diverse
    							confronto[0].getTB().setEnabled(true);
    							confronto[1].getTB().setEnabled(true);
    							confronto[0].getTB().setSelected(false);
    							confronto[1].getTB().setSelected(false);
    							tentativi++;
    							punteggio-=2;
    							sel=0;
    							s.aggiornaPunti(punteggio,tentativi);
    						}
    					}
    					if(finePartita==numCoppie){
    						//Tutte le coppie sono state trovate
    						terminaPartita();
    					}
    				}
    			});
    		}
    		
    		for(int i=0;i<ts.length;i++){	//Aggiunge le tessere al JPanel
    			add(ts[i].getTB());
    			ts[i].getTB().setEnabled(false);
    		}
    		
    		ActionListener a1=new ActionListener(){	//Aiuto 1
    			public void actionPerformed(ActionEvent e) {
    				if(!s.isRunning())
    					s.startTimer();
    				svelaTessere();
    			}
    		};
    		ActionListener a2=new ActionListener(){	//Aiuto 2
    			public void actionPerformed(ActionEvent e) {
    				if(!s.isRunning())
    					s.startTimer();
    				trovaCoppia();
    			}
    		};
    		ActionListener a3=new ActionListener(){	//Aiuto 3
    			public void actionPerformed(ActionEvent e) {
    				if(!s.isRunning())
    					s.startTimer();
    				trovaCorrispondente();
    			}
    		};
    		
    		//Aggiunge gli actionListener agli aiuti nello ScorePanel
    		s.addListeners(a1, a2, a3);	
    	}//Costruttore
    	
    	public void terminaPartita(){
    		end.play();
    		s.stopTimer();
    		int [] time=s.getTime();
    		FinePartita fp=new FinePartita(punteggio,time[0],time[1]);
    		fp.setVisible(true);
    		s.disattivaAiuti();
    		//oracle
    	}
    	
    	public ScorePanel getScorePanel(){
    		return this.s;
    	}
    	public void attivaTessere(){
    		for(int i=0;i<ts.length;i++)
    			ts[i].getTB().setEnabled(true);
    	}
    	public void setNomeGiocatore(String n){
    		s.setNomeGiocatore(n);
    	}
    	
    	public void svelaTessere(){
    		if(sel==1){	
    			//se c'è una tessera già selezionata non è possibile usare questo aiuto
    			avviso2=new JDialog();
    			avviso2.setLayout(null);
    			avviso2.setResizable(false);
    			avviso2.setModal(true);
    			avviso2.setTitle("Avviso !");
    			avviso2.setBounds(300,300,210,130);
    			JLabel msg=new JLabel("C'è una tessera selezionata !");
    			msg.setBounds(20,10,200,20);
    			msg.setFont(new Font("Calibri",1,14));
    			JButton ok=new JButton("OK");
    			
    			ok.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent e) {
    					avviso2.setVisible(false);
    				}
    			});
    			ok.setBounds(50,50,100,30);
    			avviso2.add(msg);
    			avviso2.add(ok);
    			avviso2.setVisible(true);
    		}
    		else{
    			s.setEnabledAiuto1(false);
    			punteggio-=3;
    			s.aggiornaPunti(punteggio, tentativi);
    			
    			this.pausa=new Timer(2000,new ActionListener(){
    				public void actionPerformed(ActionEvent e) {
    					for(int i=0;i<ts.length;i++){
    						ts[i].getTB().setEnabled(true);
    						ts[i].getTB().setSelected(false);
    					}
    					pausa.stop();
    				}
    			});
    			for(int i=0;i<ts.length;i++){
    				ts[i].getTB().setEnabled(false);
    				ts[i].getTB().setSelected(true);
    			}
    			pausa.start();
    		}
    	}
    	public void trovaCoppia(){
    		boolean trovato=false;
    		s.setEnabledAiuto2(false);
    		
    		for(int i=0;i<ts.length;i++){
    			for(int j=0;j<ts.length;j++){
    				if(ts[i].getTB().isVisible()&&ts[j].getTB().isVisible()&&ts[i].getEQ()==ts[j].getEQ()&&i!=j){
    					trovato=true;
    					ts[i].getTB().setEnabled(false);
    					ts[j].getTB().setEnabled(false);
    					ts[i].getTB().setVisible(false);
    					ts[j].getTB().setVisible(false);
    					tentativi++;
    					punteggio+=5;
    					finePartita++;
    					ok.play();
    					s.aggiornaPunti(punteggio,tentativi);
    				}
    				if(trovato)break;
    			}
    			if(trovato)break;
    		}
    		if(finePartita==numCoppie){
    			terminaPartita();
    		}
    	}
    	public void trovaCorrispondente(){
    		if(sel==0){ 
    			//Non è possibile usare questo aiuto senza una tessera già selezionata 
    			this.avviso=new JDialog();
    			avviso.setLayout(null);
    			avviso.setResizable(false);
    			avviso.setModal(true);
    			avviso.setTitle("Avviso !");
    			avviso.setBounds(300,300,210,130);
    			JLabel msg=new JLabel("Selezionare prima una tessera !");
    			msg.setBounds(10,10,200,30);
    			msg.setFont(new Font("Calibri",1,14));
    			JButton ok=new JButton("OK");
    			ok.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent e) {
    					avviso.setVisible(false);
    				}
    			});
    			ok.setBounds(50,50,100,30);
    			avviso.add(msg);
    			avviso.add(ok);
    			avviso.setVisible(true);
    		}
    		else{
    			s.setEnabledAiuto3(false);
    			
    			for(int i=0;i<ts.length;i++){
    				if(ts[i].getTB().isVisible()&&confronto[0].getEQ()==ts[i].getEQ()&&ts[i].getID()!=confronto[0].getID()){
    					confronto[1]=ts[i];
    					confronto[0].getTB().setEnabled(false);
    					confronto[1].getTB().setEnabled(false);
    					confronto[0].getTB().setVisible(false);
    					confronto[1].getTB().setVisible(false);
    					tentativi++;
    					punteggio+=5;
    					finePartita++;
    					sel=0;
    					ok.play();
    					s.aggiornaPunti(punteggio,tentativi);
    					
    					break;
    				}
    			}
    			if(finePartita==numCoppie){
    				terminaPartita();
    			}
    		}
    	}
    }
    
    class Tessera{
    	private JToggleButton tb;	//Rappresenta graficamente la tessera
    	private ImageIcon def;		//Immagine di default della tessera non selezionata
    	private int eq;				//Le tessere con la stessa immagine hanno eq uguale
    	private int id;				//Identifica univocamente una tessera
    	
    	public Tessera(ImageIcon selected,int a,int id){
    		this.def=new ImageIcon("Data/QmBlu.jpg");
    		this.tb=new JToggleButton(def,false);
    		this.tb.setSelectedIcon(selected);
    		this.tb.setDisabledSelectedIcon(selected);
    		this.tb.setSize(100,100);
    		this.eq=a;
    		this.id=id;
    	}
    	
    	public JToggleButton getTB(){
    		return this.tb;
    	}
    	public int getEQ(){
    		return this.eq;
    	}
    	public int getID(){
    		return this.id;
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16
    devi creare due packages.
    uno per la grafica e l'altro per il gioco.
    La classe con il main sarà nel gioco. A questo punto la prima cosa che farai sarà creare un'istanza del gioco e poi passare quest'ultima al "constructor" della grafica.

  3. #3
    Grazie mille per la risposta. Puoi farmi un esempio usando il codice postato?

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16
    Guarda non ho tempo, però vedo di darti un esempio veloce veloce:

    Soluzione : quando l'user interagisce con la GUI, qualche metodo del gioco viene chiamato.
    il gioco elabora quello che deve elaborare e poi passa il risultato alla GUI. Quest'ultima si comporterà in diversi modi in base al risultato.

    Classe con il main
    codice:
    public static void main(String[] args) {
    
        // Crei il gioco
       Gioco gioco = new Gioco();
        
        // Crei la GUI
       GUI gui = new GUI(gioco);
    }
    Quando sposti parti di codice devi tenere bene in mente cosa tu consideri GUI e cosa Gioco.
    Per esempio una variabile di tipo: JTable è sicuramente parte della GUI, mentre il punteggio fa parte del gioco.

  5. #5
    Ho capito che i vari panneli (jpanel) fanno parte della GUI. Ma quello che non capisco è proprio a livello di codice, nel senso, come scrivo tutto questo. La classe Partita è un pannello e il prof dice che non deve esserlo. Ma a livello di codice come la modifico? Ti posto la classe che contiene il main(). Quando hai tempo se ti va puoi rispondere.

    codice:
    package soup;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class SoupGame extends JFrame{
    	private SelezioneLivelli sl;
    	private GridBagLayout gbl=new GridBagLayout();
    	private boolean partitaIniziata;
    	private StartPanel sPanel;
    	private Logging log;
    
    	private Partita p;
    	
    	private JMenu game;
    	private JMenu help;
    	
    	
    	private JMenuItem nuovaP;
    	private JMenuItem nomeGioc;
    	private JMenuItem livelli;
    	
    	
    	
    	private JMenuItem chiudi;
    	private JMenuItem info;
    	
    	public SoupGame(){
    		setResizable(false);
    		setBounds(50,50,800,600);
    		setTitle("Memory");
    		setLayout(gbl);
    		
    		
    		this.log=new Logging();
    		this.sl=new SelezioneLivelli();
    		this.sPanel=new StartPanel();
    		
    		JMenuBar menu=new JMenuBar();	//Creazione menu
    		game=new JMenu("Game");
    		help=new JMenu("?");
    		
    		nuovaP=game.add("Nuova partita");
    		nomeGioc=game.add("Cambia nome giocatore");
    		livelli=game.add("Livelli di difficoltà");
    		
    		game.addSeparator();
    		chiudi=game.add("chiudi");
    		info=help.add("About Memory");
    		
    		nuovaP.setIcon(new ImageIcon("MenuImages/nuovaPartita.jpg"));
    		nomeGioc.setIcon(new ImageIcon("MenuImages/rename.gif"));
    		livelli.setIcon(new ImageIcon("MenuImages/levels.gif"));
    		
    		chiudi.setIcon(new ImageIcon("MenuImages/quit.gif"));
    		info.setIcon(new ImageIcon("MenuImages/info.gif"));
    		
    		game.setMnemonic('g');
    		help.setMnemonic('h');
    		nuovaP.setAccelerator(KeyStroke.getKeyStroke("F2"));
    		nomeGioc.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,InputEvent.CTRL_MASK));
    		livelli.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));
    		
    		chiudi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,InputEvent.CTRL_MASK));
    		info.setAccelerator(KeyStroke.getKeyStroke("F1"));
    		
    		nuovaP.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				sPanel.setVisible(false);
    				if(partitaIniziata){
    					p.setVisible(false);
    					p.getScorePanel().setVisible(false);
    				}
    				iniziaPartita();
    			}
    		});
    		
    		nomeGioc.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				log.updateComp();
    				log.setVisible(true);
    				if(partitaIniziata)
    					p.setNomeGiocatore(log.getNomeGiocatore());
    				else
    					sPanel.setNomeGiocatore(log.getNomeGiocatore());
    			}
    		});
    		
    		livelli.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				sl.updateComp();
    				sl.visualizza(true);
    				if(!sl.isCancelled()){
    					if(partitaIniziata){
    						p.setVisible(false);
    						p.getScorePanel().setVisible(false);
    					}
    					iniziaPartita();
    				}
    			}
    		});
    		
    		
    		
    		
    		
    		chiudi.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				System.exit(0);
    			}
    		});
    		
    		info.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				AboutDialog ad=new AboutDialog();
    				ad.setVisible(true);
    			}
    		});
    		
    		menu.add(game);
    		menu.add(help);
    		
    		GridBagConstraints startGBC=new GridBagConstraints();
    		startGBC.anchor=GridBagConstraints.SOUTH;
    		startGBC.fill=GridBagConstraints.BOTH;
    		startGBC.gridx=0;
    		startGBC.gridy=1;
    		startGBC.gridheight=1;
    		startGBC.gridwidth=2;
    		startGBC.weightx=100;
    		startGBC.weighty=100;
    		
    		setJMenuBar(menu);
    		add(sPanel,startGBC);
    		
    		setVisible(true);
    		log.setVisible(true);
    		
    		sPanel.setNomeGiocatore(log.getNomeGiocatore());
    	}//Costruttore
    	
    	public void iniziaPartita(){
    		GridBagConstraints gameGBC=new GridBagConstraints();
    		gameGBC.anchor=GridBagConstraints.NORTHWEST;
    		gameGBC.fill=GridBagConstraints.BOTH;
    		gameGBC.gridx=0;
    		gameGBC.gridy=0;
    		gameGBC.gridheight=1;
    		gameGBC.gridwidth=1;
    		gameGBC.weightx=5;
    		
    		GridBagConstraints spGBC=new GridBagConstraints();
    		spGBC.anchor=GridBagConstraints.EAST;
    		spGBC.fill=GridBagConstraints.BOTH;
    		spGBC.gridx=1;
    		spGBC.gridy=0;
    		spGBC.gridheight=1;
    		spGBC.gridwidth=1;
    		spGBC.weightx=100;
    		spGBC.weighty=100;
    		
    		sPanel.setVisible(false);
    		
    		if(sl.getDifficolta()==1){	//Facile
    			setSize(800,600);
    			p=new Partita(16,4,4,4);
    		}
    		if(sl.getDifficolta()==2){	//Intermedio
    			setSize(800,600);
    			p=new Partita(16,8,4,4);
    		}
    		if(sl.getDifficolta()==3){  //Difficile
    			setSize(950,600);
    			p=new Partita(20,10,4,5);
    		}
    		
    		p.setNomeGiocatore(log.getNomeGiocatore());
    		p.attivaTessere();
    		p.getScorePanel().attivaBottoni();
    		add(p.getScorePanel(),spGBC);
    		add(p,gameGBC);
    		partitaIniziata=true;
    	}
    	
    	public void updateMenuItems(){
    		game.updateUI();
    		help.updateUI();
    	
    		
    		nuovaP.updateUI();
    		nomeGioc.updateUI();
    		livelli.updateUI();
    		
    		chiudi.updateUI();
    		info.updateUI();
    	}
    	
    	public static void main(String[] args) {
    		
    		
    		
    		SoupGame mg=new SoupGame();
    		mg.getJMenuBar().updateUI();
    		mg.setDefaultCloseOperation(EXIT_ON_CLOSE);
    	}
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Impara a non dire fammi un esempio o controllalo e a provare da te.
    Ora il prof ti dice che non deve essere un pannello, magari un altro container, un frame o un dialog, prova a modificarlo da te.
    I tutorial della oracle sulle swing sono ben fatti, pazienza sono in inglese, ma sono ottimi per muovere i primi passi con le swing

  7. #7
    La mia conoscenza delle swing l'ho appresa dalle guide di oracle. Ma non riesco ad applicarle(a livello di codice) al mio gioco.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    in che senso scusa?
    se sai creare un jdialog lo sai fare in ogni caso, non c'entra niente il gioco (che è solo un caso particolare di applicazione)

  9. #9
    ok so creare jdialog ecc.. ma (vado più in dettaglio):

    l'algoritmo che controlla se le tessere sono uguali (gioco Memory ), fa partire il timer quando clicco sulla prima tessera, finisce la partita quando non ci sono più tessere, insomma tutto questo codice deve star fuori da un jpanel.

    Sono stato chiaro? Quindi il mio problema è portare questo codice fuori dal jpanel.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Beh come qualcuno ti ha suggerito hai 2 classi, gioco e giocoGui. giocoGui avrà un riferimento a Gioco. Dentro gioco metti tutta la logica che a te interessa, giocoGui alla pressione di un bottone non fa altro che chiamare un metodo su gioco (passando i dovuti parametri se dovessero essere necessari).
    Dentro gioco hai il metodo startGame (inizia la partita), endGame (fine partita).
    Il timer è un discorso a parte, in genere ti avvali di un oggetto Timer che metti dentro la classe Gioco.

    Come vedi i suggerimenti ti sono stati dati (anche chi ti ha suggerito di creare gioco e giocogui), non puoi pretendere che rifattorizziamo il tuo codice per te.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.