Salve a tutti, sono nuovo del forum. Mi sto cimentando con java per un esame di informatica grafica. Devo programmare il gioco salta casella (o gioco del 100), questo è il link ke spiega il gioco (tranquilli nn è spam!) http://www.carlogirelli.com/giochi/100/100.html
Vi spiego cosa ho fatto fino ad ora e qual'è il problema.
Ho esteso un jPanel nel quale da interfaccia scelgo quanto deve essere grande la mia matrice di Jbutton (NxN, min 5x5 max 10x10), cioè la mia pulsantiera di caselle per il gioco (l'ho creata con un array di array "JButton[i][j] b"). Questa pulsantiera compare quando clicco sul pulsante della GUI "gioca" e parte anche un cronometro. Fino a qui tutto ok.
Il problema è il seguente: cliccando su un pulsante a scelta dovo far comparire su esso il numero 1, poi sul secondo che clicco il 2...e così via. Per farlo ho creato un altro array questa volta di numeri interi grande quanto l'array della matrice di pulsanti (es: se la matrice è 10x10, l'array di numeri è 100).
Il problema è che nn riesco ad assegnare al corrente bottone che clicco il corrente numero progressivo! Cioè i numeri me li incrementa quando clicco, ma sempre sullo stesso bottone(tra l'altro il primo della matrice), qualunque button io clicchi all'interno della matrice.
Pensavo che per risolvere il problema avrei potuto usare un metodo che mi restituisse i valori i e j dell'ultimo bottone cliccato, in modo da dirgli che su QUELL BOTTONE doveva mettere QUEL NUMERO.... ESISTE UN METODO CHE PUO' FARE CIO'???
Scusate se ho detto delle stupidagini, magari la soluzione è semplice, sn alle primissime armi e conosco pochi metodi (malgrado per questo problema abbia ricercato a lungo e provato diverse cose - senza risultato ovvio!).
Di seguito tutto il codice:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class SaltaCasella extends JPanel {
private Rectangle2D.Double rettangolo;
private JButton[][] b;
private int numBottoni[];
int i;
int j;
int p;
int mm;
private JButton gioca, reset;
private JTextField matrice, cronometro;
private int N = 0;
Timer timer;
private int secondi=0;
private int minuti=0;
Color c = new Color(255, 255, 255);
public SaltaCasella() {
final JPanel p = new JPanel();
this.setLayout(null);
this.setBackground(new Color(0, 0, 0));
JLabel titoloIstruzioni = new JLabel("Istruzioni:");
titoloIstruzioni.setBounds(new Rectangle(680, 30, 100, 20));
titoloIstruzioni.setForeground(c);
this.add(titoloIstruzioni);
JLabel istruzioni1 = new JLabel("Scopo del gioco e' riempire quanto piu' possibile la matrice con numeri");
JLabel istruzioni2 = new JLabel("progressivi da 1 a NxN, dove N è un numero arbitrario iniziale ");
JLabel istruzioni3 = new JLabel("a scelta del giocatore, che definisce la grandezza della matrice.");
JLabel istruzioni4 = new JLabel("A partire da una casella a scelta, ci si può muovere orizzontalmente,");
JLabel istruzioni5 = new JLabel("saltando però due caselle, o diagonalmente, saltandone una sola.");
JLabel istruzioni6 = new JLabel("Buon divertimento!");
istruzioni1.setBounds(new Rectangle(680, 60, 450, 20));
istruzioni2.setBounds(new Rectangle(680, 80, 450, 20));
istruzioni3.setBounds(new Rectangle(680, 100, 450, 20));
istruzioni4.setBounds(new Rectangle(680, 120, 450, 20));
istruzioni5.setBounds(new Rectangle(680, 140, 450, 20));
istruzioni6.setBounds(new Rectangle(680, 160, 450, 20));
istruzioni1.setForeground(c);
istruzioni2.setForeground(c);
istruzioni3.setForeground(c);
istruzioni4.setForeground(c);
istruzioni5.setForeground(c);
istruzioni6.setForeground(c);
this.add(istruzioni1);
this.add(istruzioni2);
this.add(istruzioni3);
this.add(istruzioni4);
this.add(istruzioni5);
this.add(istruzioni6);
JLabel dimensione = new JLabel("Dimensione matrice: (numero compreso tra 5 e 10 inclusi)");
dimensione.setBounds(new Rectangle(680, 220, 600, 20));
dimensione.setForeground(c);
this.add(dimensione);
matrice = new JTextField();
matrice.setBounds(new Rectangle(820, 220, 20, 20));
matrice.setEditable(true);
this.add(matrice);
//JButton Gioca
gioca = new JButton("Gioca");
gioca.setBounds(new Rectangle(680, 250, 100, 20));
gioca.addActionListener(new ListenerGioca());
this.add(gioca);
//JButton Reset
reset = new JButton("Reset");
reset.setBounds(new Rectangle(820, 250, 100, 20));
reset.addActionListener(new ListenerReset());
reset.setEnabled(false);
this.add(reset);
//Cronometro di gioco da finire!!!
JLabel tempoGioco = new JLabel("Game Timer: ");
tempoGioco.setBounds(new Rectangle(680, 280, 200, 20));
tempoGioco.setForeground(c);
this.add(tempoGioco);
cronometro = new JTextField("00:00");
cronometro.setBounds(new Rectangle(820, 280, 80, 20));
cronometro.setEditable(false);
this.add(cronometro);
timer=new Timer(1000,new TimerGioco());
rettangolo = new Rectangle2D.Double();
}
public void rimuoviPulsantiera() {
for (int i = 0; i <= N - 1; i++)
for (int j = 0; j <= N - 1; j++) {
this.remove(b[i][j]);
}
}
public void disegnaPulsantiera() {
b = new JButton[N][N];
for (int i = 0; i <= N - 1; i++)
for (int j = 0; j <= N - 1; j++) {
b[i][j]= new JButton();
this.add(b[i][j]);
}
for (int i = 0; i <= N - 1; i++)
for (int j = 0; j <= N - 1; j++)
b[i][j].setBounds(new Rectangle((i * 50) + 60, (j * 50) + 60, 50, 50));
for (int i = 0; i <= N - 1; i++)
for (int j = 0; j <= N - 1; j++)
b[i][j].setText("_");
for (int i = 0; i <= N - 1; i++)
for (int j = 0; j <= N - 1; j++)
b[i][j].addActionListener(new ListenerPulsantiera());
repaint();
}
public void numeriProgressivi() {
numBottoni=new int [100];
for(int p=0; p<100; p++)
numBottoni[p] = p+1;
mm=numBottoni[p];
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);
rettangolo.setFrame(650, 10, 480, 550);
g2.draw(rettangolo);
}
/*Listener 1. del pulsante gioca che mi deve leggere il JTaxtField, dunque disegnare la matrice giusta
e attivare il timer in un JLabel ineditable nn ancora creato
2. listener sul ToogleButton che mi dà le caselle che posso cliccare e mi setta un testo con setText e un incremento(for) */
private class ListenerGioca implements ActionListener {
private String valoreString;
private int valoreInt;
public void actionPerformed(ActionEvent e) {
valoreString = matrice.getText();
try {
valoreInt = Integer.parseInt(valoreString);
}
catch (NumberFormatException exception) {
JOptionPane.showMessageDialog(null, "Ah ah ah!!! Ti serve qualche ripetizione di matematica!!!", "ATTENZIONE!!!", JOptionPane.WARNING_MESSAGE);
matrice.setText("");
matrice.setEditable(true);
valoreInt=0;
}
N = valoreInt;
disegnaPulsantiera();
gioca.setEnabled(false);
reset.setEnabled(true);
timer.start();
repaint();
}
}
private class ListenerPulsantiera implements ActionListener {
public void actionPerformed(ActionEvent e) {
//E' QUI IL PROBLEMA!!!!!!
numeriProgressivi();
b[i][j].setText("" + mm);
System.out.println(mm);
p++;
}
}
private class ListenerReset implements ActionListener {
public void actionPerformed(ActionEvent e) {
gioca.setEnabled(true);
reset.setEnabled(false);
rimuoviPulsantiera();
N = 0;
matrice.setText("");
repaint();
timer.stop();
secondi=0;
minuti=0;
cronometro.setText("00:00");
}
}
private class TimerGioco implements ActionListener {
public void actionPerformed(ActionEvent e) {
secondi++;
if (secondi>60) {
minuti++;
secondi=0;
}
cronometro.setText(minuti+":"+secondi);
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setContentPane(new SaltaCasella());
f.setTitle("Salta Casella");
f.setSize(1150, 630);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}