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

Java, malowanie drogi w labiryncie

$
0
0

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


Viewing all articles
Browse latest Browse all 21942