Ciao a tutti ho visto che ultimamente sono tanti le persone che hanno la necessità di creare il gioco del 15, ce ne sono tanti.. Io ho creato il gioco, il problema è che quello che ho creato è solo 4*4, ma devo crearlo anche 3*3 e 5*5!
Il codice del gioco è questo:
import java.awt.geom.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Quindici extends Frame implements ActionListener { // definizione della classe
private static Frame f;
private Frame vittoria;
private int inizio[];
private int mosse;
private Panel panel;
private boolean vittPann=false;
private Button pedina[];
private Panel schema;
private boolean start=false;
private int vuoto;
private int flag=0;
MenuBar menuBar = new MenuBar();
Menu submenu=new Menu();
MenuItem nuovaPartita, chiudiPartita;
MenuItem istruzioniPartita, livelloPartita,easy,medium,hard;
private Button b;
public Quindici() { // costruisce il frame e inizializza le righe della griglia
JFrame.setDefaultLookAndFeelDecorated(true);
setBackground(Color.yellow); // imposta il colore dello sfondo
setTitle("Gioco del 15");
setSize(500, 500);
setVisible(true);
setMenuBar(menuBar);
menuBar.add(creaGiocoMenu());// richiama il metodo creaGiocoMenu() per i menù a tendina
pedina = new Button[flag*flag]; // crea una matrice di buttoni
schema=new Panel();
mosse=0;
validate();
}
public void Livello(int flag){
for (int i=0; i<(flag*flag-1); i++){ // i bottoni della scacchiera vengono numerati in modo da ottenere la scacchiera
for (int j=0; j<flag*flag; j++){ // a gioco risolto, i numeri 9,16,25 corrispondono alla casella bianca
int c=i+1;
if (c!=(flag*flag)){ // se il valore è diverso da 16
b=new Button(""+c); // si crea un bottone con il valore come label
b.setBackground(Color.yellow);
}
else {
b=new Button(" "); // altrimenti rappresenterà la tessera vuota
vuoto=i;
b.setBackground (Color.white);
}
schema.add(b); // si inserisce il bottone nel pannello
b.addActionListener(this);
pedina[i]=b;
schema.setLayout(new GridLayout(flag,flag)); // crea una griglia in cui verranno inseriti i bottoni
add(schema);
validate();
}
}
}
public void actionPerformed(ActionEvent e) {// PRE: Si deve verificare un'evento
// POST: Esegue l'azione corrispondente all'evento verificatosi
String action=e.getActionCommand();
if (e.getSource()==chiudiPartita)
{
setVisible(false);
dispose();
System.exit (0);
}
else if (e.getSource()==nuovaPartita)
{
start=true;
if (vittPann) vittoria.setVisible (false);
mescola();
panel.setVisible(true);
validate();
}
else if(e.getSource()==istruzioniPartita){
JOptionPane.showMessageDialog(null,"istruzioni: \n\nCliccando sul numero da "
+ "volendo spostare, si ottiene, se possibile, lo scambio con la casella vuota. "
+"\nLo scopo del gioco è quello di riordinare i numeri da 1 a 9,se livello è easy, da 1 a 15,"
+ "se il livello è medio,da 1 a 25 se il è difficile\n\n "
+ " BUON DIVERTIMENTO \n",
" Gioco del quindici", JOptionPane.INFORMATION_MESSAGE); }
else if(action.equals("easy")){
flag=3;
Livello(flag);
}
else if(action.equals("medium")){
flag=4;
Livello(flag);
}
else if(action.equals("hard")){
flag=5;
Livello(flag);
}
else if (e.getSource()!=chiudiPartita && e.getSource()!=nuovaPartita) {
int i=0;
while (e.getSource()!=pedina[i]){ // ciclo per detrminare la i
i++;
}
if (adiacenti(i)) { // se il pulsante è adiacente al vuoto
scambia(i);
++mosse;
checkVittoria();
}
}
else {
for (int i=0; i<flag;i++){
for (int j=0; j<flag;j++){
if (e.getSource()==pedina[i*j]){
checkVittoria();
}
}
}
}
}
public void scambia(int a) { // MODIFICA: Label bottoni
// POST: Scambia la label del bottone vuoto con quella del bottone azionato
if (start)
{
String label=pedina[a].getLabel();
pedina[vuoto].setLabel(label);
pedina[a].setBackground(Color.white);
pedina[vuoto].setBackground(Color.yellow);
vuoto=a;
pedina[a].setLabel(" ");
validate();
}
}
public void checkVittoria() { // deve essere stato effettuato uno scambio controlla lo stato di vittoria ed eventualmente conclude il gioco stampando
// un messaggio, altrimenti resta in attesa di un nuovo evento
if (start)
{
int y;
for (int i=0; i<flag;i++)
{ // Il ciclo viene effettuato sulla lunghezza dell'array-1
// perchè se il gioco è stato risolto correttamente, l'ultima posizione sarà vuota
String str = pedina[i].getLabel(); // viene presa la label del bottone che si trova nella posizione i
// dell'array
if (str.equals(" "))
{ // se è vuota, il gioco non è ancora stato risolto correttamente e esce dal metodo
return;
}
else
{ // altrimenti viene confrontata con il valore di i+1
Integer x = new Integer(str);
y = x.intValue();
if (y!=(i + 1)) return; // se differente esce dal metodo
}
}
vittoria=new PannelloVittoria();
vittoria.setVisible(true);
vittPann=true;
vittoria.setTitle("VITTORIA!!! Hai vinto in "+mosse+" mosse!!!");
vittoria.setSize(330,150);
validate();
start=false;
mosse=0;
}
}
public boolean adiacenti(int pos) { // PRE: Deve essere stato azionato un pulsante
// POST: Se il pulsante cliccato è adiacente alla cella vuota
// restituisce true
boolean right=true; boolean left=true; boolean up=true; boolean down=true;
if ((pos%flag)==0) left=false;
if ((pos%flag)==(flag-1)) right=false;
if (pos<flag) up=false;
if (pos>=flag*flag-flag) down=false;
if (left && (pos-1==vuoto)) return true;
else if (right && (pos+1==vuoto)) return true;
else if (up && (pos-flag==vuoto)) return true;
else if (down && (pos+flag==vuoto)) return true;
else return false;
}
public void mescola() { // POST: mescola le pedine selezionando a caso una casella; se questa è adiacente alla casella vuota,
// chiama la procedura scambia e ripete il procedimento più volte
for (int i=1; i<=300; i++)
{
int x=(int)(Math.random()*flag);
if (adiacenti(x)) scambia(x);
}
}
public static void main(String args[]) { // Main con classe anonima di chiusura
f = new Quindici();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public Menu creaGiocoMenu() { // POST: crea il menu a tendina
Menu gioco = new Menu("File");
nuovaPartita = new MenuItem("Nuova Partita");
nuovaPartita.addActionListener(this);
gioco.add(nuovaPartita);
istruzioniPartita=new MenuItem("Istruzioni");
istruzioniPartita.addActionListener(this);
gioco.add(istruzioniPartita);
submenu = new Menu("livello");
easy = new MenuItem("easy");
easy.addActionListener(this);
submenu.add(easy);
medium = new MenuItem("medium");
medium.addActionListener(this);
submenu.add(medium);
hard = new MenuItem("hard");
hard.addActionListener(this);
submenu.add(hard);
gioco.add(submenu);
chiudiPartita = new MenuItem("Esci");
chiudiPartita.addActionListener(this);
gioco.add(chiudiPartita);
menuBar.add(gioco);
return gioco;
}
public class PannelloVittoria extends Frame //Classe interna; crea un Frame al momento della vittoria
{
public PannelloVittoria() { // costruttore in cui si decidono i colori sullo sfondo e sul fronte della finestra
setBackground(Color.white);
setForeground(Color.blue);
}
public void paint(Graphics g) // metodo paint chiamato da setVisible: disegna il PannelloVittoria
{
Font f=new Font("Courier", Font.BOLD, 15);
g.setFont(f);
g.drawString("Complimenti, hai vinto!!!", 25, 52);
g.drawString("Per chiudere questa finestra", 25, 72);
g.drawString("e giocare di nuovo", 25, 92);
g.drawString("seleziona Nuova Partita", 25, 112);
g.drawString("dal menù Partita", 25, 132);
}
}
}
Come potrete vedere una volta scelto il livello nel menu, ci sono degli errori:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at Quindici.Livello(Quindici.java:78)
at Quindici.actionPerformed(Quindici.java:114)
at java.awt.MenuItem.processActionEvent(MenuItem.java :627)
at java.awt.MenuItem.processEvent(MenuItem.java:586)
at java.awt.MenuComponent.dispatchEventImpl(MenuCompo nent.java:300)
at java.awt.MenuComponent.dispatchEvent(MenuComponent .java:288)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 602)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
Perchè?? come si risolvono????
Se potete aiutatemi