Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema creazione labirinto

    Ciao ragazzi, ho un po di problemini nella creazione di un labirinto random.
    Tralasciando la logica da usare che ovviamente non ancora completo, il disegno che viene fuori non combacia con la matrice che ottengo. Inoltre talvolta viene lanciata un eccezione, divisione per 0 e non capisco perché. Incollo il codice così magari lo provate
    E' la prima volta che uso i metodi di Graphics e mi stanno facendo uscire di testa xD

    codice:
    package jmaze;
    
    /**
     * @author Stefano Loris
     */
    public class Start {
        
        public static void main(String[]args) {      
            JFrameMaze maze = new JFrameMaze();
        }
    }
    codice:
    package jmaze;
    
    import java.util.Random;
    
    /**
     * @author Stefano Loris
     */
    public class JMaze {
    
        public int[][] createsMatrix() {
    
            //La matrice avrà dimensione random compresa tra 0 e 50.
        	int rc;
        	do {
        		rc = (int) (Math.random()*20); 
        	}while((rc % 2) != 0);
            
            //Inizializzo la matrice
            int[][] matrix = new int[rc][rc];
            
            //Creo la matrice
            Random random = new Random();
            
            for(int i=0; i<matrix.length; i++) {
                for(int j=0; j<matrix[0].length; j++) {
                    int n = 10;
                    int scelta = random.nextInt(n);
                    if(scelta >= 5) {
                        matrix[i][j] = 1;
                    }
                    else {
                        matrix[i][j] = 0;
                    }
                }
            }
            
            //Stampo la matrice per fare debug
            for(int i=0; i<matrix.length; i++) {
                for(int j=0; j<matrix[0].length; j++) {
                    System.out.print(matrix[i][j] + " ");
                }
                System.out.println("");
            }
            
            return matrix;
        }
    }
    codice:
    package jmaze;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /**
     *
     * @author Stefano Loris
     */
    
    public class JFrameMaze extends JFrame {
    
        private JMaze jmaze;
        private MyJPanel jpanel;
        private int[][] lab;
        
        public JFrameMaze() {
            
            super("JMaze");
            
            jmaze = new JMaze();
            jpanel = new MyJPanel();
            lab = jmaze.createsMatrix();
           
            this.setContentPane(jpanel);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            Dimension d = new Dimension(600,600);
            this.setSize(d);
            this.toFront();
            this.setLocationRelativeTo(null);
            this.setResizable(false);
            this.setVisible(true);
        }
        
        private class MyJPanel extends JPanel {
            
            @Override
            public void paintComponent(Graphics g) {
                
                super.paintComponent(g);
                
                Dimension r = getSize();
                int dim = (int)(r.width/lab.length+2); //Dimensione cella
                g.clearRect(0, 0, dim*(lab.length+2), dim*(lab.length+2));
                g.setPaintMode();
                g.setColor(Color.RED);
               
                //Coloro il labirinto
                
                for(int i=0; i<lab.length; i++) {
                    for(int j=0; j<lab[0].length; j++) {
                        if(lab[i][j] == 1) {
                            g.setColor(Color.RED);
                            g.fillRect(i*dim,j*dim,dim,dim);
                        }
                        else {
                            g.setColor(Color.WHITE);
                            g.fillRect(i*dim,j*dim,dim,dim);
                        }
                    }
                }
                
                //Disegno griglia
                g.setColor(Color.BLACK);
                for (int i = 0; i <= lab.length + 2; i++) {
                    
                    g.drawLine(i * dim, 0, i * dim, dim * (lab.length + 2));
                    
                    for (int j = 0; j <= lab[0].length + 2; j++) {
                        g.drawLine(0, j * dim, dim * (lab.length + 2), j * dim);
                    }    
                }  
            }
        }
    }
    Grazie, per qualsiasi aiuto/consiglio

    Ps: viene tagliato anche un pezzetto di labirinto sotto..

  2. #2
    Ti spiego un po l'errore:
    codice:
     public int[][] createsMatrix() {
    
            //La matrice avrà dimensione random compresa tra 0 e 50.
        	int rc;
        	do {
        		rc = (int) (Math.random()*20); 
        	}while((rc % 2) != 0);
            
            //Inizializzo la matrice
            int[][] matrix = new int[rc][rc];
            ....
            ....
            ....
    Nei commenti hai scritto che la matrice avrà dimensione tra 0 e 50.

    quindi se il valore rc=0

    codice:
     int[][] matrix = new int[0][0];
    effettivamente si può creare una matrice del genere(anche se a mio parere non ha alcun senso) però quando vai a fare:

    codice:
     int dim = (int)(r.width/lab.length+2)
    ovviamente prima andrà a fare la divisione e poi andrà ad aggiungere due.
    Quindi metti un r.width pari a 600 andrai a fare:

    600/0...?!?
    e quindi sballa tutto.

    Se vuoi avere una matrice 0 puoi fare così
    codice:
     int dim = (int)(r.width/(lab.length+2))
    aggiungi dellee parentesi in modo tale che lab.length non sia zero ma aggiunga il fattore di due.

    Cmq secondo me ti conviene escludere il valore zero perché ti porta una marea di effetti collaterali (e poi non ha senso un labirinto con lunghezza 0) facendo così:

    codice:
    	int rc;
        	do {
        		rc = (int) (Math.random()*20); 
        	}while((rc % 2) != 0 || rc==0);
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Grazie per la dritta, il commento ovviamente è sbagliato, ho cambiato i valori
    successivamente
    Comunque si verificano 2 problemi che sono evidenti se provi il programma
    1) La griglia che viene disegnata ha 2 righe e 2 colonne in più della matrice
    originaria.
    2) La griglia è trasposta rispetto alla matrice originaria O.o

  4. #4
    stasera proverò a dargli un occhiata.

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    prova così e vedi se ti funziona
    Cancella la classe MyPanel e ricopia questa di seguito

    adesso dovrebbe andare...
    scusa una domanda ma xche avevi messo +2 dappertutto?

    codice:
        
    
    private class MyJPanel extends JPanel {
            
            @Override
               public void paintComponent(Graphics g) {
                
                super.paintComponent(g);
                
                Dimension r = getSize();
                int dim = (int)(r.width/(lab.length)); //Dimensione cella
                g.clearRect(0, 0, dim*(lab.length), dim*(lab.length));
                g.setPaintMode();
                g.setColor(Color.RED);
               
                //Coloro il labirinto
                
                for(int i=0; i<lab.length; i++) {
                    for(int j=0; j<lab[0].length; j++) {
                        if(lab[i][j] == 1) {
                            g.setColor(Color.RED);
                            g.fillRect(j*dim,i*dim,dim,dim);
                        }
                        else {
                            g.setColor(Color.WHITE);
                            g.fillRect(j*dim,i*dim,dim,dim);
                        }
                    }
                }
                
                //Disegno griglia
                g.setColor(Color.BLACK);
                for (int i = 0; i < lab.length; i++) {
                    
                    g.drawLine(i * dim, 0, i * dim, dim * (lab.length ));
                    
                    for (int j = 0; j < (lab[0].length); j++) {
                        g.drawLine(0, j * dim, dim * (lab.length ), j * dim);
                    }    
                }  
            }
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Ok, però è rimasto il problema che viene disegnata trasposta. Pazienza, è un problema
    secondario, ora devo solo cercare di implementare l'algoritmo corretto per creare un vero
    labirinto..

  7. #7
    no guarda che a me non la disegnava trasposta bensì nel giusto ordine.
    Hai ricopiato nel tuo progetto il pezzo di codice che ti ho postato sopra?
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  8. #8
    Mi era sfuggita una cosa, grazie, risolto

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.