Heim > Java > javaLernprogramm > Hauptteil

So zeichnen und zeigen Sie Labyrinthanimationen in Java an

WBOY
Freigeben: 2023-04-28 20:10:05
nach vorne
961 Leute haben es durchsucht

一次性全部绘制出来

So zeichnen und zeigen Sie Labyrinthanimationen in Java an

实现代码

import java.awt.*;
 
public class AlgoVisualizer {
 
    private static int DELAY = 200;
    private static int blockSide = 8;
 
    private MazeData data;
    private AlgoFrame frame;
 
    public AlgoVisualizer(String mazeFile){
 
        // 初始化数据
        data = new MazeData(mazeFile);
        int sceneHeight = data.N() * blockSide;
        int sceneWidth = data.M() * blockSide;
        
 
        // 初始化视图
        EventQueue.invokeLater(() -> {
            frame = new AlgoFrame("Maze Solver Visualization", sceneWidth, sceneHeight);
 
            new Thread(() -> {
                run();
            }).start();
        });
    }
 
    public void run(){
 
        setData();
    }
 
    private void setData(){
    	
		frame.render(data);
        AlgoVisHelper.pause(DELAY);	 
    	
 
    }
 
    
    public static void main(String[] args) {
 
        String mazeFile = "maze_101_101.txt";
 
        AlgoVisualizer vis = new AlgoVisualizer(mazeFile);
 
    }
}
 
 
 
 
 
 
 
 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
 
 
public class MazeData {
 
    public static final char ROAD = ' ';
    public static final char WALL = '#';
 
    private int N, M;
    private char[][] maze;
    
 
    public MazeData(String filename){
 
        if(filename == null)
            throw new IllegalArgumentException("Filename can not be null!");
 
        Scanner scanner = null;
        try{
            File file = new File(filename);
            if(!file.exists())
                throw new IllegalArgumentException("File " + filename + " doesn't exist");
 
            FileInputStream fis = new FileInputStream(file);
            scanner = new Scanner(new BufferedInputStream(fis), "UTF-8");
 
            // 读取第一行
            String nmline = scanner.nextLine();
            String[] nm = nmline.trim().split("\\s+");
            //System.out.print(nm[0] + ' ' + nm[1]);
 
            N = Integer.parseInt(nm[0]);
            // System.out.println("N = " + N);
            M = Integer.parseInt(nm[1]);
            // System.out.println("M = " + M);
 
            // 读取后续的N行
            maze = new char[N][M];
            for(int i = 0 ; i < N ; i ++){
                String line = scanner.nextLine();
 
                // 每行保证有M个字符
                if(line.length() != M)
                    throw new IllegalArgumentException("Maze file " + filename + " is invalid");
                for(int j = 0 ; j < M ; j ++)
                    maze[i][j] = line.charAt(j);
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally {
            if(scanner != null)
                scanner.close();
        }
        
    }
 
    public int N(){ return N; }
    public int M(){ return M; }
    public char getMaze(int i, int j){
        if(!inArea(i,j))
            throw new IllegalArgumentException("i or j is out of index in getMaze!");
 
        return maze[i][j];
    }
 
    public boolean inArea(int x, int y){
        return x >= 0 && x < N && y >= 0 && y < M;
    }
 
    public void print(){
        System.out.println(N + " " + M);
        for(int i = 0 ; i < N ; i ++){
            for(int j = 0 ; j < M ; j ++)
                System.out.print(maze[i][j]);
            System.out.println();
        }
        return;
    }
 
}
 
 
 
 
 
 
 
import java.awt.*;
import java.awt.geom.Ellipse2D;
 
import java.awt.geom.Rectangle2D;
import java.lang.InterruptedException;
 
 
public class AlgoVisHelper {
 
    private AlgoVisHelper(){}
 
    public static final Color Red = new Color(0xF44336);
    public static final Color Pink = new Color(0xE91E63);
    public static final Color Purple = new Color(0x9C27B0);
    public static final Color DeepPurple = new Color(0x673AB7);
    public static final Color Indigo = new Color(0x3F51B5);
    public static final Color Blue = new Color(0x2196F3);
    public static final Color LightBlue = new Color(0x03A9F4);
    public static final Color Cyan = new Color(0x00BCD4);
    public static final Color Teal = new Color(0x009688);
    public static final Color Green = new Color(0x4CAF50);
    public static final Color LightGreen = new Color(0x8BC34A);
    public static final Color Lime = new Color(0xCDDC39);
    public static final Color Yellow = new Color(0xFFEB3B);
    public static final Color Amber = new Color(0xFFC107);
    public static final Color Orange = new Color(0xFF9800);
    public static final Color DeepOrange = new Color(0xFF5722);
    public static final Color Brown = new Color(0x795548);
    public static final Color Grey = new Color(0x9E9E9E);
    public static final Color BlueGrey = new Color(0x607D8B);
    public static final Color Black = new Color(0x000000);
    public static final Color White = new Color(0xFFFFFF);
 
 
    public static void strokeCircle(Graphics2D g, int x, int y, int r){
 
        Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
        g.draw(circle);
    }
 
    public static void fillCircle(Graphics2D g, int x, int y, int r){
 
        Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
        g.fill(circle);
    }
 
    public static void strokeRectangle(Graphics2D g, int x, int y, int w, int h){
 
        Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);
        g.draw(rectangle);
    }
 
    public static void fillRectangle(Graphics2D g, int x, int y, int w, int h){
 
        Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);
        g.fill(rectangle);
    }
 
