效果图:
import java.awt.*;
public class AlgoVisualizer {
private static int DELAY = 10;
private int[] money;
private AlgoFrame frame;
public AlgoVisualizer(int sceneWidth, int sceneHeight){
// 初始化数据
money = new int[100];
for(int i = 0 ; i < money.length ; i ++) {
money[i] = 100;
}
// 初始化视图
EventQueue.invokeLater(() -> {
frame = new AlgoFrame("Money Problem", sceneWidth, sceneHeight);
new Thread(() -> {
run();
}).start();
});
}
public void run(){
while(true){
frame.render(money);
AlgoVisHelper.pause(DELAY);
for(int i = 0 ; i < money.length; i ++){
if(money[i] > 0){
int j = (int)(Math.random() * money.length);
money[i] -= 1;
money[j] += 1;
}
}
}
}
public static void main(String[] args) {
int sceneWidth = 1000;
int sceneHeight = 800;
AlgoVisualizer vis = new AlgoVisualizer(sceneWidth, sceneHeight);
}
}
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
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
int[] money;
public void render(int[] money){
this.money = money;
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);
// 具体绘制
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Blue);
int w = canvasWidth / money.length;
for(int i = 0 ; i < money.length ; i ++) {
AlgoVisHelper.fillRectangle(g2d,
i*w+1, canvasHeight-money[i], w-1, money[i]);
}
}
@Override
public Dimension getPreferredSize(){
return new Dimension(canvasWidth, canvasHeight);
}
}
}
注意:还有工具类代码就不帖出来了。(颜色之类,不重要)
完整代码GitHub