Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Quasi alla fine ma...

  1. #1

    Quasi alla fine ma...

    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

  2. #2

    gioco

    Gioco finito in una settimana!! funziona anche se il mescola da degli errorini ma mescola lo stesso i tasti

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.