    public static void setColor(Graphics2D g, Color color){
        g.setColor(color);
    }
 
    public static void setStrokeWidth(Graphics2D g, int w){
        int strokeWidth = w;
        g.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
    }
 
    public static void pause(int t) {
        try {
            Thread.sleep(t);
//            System.out.println("Dely");
        }
        catch (InterruptedException e) {
            System.out.println("Error sleeping");
        }
    }
 
}
 
 
 
 
 
import java.awt.*;
import javax.swing.*;
 
public class AlgoFrame extends JFrame{
 
    private int canvasWidth;
    private int canvasHeight;
 
    public AlgoFrame(String title, int canvasWidth, int canvasHeight){
 
        super(title);
 
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
 
        AlgoCanvas canvas = new AlgoCanvas();
        setContentPane(canvas);
        pack();
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
 
        setVisible(true);
    }
 
    public AlgoFrame(String title){
 
        this(title, 1024, 768);
    }
 
    public int getCanvasWidth(){return canvasWidth;}
    public int getCanvasHeight(){return canvasHeight;}
 
    // data
    private MazeData data;
    public void render(MazeData data){
        this.data = data;
        repaint();
    }
 
    private class AlgoCanvas extends JPanel{
 
        public AlgoCanvas(){
            // 双缓存
            super(true);
        }
 
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
 
            Graphics2D g2d = (Graphics2D)g;
 
            // 抗锯齿
//            RenderingHints hints = new RenderingHints(
//                    RenderingHints.KEY_ANTIALIASING,
//                    RenderingHints.VALUE_ANTIALIAS_ON);
//            hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//            g2d.addRenderingHints(hints);
 
            // 具体绘制
            int w = canvasWidth/data.M();
            int h = canvasHeight/data.N();
            
           
            
 
            for(int i = 0 ; i < data.N() ; i ++ )
            {
                for(int j = 0 ; j < data.M() ; j ++){
                    if (data.getMaze(i, j) == MazeData.WALL)
                        AlgoVisHelper.setColor(g2d, AlgoVisHelper.LightBlue);
                    else
                        AlgoVisHelper.setColor(g2d, AlgoVisHelper.White);
                    
                    AlgoVisHelper.fillRectangle(g2d, j * w, i * h, w, h);
                }
            }
        }
 
        @Override
        public Dimension getPreferredSize(){
            return new Dimension(canvasWidth, canvasHeight);
        }
    }
}
Nach dem Login kopieren

一个一个的动画显示

DELAY时间不能太小,小了会绘制时出错,可能是线程出问题了???

import java.awt.*;
 
public class AlgoVisualizer {
 
    private static int DELAY = 10;
    private static int blockSide = 8;
 
    private MazeData data;
    private AlgoFrame frame;
 
    public AlgoVisualizer(String mazeFile){
 
        // 初始化数据
        data = new MazeData(mazeFile);
        int sceneHeight = data.N() * blockSide;
        int sceneWidth = data.M() * blockSide;
        
 
        // 初始化视图
        EventQueue.invokeLater(() -> {
            frame = new AlgoFrame("Maze Solver Visualization", sceneWidth, sceneHeight);
 
            new Thread(() -> {
                run();
            }).start();
        });
    }
 
    public void run(){
    	      
        for (int i = 0; i < data.N(); i++) {
        	
        	for (int j = 0; j < data.M(); j++) {
        		setData(i, j); 
			}
		}      
    }
 
    private void setData(int i, int j){
    	
      	data.currentN = i;
    	data.currentM = j;
  
		frame.render(data);
        AlgoVisHelper.pause(DELAY);	 
 
    }
 
    
    public static void main(String[] args) {
 
        String mazeFile = "maze_101_101.txt";
 
        AlgoVisualizer vis = new AlgoVisualizer(mazeFile);
 
    }
}
 
 
 
 
 
 
 
 
 
