Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

Java droga w labiryncie

$
0
0

Witam. Męczę się kolejne dni ... jak zaimplementować w moim przypadku - tutaj "maze solver" chodzi mi o to, że u mnie program rozwizuję poprawnie- tzn. rysuje ścieżkę i w momencie kliknięcia na przycisk " metoda repaint" nakłada na wygenerowany labirynt sciezke.

Jednak chciałem zaimplementować to tak, aby rysowanie trwało w czasie tzn " krok po kroku" a nie na raz... i nie mam pomysłu, metoda repaint wewnatrz paint, nie działa jeśli dam ją w iteracji. Natomiast działą tylko dla przypadku gdy dam ja w Action listener, ale wtedy generowana jest cała ścieżka.

Wiem, że kod jest- jakościowo słaby, ale to moje 1-wsze projekty, uczę się i rozwijam się. Jeśli ktoś byłby wstanie spojrzeć na kod, ew. coś tutaj wskórać z moim problemem- będę wdzieczny.

tutaj jest sama klasa generujaca przypadkową "tablice 0/1 - reprezentujaca labirynt" 

import java.util.Random;



public class RenderMaze {
    private static int[][] blocks;
    private static boolean[][] visited;
    private static Random rand = new Random();

    public  int[][] generate(int w, int h) {
        int bw = w * 2 + 1;
        int bh = h * 2 + 1;
        blocks = new int[bw][bh];
        visited = new boolean[w + 2][h + 2];
        for(int i = 0; i < blocks.length; i++) for(int j = 0; j < blocks[0].length; j++)
            blocks[i][j] = 1;
        for(int i = 0; i < visited.length; i++) for(int j = 0; j < visited[0].length; j++)
            if(i == 0 || i == visited.length - 1 || j == 0 || j == visited[0].length - 1)
                visited[i][j] = true;

        gen(0, 0);
        //ustawiamy pozycje startowa
        blocks[1][1]=9;
        //pozycja koncowa
        blocks[bw-2][bh-2]=8;
        return blocks;
    }

    private static void gen(int xPos, int yPos) {
        int x = xPos * 2 + 1;
        int y = yPos * 2 + 1;
        blocks[x][y] = 0;
        visited[xPos + 1][yPos + 1] = true;
        while(!visited[xPos][yPos + 1] || !visited[xPos + 2][yPos + 1] || !visited[xPos + 1][yPos + 2] || !visited[xPos + 1][yPos]) {
            float num = rand.nextFloat();
            if(num < 0.25F && !visited[xPos][yPos + 1]) {
                blocks[x - 1][y] = 0;
                gen(xPos - 1, yPos);
            }
            else if(num < 0.5F && num >= 0.25F && !visited[xPos + 2][yPos + 1]) {
                blocks[x + 1][y] = 0;
                gen(xPos + 1, yPos);
            }
            else if(num >= 0.5F && num < 0.75F && !visited[xPos + 1][yPos + 2]) {
                blocks[x][y + 1] = 0;
                gen(xPos, yPos + 1);
            }
            else if(!visited[xPos + 1][yPos]) {
                blocks[x][y - 1] = 0;
                gen(xPos, yPos - 1);
            }
        }
    }
}

tutaj jest cały kontent zarówno rozwiazywania jak i rysowania

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionListener;


/**
 * Created by Czowitek on 2017-05-22.
 */
public class RunGui extends JPanel implements ActionListener {

    RenderMaze mazeGen= new  RenderMaze();
    public int WIDTH=10, HEIGHT=10;


    public int wSet= WIDTH*2+1, hSet=HEIGHT*2+1;

    public int arr[][] =  mazeGen.generate(WIDTH,HEIGHT);
    public int solveArr[][]= arr;

    public int  pathMaze[][]= new int[WIDTH*2+1][HEIGHT*2+1];
    public boolean visited[][]=new boolean[WIDTH*2+1][HEIGHT*2+1];
    public static JButton bt1= new JButton("new");


    public static void main(String[] arg ){
        RunGui start= new RunGui();
        JFrame frame= new JFrame("Frame");
        JPanel panel= new JPanel();
        panel.add(start);
        panel.add(bt1);
        frame.add(panel);
        start.setPreferredSize(new Dimension(650, 650));
        start. bt1.addActionListener(start);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == bt1) {
            this.solvingProblem();
            }
    }
    public void paint(Graphics g) {
             super.paint(g);
             g.translate(50, 50);

              for (int i = 0; i < arr.length; i++) {
                  for (int j = 0; j < arr[0].length; j++) {
                      Color newColor;
                      switch (arr[i][j]) {
                          case 1:
                              newColor = Color.BLACK;
                              break;
                          case 0:
                              newColor = Color.WHITE;
                              break;
                          case 9:
                              newColor = Color.GREEN;
                              break;
                          case 8:
                              newColor = Color.RED;
                              break;
                          default:
                              newColor = Color.YELLOW;
                      }
                      g.setColor(newColor);
                      g.fillRect(25 * j, 25 * i, 25, 25);
                      g.setColor(Color.black);
                      g.drawRect(25 * j, 25 * i, 25, 25);
                  }
              }
            for (int i = 0; i < wSet; i++) {
                for (int j = 0; j < hSet; j++) {
                    if ( pathMaze[i][j] == 5 && arr[i][j]== 0) {
                        g.setColor(Color.blue);
                        g.fillRect(25 * j+5, 25 * i+5, 15, 15);
                        g.drawRect(25 * j+5, 25 * i+5, 15, 15);
                        repaint();
                    }
                }
            }
    }

    public void solvingProblem() {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                pathMaze[i][j] = 1;
                visited[i][j] = false;
            }
        }
        solveMazeInput(1,1);
    }

        public boolean solveMazeInput(int x, int y ){
            if( x ==  wSet-2 && y ==  hSet-2) {
                return true;
            }
            if(solveArr[x][y]== 1 || visited[x][y] ){
                return false;
            }
            visited[x][y]=true;

            if(x!= 0){
                if(solveMazeInput(x-1,y) ) {
                    pathMaze[x][y]= 5;
                    return true;
                }
            }
            if(x != wSet- 1){
                if(solveMazeInput(x+1,y)){
                    pathMaze[x][y]=5;
                    return  true;
                }
            }
            if(y !=0 ){
                if(solveMazeInput(x,y-1)){
                    pathMaze[x][y]=5;
                    return  true;
                }
            }
            if(y != hSet-1 ) {
                if (solveMazeInput(x, y + 1)) {
                    pathMaze[x][y] =5;
                    return true;
                }
            }
            return false;
        }
}

 


Viewing all articles
Browse latest Browse all 21942

Trending Articles


Sprawdź z którą postacią z anime dzielisz urodziny


MDM - Muzyka Dla Miasta (2009)


Częstotliwość 3.722MHz


POSZUKIWANY TOMASZ SKOWRON-ANGLIA


Ciasto 3 Bit


Kasowanie inspekcji Hyundai ix35


Steel Division 2 SPOLSZCZENIE


SZCZOTKOWANIE TWARZY NA SUCHO


Potrzebuje schemat budowy silnika YX140


Musierowicz Małgorzata - Kwiat kalafiora [audiobook PL]