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; } }