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