import java.awt.*;
 
public class AlgoVisualizer {
 
    private static int DELAY = 10;
    private static int blockSide = 8;
 
    private MazeData data;
    private AlgoFrame frame;
 
    public AlgoVisualizer(String mazeFile){
 
        // 初始化数据
        data = new MazeData(mazeFile);
        int sceneHeight = data.N() * blockSide;
        int sceneWidth = data.M() * blockSide;
        
 
        // 初始化视图
        EventQueue.invokeLater(() -> {
            frame = new AlgoFrame("Maze Solver Visualization", sceneWidth, sceneHeight);
 
            new Thread(() -> {
                run();
            }).start();
        });
    }
 
    public void run(){
    	      
        for (int i = 0; i < data.N(); i++) {
        	
        	for (int j = 0; j < data.M(); j++) {
        		setData(i, j); 
			}
		}      
    }
 
    private void setData(int i, int j){
    	
      	data.currentN = i;
    	data.currentM = j;
  
		frame.render(data);
        AlgoVisHelper.pause(DELAY);	 
 
    }
 
    
    public static void main(String[] args) {
 
        String mazeFile = "maze_101_101.txt";
 
        AlgoVisualizer vis = new AlgoVisualizer(mazeFile);
 
    }
}
 
 
 
 
 
 
 
import java.awt.*;
import javax.swing.*;
 
public class AlgoFrame extends JFrame{
 
    private int canvasWidth;
    private int canvasHeight;
 
    public AlgoFrame(String title, int canvasWidth, int canvasHeight){
 
        super(title);
 
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
 
        AlgoCanvas canvas = new AlgoCanvas();
        setContentPane(canvas);
        pack();
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
 
        setVisible(true);
    }
 
    public AlgoFrame(String title){
 
        this(title, 1024, 768);
    }
 
    public int getCanvasWidth(){return canvasWidth;}
    public int getCanvasHeight(){return canvasHeight;}
 
    // data
    private MazeData data;
    public void render(MazeData data){
        this.data = data;
        repaint();
    }
 
    private class AlgoCanvas extends JPanel{
    	
        public AlgoCanvas(){
            // 双缓存
            super(true);
        }
 
        @Override
        public void paintComponent(Graphics g) {
           super.paintComponent(g);
 
            Graphics2D g2d = (Graphics2D)g;
 
            // 抗锯齿
//            RenderingHints hints = new RenderingHints(
//                    RenderingHints.KEY_ANTIALIASING,
//                    RenderingHints.VALUE_ANTIALIAS_ON);
//            hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//            g2d.addRenderingHints(hints);
 
            // 具体绘制
            int w = canvasWidth/data.M();
            int h = canvasHeight/data.N();
                                              
         先判断是不是已经绘制了 
            for(int n = 0; n < data.N(); n ++ )
            {
                for(int m = 0 ; m < data.M()  ; m ++){
                	     
              	  if (data.drawFinshed[n][m]) {
              		  
                      if (data.getMaze(n, m) == MazeData.WALL)
                          AlgoVisHelper.setColor(g2d, AlgoVisHelper.LightBlue);
                      else
                          AlgoVisHelper.setColor(g2d, AlgoVisHelper.White);
                                             
                      AlgoVisHelper.fillRectangle(g2d, m * w, n * h, w, h);
  				 }
                }
            }
        
            	          	  
      	      
              for(int i = data.currentN, j = 0 ; j < data.currentM + 1 ; j ++){
            	              	                         	             	
                  if (data.getMaze(i, j) == MazeData.WALL)
                      AlgoVisHelper.setColor(g2d, AlgoVisHelper.LightBlue);
                  else
                      AlgoVisHelper.setColor(g2d, AlgoVisHelper.White);
                                         
                  AlgoVisHelper.fillRectangle(g2d, j * w, i * h, w, h);
                  data.drawFinshed[i][j] = true;
              }
                               
            
            
以前一次性全部绘制显示出来
//            for(int i = 0 ; i < data.N() ; i ++ )
//            {
//                for(int j = 0 ; j < data.M() ; j ++){
//                    if (data.getMaze(i, j) == MazeData.WALL)
//                        AlgoVisHelper.setColor(g2d, AlgoVisHelper.LightBlue);
//                    else
//                        AlgoVisHelper.setColor(g2d, AlgoVisHelper.White);
//                    
//                    AlgoVisHelper.fillRectangle(g2d, j * w, i * h, w, h);
//                }
//            }
            
        }
 
        @Override
        public Dimension getPreferredSize(){
            return new Dimension(canvasWidth, canvasHeight);
        }
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo zeichnen und zeigen Sie Labyrinthanimationen in Java an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!