Witajcie, ja z problemem dziś przychodzę. Wiem, że na wątkach implementacja była by całkiem inna- ale zależy mi jakoś na pomyśle, jak poradzić sobie w przypadku mojego kodu.(zanim bedą hejty, tak- no jest to może raz nieczytelny kod, dwa no niestety można by tutaj całkiem lepszą implementacje zastosować- jednak, tak zrobilem ja na miare możliwości i na razie chciałbym się tego trzymać - ale oczywiście po to pytam, żebyście doradzili jak rozwiązać mój problem. )
Otóż: chciałbym generować ścieżke w labiryncie po kliknieciu na przycisk. Krok po kroku. Jednak na moim kodzie po kliknieciu, ścieżka pojawia się automatycznie cała i tutaj nie mam pomysłu jak to zmienić. Metoda
repaint();
zrobi update ale całości, natomiast zaimplementowana wewnatrz funkcji void paint(Graphic g), nic nie robi.
Zamieszcze kod, dokładny: dało by się to zrobić generalnie klikajac za każdym razem przycisk ale też wtedy nie wiem, jak malować poszczególne elementy.Bo pathMaze to tablica w której jeśli element [i][j] jest true wtedy zmienia kolor w danym miejscu
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 { MazeClass mazeGen= new MazeClass(); public int gWidth=mazeGen.width=20, gHeight=mazeGen.height=20 ; public int solveX=1, solveY=1; public boolean clicked= false; public int arr[][] = mazeGen.generateMaze(); public boolean pathMaze[][]= new boolean[gHeight][gWidth]; public boolean visited[][]=new boolean[gHeight][gWidth]; public static JButton bt1= new JButton("new"); public static void main(String[] arg ){ JFrame frame= new JFrame("Frame"); JPanel panel= new JPanel(); panel.add(new RunGui()); panel.add(bt1); frame.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); System.out.println(); } public RunGui(){ setPreferredSize(new Dimension(600, 600)); solvingProblem(); bt1.addActionListener(this); } public void testPrint(){ for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[0].length; j++) { System.out.printf("%s ", arr[i][j]); } System.out.println(); } } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { clicked=true; repaint(); } } @Override 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.BLACK; } g.setColor(newColor); g.fillRect(30*j,30*i,30,30); g.setColor(Color.black); g.drawRect(30*j,30*i,30,30); } } if(clicked) { clicked=false; System.out.print("Bylem?"); for(int i = 0; i <=18; i++){ for(int j = 0; j <=17; j++){ if(pathMaze[i][j]){ g.setColor(Color.blue); g.fillRect(30*i,30*j,29,29); g.drawRect(30*i,30*j,29,29); } } } g.setColor(Color.RED); g.fillRect(30*solveX,30*solveY,30,30); g.drawRect(30*solveX,30*solveY,15,15); g.setColor(Color.GREEN); g.fillRect(30*17,30*18,30,30); g.drawRect(30*17,30*18,5,5); } } public void solvingProblem() { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[0].length; j++) { pathMaze[i][j] = false; visited[i][j] = false; } } boolean b=solveMazeInput(solveX,solveY); for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[0].length; j++) { System.out.printf("%s ",pathMaze[i][j]); } System.out.println(); } } public boolean solveMazeInput(int x, int y ){ if( x == 18 && y == 18) { return true; } if(arr[x][y]==1 || visited[x][y] ){ return false; } visited[x][y]=true; if(x!= 0){ if(solveMazeInput(x-1,y) ) { pathMaze[x][y]= true; return true; } } if(x != gWidth - 1){ if(solveMazeInput(x+1,y)){ pathMaze[x][y]=true; return true; } } if(y !=0 ){ if(solveMazeInput(x,y-1)){ pathMaze[x][y]=true; return true; } } if(y != gHeight-1 ) { if (solveMazeInput(x, y + 1)) { pathMaze[x][y] = true; return true; } } return false; } }
Pozdrawiam, dzieki za wskazówki