ciao!
Ho un problema con un gioco java che ho trovato su internet: quando lo compilo mi da errore nel main anche se il main c'è già,il mio dubbio è che essendo due i file non riescano a interagire!
vi copio di seguito i codici, vi sarei molto grata se riusciste ad aiutarmi!
import javax.swing.*;
import java.awt.*;
public class Forza4 {
//creo la finestra dell'applicazione
public static JFrame frame = new JFrame("Forza 4");
public static Tavoliere griglia = new Tavoliere();
public static void main(String[] args) {
/* faccio in modo che la finestra sia creata sempre *
* al centro dello schermo qualunque sia la risoluzione. *
* Per fare questo uso l'oggetto di tipo toolkit che *
* raccoglie tutte le informazioni grafiche sull'ambiente *
* di lavoro (applicando getToolkit). *
*/
Toolkit infoGrafiche = frame.getToolkit();
/* utilizzo un oggetto di tipo Dimension apposito per *
* memorizzare la larghezza e l'altezza dell'ambiente di *
* lavoro *
*/
Dimension risoluzione = infoGrafiche.getScreenSize();
/* setBounds posiziona la finestra nello schermo: i primi *
* due indicano il punto dell'angolo in alto a sinistra, *
* i seguenti la larghezza e l'altezza *
*/
frame.setBounds(risoluzione.width/4, risoluzione.height/5,
0, 0);
/* aggiungo i componenti a un contenitore grafico costruito *
* tramite le direttive JPanel *
*/
JPanel sudPanel = new JPanel();
sudPanel.add(Tavoliere.iconaLabel);
sudPanel.add(Tavoliere.bSalva);
sudPanel.add(Tavoliere.bCarica);
sudPanel.setBackground(Color.BLUE);
frame.getContentPane().add(griglia ,BorderLayout.NORTH);
frame.getContentPane().add(sudPanel,BorderLayout.S OUTH);
frame.setResizable(false); //impedisco il ridimensionamento
frame.setVisible(true); //visualizza la finestra
frame.pack();
}
}
seconda parte
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.util.StringTokenizer;
import java.net.URL;
/
| |
| TAVOLIERE |
| |
| ************************************************** *** |
| * Contiene i metodi sottostanti al funzionamento * |
| * dell'intera partita e delle singole fasi di * |
| * verifica delle conseguenze alle mosse di ogni * |
| * giocatore * |
| ************************************************** *** |
| |
*------*/
public class Tavoliere extends JPanel {
/* Definisco i bottoni della finestra grafica *
* per le azioni di supporto alla partita *
*/
public static JButton bSalva = new JButton("Salva");
public static JLabel iconaLabel = new JLabel();
public static JButton bCarica = new JButton("Carica");
/* Stabilisco le dimensioni delle caratteristiche *
* di un tabellone per il gioco Forza 4 *
*/
private final int DIAMETRO = 47;
private final int SPAZIO = 13;
private final int RIGHE = 6;
private final int COLONNE = 7;
/* Definisco le icone utilizzate nel gioco: con URL possiamo *
* riferici alle icone salvandole nell'archivio jar *
*/
URL url1 = getClass().getResource("/coingialla.png");
URL url2 = getClass().getResource("/coinrossa.png");
private ImageIcon rossa = new ImageIcon(url2);
private ImageIcon gialla = new ImageIcon(url1);
/* Variabili per la gestione della partita: controllo *
* del turno, del salvataggio, dello stato del tavoliere *
*/
private int flag = 0;
private int n = 0;
private Color colorTurno;
private Color[][] arrGiocate;
private static String stringaBuffer ;
private static String modificato = "no";
/*========================================*
* Costruttore *
* - *
* Si occupa di creare il pannello come *
* oggetto gestibile dal programma *
*=========================================*/
public Tavoliere(){
inizioPartita();
this.addMouseListener(new MouseAdapter() {
/* Classe anonima interna per gestire ascoltatore specializzato*
* del Tavoliere
*/
public void mousePressed(MouseEvent e) {
gioca(e.getPoint());
}
});//fine classe anonima Tavoliere
/* Gestisce la creazione di una sottofinestra con *
* messaggio ed elementi relativi al salvataggio *
* della partita avvenuto
*/
bSalva.addMouseListener(new MouseAdapter() {
/* Classe anonima interna per gestire ascoltatore specializzato*
* del pulsante 'Salva'
*/
public void mousePressed(MouseEvent evento) {
try{
salva();
JOptionPane.showMessageDialog(null,"Partita salvata.",
"Forza 4",
JOptionPane.INFORMATION_MESSAGE);
}
catch(IOException e) {}
}
});//fine classe anonima Salva
/* Gestisce la creazione di una sottofinestra con *
* messaggio ed elementi relativi all'effettuato *
* caricamento della partita
*/
bCarica.addMouseListener(new MouseAdapter() {
/* Classe anonima interna per gestire ascoltatore specializzato*
* del pulsante 'Carica'
*/
public void mousePressed(MouseEvent evento) {
try{
carica();
JOptionPane.showMessageDialog(null,"Partita caricata.",
"Forza 4",
JOptionPane.INFORMATION_MESSAGE);
}
catch(IOException e) {}
}
});//fine classe anonima Carica
/* Gestisce la creazione di una sottofinestra con *
* messaggio ed elementi relativi alla richiesta *
* di salvataggio della partita
*/
WindowListener frameListener = new WindowAdapter(){
/* Classe anonima interna per gestire ascoltatore specializzato*
* del frame 'Forza4'
*/
public void windowClosing(WindowEvent evento){
if (modificato == "si"){
int id = JOptionPane.showConfirmDialog(null,
"Vuoi salvare la partita in corso?",
"Exit", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (id == 0){
try{
salva();
}
catch(IOException e) {}
}
}
System.exit(0); //esce dal programma
}
};//fine classe anonima frame 'Forza4'
Forza4.frame.addWindowListener(frameListener);
}
/**
* Metodo che imposta le singole variabili ai *
* valori per l'inizio della partita *
**/
private void inizioPartita(){
arrGiocate = new Color[COLONNE][RIGHE];
stringaBuffer = "";
modificato = "no";
colorTurno = Color.YELLOW;
iconaLabel.setIcon(gialla);
repaint();
}
/
* Metodo che disegna il tabellone per la *
* partita di Forza 4 *
*/
public void paint(Graphics g){
//disegno il rettangolo blu
g.setColor(Color.BLUE);
g.fillRect(0, 0, getSize().width, getSize().height);
n = 0;//il tabellone ha tutti cerchi bianchi
/* Dalla prima posizione in basso a sinistra il Tavoliere
* viene ridisegnato in corrispondeza delle giocate
* contenute nell'array
*/
for (int col = 0; col < COLONNE; col++) {
for (int row= 0; row < RIGHE; row++) {
if (arrGiocate[col][row] == null){
g.setColor(Color.WHITE);
} else {
g.setColor(arrGiocate[col][row]);
++n ;//conta le giocate
}
g.fillOval(SPAZIO + ((SPAZIO + DIAMETRO) * col), SPAZIO
+ ((SPAZIO + DIAMETRO) * row), DIAMETRO, DIAMETRO);
}
}
}
/*
* Metodo che controlla dove un gettone viene *
* inserito *
*/
private void gioca(Point point){
/* Si ricava la colonna e la riga dal punto sul quale si preme
*/
int row = point.y / (DIAMETRO + SPAZIO);
int col = point.x / (DIAMETRO + SPAZIO);
// Se la posizione è libera...
if (arrGiocate[col][row] == null) {
//...la occupo
salvaSuStringaBuffer(col);
for (row = RIGHE - 1; row >= 0; row--) {
/* Se non ci fosse la condizione successiva giocheremmo
* sempre e solo sulla prima riga
*/
if (arrGiocate[col][row] == null) {
arrGiocate[col][row] = colorTurno;
repaint();
modificato = "si";//un click ha modificato la partita
controllaTutto(col, row);
/* La condizione successiva serve a dare il turno
* al giocatore avversario. Se non ci fosse, il metodo
* 'Gioca' non saprebbe riconoscere l'alternanza del
* turno tra più partite consecutive
*/
if (flag == 0){
colorTurno = (colorTurno == Color.RED ?
Color.YELLOW : Color.RED);
iconaLabel.setIcon(((colorTurno == Color.RED ?
rossa : gialla)));
}
flag = 0;
return;
}
}
}
}
/*
* Metodo che verifica lo stato attuale *
* della partita *
*/
private void controllaTutto(int col, int row){
if (controllaVerticale(col) || controllaOrizzontale(row)
|| controllaDiagonaleSinistra(col, row)
|| controllaDiagonaleDestra(col, row)){
JOptionPane.showMessageDialog(this,
(colorTurno == Color.RED ? "Il Rosso" : "Il Giallo")
+" ha vinto!","Game Over", JOptionPane.INFORMATION_MESSAGE);
flag = 1;
inizioPartita();
} else if (n == 41) {
JOptionPane.showMessageDialog(this,"Pari e patta!",
"Game Over", JOptionPane.INFORMATION_MESSAGE);
flag = 1;
inizioPartita();
}
}
/
* Metodo di controllo della combinazione *
* su diagonale sinistra *
*/
private boolean controllaDiagonaleSinistra(int col, int row){
if (col >= row) {
col = col-row;
row = 0;
} else {
row = row-col;
col = 0;
}
for (int cnt = 0; row < RIGHE && col < COLONNE; row++, col++) {
if (arrGiocate[col][row] == colorTurno) {
if (++cnt >= 4)
return true;
} else {
cnt = 0;
}
}
return false;
}
/**
* Metodo di controllo della combinazione *
* su diagonale destra *
*/
private boolean controllaDiagonaleDestra(int col, int row){
col = Math.max(0, col - 4);
row = Math.min(RIGHE - 1, row + 4);
for (int cnt = 0; row >= 0 && col < COLONNE; row--, col++) {
if (arrGiocate[col][row] == colorTurno) {
if (++cnt >= 4)
return true;
} else {
cnt = 0;
}
}
return false;
}
/*
* Metodo di controllo della combinazione *
* su colonna *
*/
private boolean controllaVerticale(int col){
for (int cnt = 0, row= 0; row < RIGHE; row++) {
if (arrGiocate[col][row] == colorTurno) {
if (++cnt >= 4)
return true;
} else {
cnt = 0;
}
}
return false;
}
/*
* Metodo di controllo della combinazione *
* su riga *
*/
private boolean controllaOrizzontale(int row){
for (int cnt = 0, col= 0; col < COLONNE; col++) {
if (arrGiocate[col][row] == colorTurno) {
if (++cnt >= 4)
return true;
} else {
cnt = 0;
}
}
return false;
}
/*==============================================*
* Metodo di aggiornamento del buffer con *
* la configurazione del tabellone *
*==============================================*/
private void salvaSuStringaBuffer(int col){
switch(col){
case 0:
stringaBuffer=stringaBuffer + "a ";
break;
case 1:
stringaBuffer=stringaBuffer + "b ";
break;
case 2:
stringaBuffer=stringaBuffer + "c ";
break;
case 3:
stringaBuffer=stringaBuffer + "d ";
break;
case 4:
stringaBuffer=stringaBuffer + "e ";
break;
case 5:
stringaBuffer=stringaBuffer + "f ";
break;
case 6:
stringaBuffer=stringaBuffer + "g ";
break;
default:
break;
}
}
/*================================================*
* Metodo che restituisce la dimensione preferita *
* per il contenitore è un override ed è basilare *
*================================================*/
public Dimension getPreferredSize() {
return new Dimension((DIAMETRO + SPAZIO) * COLONNE,
(DIAMETRO + SPAZIO) * RIGHE);
}
/*==============================================*
* Metodo di caricamento del buffer con la *
* configurazione della partita salvata *
*==============================================*/
private void carica()throws IOException{
// incapsula in BufferedReader un file aperto in lettura
BufferedReader filein = new BufferedReader(new FileReader
("SalvataggioForza4.sav"));
Point puntodi = new Point(0,35);
inizioPartita();
String nextStr = filein.readLine();// legge una riga del file
while(nextStr != null){
char x = nextStr.charAt(0);
switch (x) {
case 'a':
puntodi.x = 35;
gioca(puntodi);
break;
case 'b':
puntodi.x = 95;
gioca(puntodi);
break;
case 'c':
puntodi.x = 155;
gioca(puntodi);
break;
case 'd':
puntodi.x = 215;
gioca(puntodi);
break;
case 'e':
puntodi.x = 275;
gioca(puntodi);
break;
case 'f':
puntodi.x = 335;
gioca(puntodi);
break;
case 'g':
puntodi.x = 395;
gioca(puntodi);
break;
}
nextStr = filein.readLine();
}
modificato = "no";
filein.close(); // chiude il file
}
/*==============================================*
* Metodo di salvataggio della configurazione *
* del tabellone al momento di gioco attuale *
*==============================================*/
private void salva()throws IOException{
// creo un oggetto FileWriter...
FileWriter fileOut = new FileWriter("SalvataggioForza4.sav");
// ... che incapsulo in un BufferedWriter...
BufferedWriter fileBuf = new BufferedWriter(fileOut);
// ... che incapsulo in un PrintWriter
PrintWriter printOut = new PrintWriter(fileBuf);
StringTokenizer st = new StringTokenizer(stringaBuffer, " ");
int m = st.countTokens();
for (int i = 0; i < m ; i++){
printOut.println(st.nextToken());
}
printOut.close();
modificato = "no";
}
}
Grazie in anticipo!
ro!