DOMANDA Battaglia Navale in Java

Cotrox

Nuovo Utente
125
3
Salve ragazzi, è il mio primo approccio alle GUI di Java e ho fino ad ora improntato la struttura del gioco.
Solo che non so come poter rendere 'visibili al click' gli elementi della matrice a SX. Sapreste darmi una mano?

Ecco il codice:
Java:
package JavaHomeworks;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;

public class BattagliaNavaleGUI
{
    private JFrame frame;
    private JTextField[][] matriceA;
    private JTextField[][] matriceB;
    private JButton[] bottoni;
    private JLabel messaggio;
    private JLabel EnemyNick;
    private JLabel PlayerNick;
    private String titoloFinestra;
    private int numeroRigheA;
    private int numeroColonneA;
    private int numeroRigheB;
    private int numeroColonneB;
    private int numeroBottoni;
    private JLabel CreditsTxt0;
    private JLabel CreditsTxt1;
    private JLabel CreditsTxt2;
    private JLabel CreditsTxt3;
    private JLabel regolaTitle;
    private JLabel regola1;
    private JLabel regola2;
    private JLabel regola3;
    private JLabel regola4;

    /* INIZIO PARTE DA PERSONALIZZARE */
    // Attributi dell'applicazione
    /* FINE PARTE DA PERSONALIZZARE */

    public BattagliaNavaleGUI()
    {    /* INIZIO PARTE DA PERSONALIZZARE */
        titoloFinestra = "Battaglia Navale";
        numeroRigheA = 10;
        numeroColonneA = 10;
        numeroRigheB = 10;
        numeroColonneB = 10;
        numeroBottoni = 3;
        /* FINE PARTE DA PERSONALIZZARE */

        inizializza();
    }

    private void bottonePremuto(int numeroBottone)
    {    /* INIZIO PARTE DA PERSONALIZZARE */
        if(numeroBottone == 1)
        {
            setMessaggio("Avvio di una nuova partita!");
            bloccaMatriceB();
            setRandomA();
            setRandomB();
            
        }
        if(numeroBottone == 2)
        {
            setMessaggio("Leggi le regole del gioco!");
            regolamento();
        }
        if(numeroBottone == 3)
        {
            setMessaggio("Ecco chi ha realizzato il gioco!");
            credits();
        }
        
        /* FINE PARTE DA PERSONALIZZARE */
    }

    public static void main(String[] args)
    {   
        // AVVIO DEL GIOCO
        BattagliaNavaleGUI  p = new BattagliaNavaleGUI (); // Creazione Interfaccia
        
        /* BOTTONI AZIONE */
        p.setEtichettaBottone(1, "Avvia Partita");
        p.setEtichettaBottone(2, "Regole del gioco");
        p.setEtichettaBottone(3, "Crediti");
        /* BOTTONI AZIONE */
        
    }
    
    private int randomize()
    {
        Random rand = new Random();
        int max = 2;
        int result = rand.nextInt(max);
        return result;
    }
    
    private void setRandomA()
    {
        for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                matriceB[i][j].setText("" + randomize());
    }
    
    private void setRandomB()
    {
        for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                matriceB[i][j].setText("" + randomize());
    }
    
    private void setMessaggio(String m)
    {    messaggio.setText(m);
    }

    private void setEtichettaBottone(int numeroBottone, String etichetta)
    {    bottoni[numeroBottone-1].setText(etichetta);
    }

    private String[][] getMatriceA()
    {    String[][] ret = new String[numeroRigheA][numeroColonneA];
        for(int i=0;i<numeroRigheA;i++)
            for(int j=0;j<numeroColonneA;j++)
                ret[i][j] = matriceA[i][j].getText();
        return ret;
    }

    private String[][] getMatriceB()
    {    String[][] ret = new String[numeroRigheB][numeroColonneB];
        for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                ret[i][j] = matriceB[i][j].getText();
        return ret;
    }

    private void setMatriceA(String[][] A)
    {    for(int i=0;i<numeroRigheA;i++)
            for(int j=0;j<numeroColonneA;j++)
                matriceA[i][j].setText(A[i][j]);
    }

    private void setMatriceB(String[][] B)
    {    for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                matriceB[i][j].setText(B[i][j]);
    }
    
    private void bloccaMatriceA()
    {   
        // Non sarà possibile scrivere nella matrice
        for(int i=0;i<numeroRigheA;i++)
            for(int j=0;j<numeroColonneA;j++)
                matriceA[i][j].setEditable(false);;
    }

    private void sbloccaMatriceA()
    {    for(int i=0;i<numeroRigheA;i++)
            for(int j=0;j<numeroColonneA;j++)
                matriceA[i][j].setEditable(true);;
    }
    
    private void bloccaMatriceB()
    {    for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                matriceB[i][j].setEditable(false);;
    }

    private void sbloccaMatriceB()
    {    for(int i=0;i<numeroRigheB;i++)
            for(int j=0;j<numeroColonneB;j++)
                matriceB[i][j].setEditable(true);;
    }
    
    private int[][] convertiInMatriceIntera(String[][] m)
    {    int nRighe=m.length;
        int nColonne=m[0].length;
        int[][] ret = new int[nRighe][nColonne];
        for(int i=0;i<nRighe;i++)
            for(int j=0;j<nColonne;j++)
                if(m[i][j].equals(""))
                    ret[i][j]=0;
                else
                    ret[i][j]=Integer.parseInt(m[i][j]);
        return ret;
    }

    private String[][] convertiDaMatriceIntera(int[][] m)
    {    int nRighe=m.length;
        int nColonne=m[0].length;
        String[][] ret = new String[nRighe][nColonne];
        for(int i=0;i<nRighe;i++)
            for(int j=0;j<nColonne;j++)
                ret[i][j]=""+m[i][j];
        return ret;
    }
    
    // Schermata del Regolamento
        private void regolamento()
        {
            frame = new JFrame();
            frame.getContentPane().setLayout(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            try
            {    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }
            catch(Exception e)
            {    System.out.println(e);
                System.exit(0);
            }
            frame.setVisible(true);
            frame.setBounds(100, 100, 600, 200);
            frame.setTitle("Le Regole del gioco");
            
            regolaTitle = new JLabel("REGOLAMENTO - HOW TO PLAY!");
            frame.getContentPane().add(regolaTitle);
            regolaTitle.setBounds(0, 10, 600, 60);
            regolaTitle.setHorizontalAlignment(JLabel.CENTER);
            
            regola1 = new JLabel("MatriceSX = Avversario (Computer).");
            frame.getContentPane().add(regola1);
            regola1.setBounds(0, 30, 600, 60);
            regola1.setHorizontalAlignment(JLabel.CENTER);
            
            regola2 = new JLabel("MatriceDX = Giocatore.");
            frame.getContentPane().add(regola2);
            regola2.setBounds(0, 50, 600, 60);
            regola2.setHorizontalAlignment(JLabel.CENTER);
            
            regola3 = new JLabel("All'avvio della partita saranno generate 2 matrici casuali.");
            frame.getContentPane().add(regola3);
            regola3.setBounds(0, 70, 600, 60);
            regola3.setHorizontalAlignment(JLabel.CENTER);       
            
            regola4 = new JLabel("Clicca nuovamente 'Avvia Partita' per ricominciare.");
            frame.getContentPane().add(regola4);
            regola4.setBounds(0, 90, 600, 60);
            regola4.setHorizontalAlignment(JLabel.CENTER);   
        }
    
    // Schermata dei Crediti
    private void credits()
    {
        frame = new JFrame();
        frame.getContentPane().setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try
        {    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e)
        {    System.out.println(e);
            System.exit(0);
        }
        frame.setVisible(true);
        frame.setBounds(100, 100, 600, 200);
        frame.setTitle("Crediti - Chi ha realizzato il gioco?");
        
        CreditsTxt0 = new JLabel("CREDITI");
        frame.getContentPane().add(CreditsTxt0);
        CreditsTxt0.setBounds(0, 20, 600, 60);
        CreditsTxt0.setHorizontalAlignment(JLabel.CENTER);
        CreditsTxt1 = new JLabel("Questo gioco ispirato a Battaglia Navale");
        frame.getContentPane().add(CreditsTxt1);
        CreditsTxt1.setBounds(0, 40, 600, 60);
        CreditsTxt1.setHorizontalAlignment(JLabel.CENTER);
        CreditsTxt2 = new JLabel("è stato creato da Giuseppe A. Cotroneo");
        frame.getContentPane().add(CreditsTxt2);
        CreditsTxt2.setBounds(0, 60, 600, 60);
        CreditsTxt2.setHorizontalAlignment(JLabel.CENTER);
        CreditsTxt3 = new JLabel("come Homework per l'esame di Fondamenti d'Informatica - Modulo Java.");
        frame.getContentPane().add(CreditsTxt3);
        CreditsTxt3.setBounds(0, 80, 600, 60);
        CreditsTxt3.setHorizontalAlignment(JLabel.CENTER);       
    }
    
    // Schermata di gioco
    private void inizializza()
    {    frame = new JFrame();
        frame.getContentPane().setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try
        {    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e)
        {    System.out.println(e);
            System.exit(0);
        }
        frame.setVisible(true);
        frame.setBounds(100, 100, 780, 360+30*numeroBottoni);
        frame.setTitle(titoloFinestra);

        // PopUp Message
        messaggio = new JLabel("");
        frame.getContentPane().add(messaggio);
        messaggio.setBounds(240, 270, 300, 30);
        messaggio.setHorizontalAlignment(JLabel.CENTER);

        // Giocatori
        EnemyNick = new JLabel("Avversario");
        frame.getContentPane().add(EnemyNick);
        EnemyNick.setBounds(50, 5, 300, 30);
        EnemyNick.setHorizontalAlignment(JLabel.LEFT);
        
        PlayerNick = new JLabel("Giocatore");
        frame.getContentPane().add(PlayerNick);
        PlayerNick.setBounds(180, 5, 300, 30);
        PlayerNick.setHorizontalAlignment(JLabel.RIGHT);
        
        bottoni=new JButton[numeroBottoni];
        ActionListener listener = new PressioneBottoni();
        for(int i=0;i<numeroBottoni;i++)
        {    JButton bottone=new JButton();
            bottone.setBounds(240, 300+30*i, 300, 30);
            bottoni[i]=bottone;
            bottone.addActionListener(listener);
            frame.getContentPane().add(bottone);
        }

        matriceA = new JTextField[numeroRigheA][numeroColonneA];
        for(int i=0;i<numeroRigheA;i++)
            for(int j=0;j<numeroColonneA;j++)
            {    JTextField campoTesto = new JTextField("");
                frame.getContentPane().add(campoTesto);
                campoTesto.setBounds(50+30*j, 60+20*i, 30, 20);
                campoTesto.setHorizontalAlignment(JTextField.CENTER);
                matriceA[i][j] = campoTesto;
            }
        for(int i=0;i<numeroRigheA;i++)
        {    JLabel numeroRigaA = new JLabel(""+i);
            frame.getContentPane().add(numeroRigaA);
            numeroRigaA.setBounds(30, 60+20*i, 30, 20);
        }
        for(int j=0;j<numeroColonneA;j++)
        {    JLabel numeroColonnaA = new JLabel(""+j);
            frame.getContentPane().add(numeroColonnaA);
            numeroColonnaA.setBounds(60+30*j, 40, 30, 20);
        }

        if(numeroRigheB != 0 || numeroColonneB != 0)
        {    matriceB = new JTextField[numeroRigheB][numeroColonneB];
            for(int i=0;i<numeroRigheB;i++)
                for(int j=0;j<numeroColonneB;j++)
                {    JTextField campoTesto = new JTextField("");
                    frame.getContentPane().add(campoTesto);
                    campoTesto.setBounds(430+30*j, 60+20*i, 30, 20);
                    campoTesto.setHorizontalAlignment(JTextField.CENTER);
                    matriceB[i][j] = campoTesto;
                }
            for(int i=0;i<numeroRigheB;i++)
            {    JLabel numeroRigaB = new JLabel(""+i);
                frame.getContentPane().add(numeroRigaB);
                numeroRigaB.setBounds(410, 60+20*i, 30, 20);
            }
            for(int j=0;j<numeroColonneB;j++)
            {    JLabel numeroColonnaB = new JLabel(""+j);
                frame.getContentPane().add(numeroColonnaB);
                numeroColonnaB.setBounds(440+30*j, 40, 30, 20);
            }
        }
        
        bloccaMatriceA();
    }

    private class PressioneBottoni implements ActionListener
    {    public void actionPerformed(ActionEvent e)
        {    int numeroBottonePremuto = -1;
            for(int i=0;i<numeroBottoni;i++)
                if(e.getSource()==bottoni[i])
                    numeroBottonePremuto = i + 1;
            bottonePremuto(numeroBottonePremuto);
        }
    }
}
 

BAT00cent

Utente Attivo
1,081
492
Ci sarebbero diverse cose da aggiustare prima:
innanzitutto sia il bottone per mostrare crediti che quello per le regole del gioco creano una nuova finestra 2principale", invece non dovrebbero farlo, basterebbe un pop-up (un JOptionPane per esempio); invece creando finestre normali, quando premi la "X" in alto a destra per uscire termina l'intera applicazione. In secondo luogo non è logica la tua implementazione: per mostrare i crediti o le regole del gioco basta scriverle in un file di testo che eventualmente puoi mostrare in una JTextArea o in un pop-up (da studiarci un po' su);
invece tu crei (inutilmente) delle JLabel per ogni riga da mostrare... pensaci un attimo: se vuoi cambiare il testo del regolamento del gioco una cosa è modificare un semplice file di testo indipendentemente dalla GUI, una cosa semplicissima. Invece per com'è fatta ora dovresti modificare il file .java, aggiungere label su label e ricompilare il tutto!
Insomma, l'applicazione-gioco è da aggiustare parecchio.
 
Ultima modifica:
  • Mi piace
Reactions: dev_java

Entra

oppure Accedi utilizzando

Discussioni Simili

Hot del momento