java之数字彩虹雨

思考1:深克隆与浅克隆

思考2:定义方法访问私有变量

思考3:多线程

定义俩个类

Rain,RainPanel

(放个帖,以后再看)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public final class BinaryRain extends JDialog {
  public static void main(String[] args) {
    BinaryRain r = new BinaryRain();
    r.setVisible(true);
    r.start();
  }

  private BinaryRain() {
    try {
      init();
    } catch (Exception ex) {
      JOptionPane.showMessageDialog(null, "Failed to init.\n" + ex, "BinaryRain", JOptionPane.ERROR_MESSAGE);
      System.exit(1);
    }
  }

  private Dimension size;
  private Color foreground, background;
  public char[] RAIN_CHARACTERS;
  private Font rainFont;

  private void init() {
    size = Toolkit.getDefaultToolkit().getScreenSize();
    foreground = Color.GREEN;
    background = Color.BLACK;
    rainFont = new Font("arial", Font.BOLD, 15);
    RAIN_CHARACTERS = new char[126 - 33 + 1];
    for (int c = 0, i = 33, l = RAIN_CHARACTERS.length; c < l; c++, i++)
      RAIN_CHARACTERS[c] = (char) i;
    setUndecorated(true);
//    setAlwaysOnTop(true);
//    setResizable(false);
//    setTitle("Binary Rain");
//    setLocationRelativeTo(null);
    BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB_PRE);
    setCursor(Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(8, 8), "Disable Cursor"));
    setSize(size);
    addKeyListener(new KeyAdapter() {
      @Override
      public void keyPressed(KeyEvent event) {
        if ((event.isAltDown() && event.getKeyCode() == KeyEvent.VK_F4) || (event.getKeyCode() == KeyEvent.VK_ESCAPE)) {
          setVisible(false);
          System.exit(0);
        }
      }
    });
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent event) {
        if (!isRaining())
            isStart = false;
        System.exit(0);
      }
    });
    add(panel, BorderLayout.CENTER);
  }

  private synchronized void newRain() {
    Rain r = new Rain((int) (Math.random() * 40 + 10), (int) (Math.random() * size.width), (int) (Math.random() * -60 * 15), (int) (Math.random() * 8 + 2), (float) (Math.random() * 10 + 10));
    rains.add(r);
    new Thread(r).start();
  }
  private ArrayList<Rain> rains = new ArrayList<>();

  public void start() {
    for (int c = 0, s = 108; c < s; c++)
      newRain();
    isStart = true;
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (isStart)
          panel.repaint();
      }
    }).start();
  }

  public boolean isRaining() {
    return isStart;
  }

  public String getRandomChar() {
    return String.valueOf(RAIN_CHARACTERS[(int) (Math.random() * RAIN_CHARACTERS.length)]);
  }

  private RainPanel panel = new RainPanel();
  private boolean isStart = false;

  private final class RainPanel extends JPanel {
    @Override
    public void paint(Graphics g) {
      if (isStart) {
        BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) img.getGraphics();
        g2.setColor(background);
        g2.fillRect(0, 0, size.width, size.height);
        g2.setColor(foreground);
        Collection<Rain> collection = (Collection<Rain>) rains.clone();
        for (Iterator<Rain> it = collection.iterator(); it.hasNext();) {
          Rain r = it.next();
          if (r.isEnd()) {
            rains.remove(r);
            newRain();
            continue;
          }
            g2.setFont(rainFont.deriveFont(r.fontSize));
            String[] ss = r.getRainChars();
            int x = r.rainX;
            int y = r.rainY - ss.length * 15;
            for (String s : ss) {
              g2.drawString(s, x, y);
              y += 15;
          }
        }
        g.drawImage(img, 0, 0, this);
      }
    }
  }

  private final class Rain implements Runnable {
    private final String[] rainChars;
    private int rainSpeed;
    private int rainX, rainY;
    private float fontSize;

    public Rain(int length, int x, int y, int speed, float size) {
      rainChars = new String[length + 1];
      for (int i = 0; i < length; i++)
        rainChars[i] = getRandomChar();
      rainChars[length] = " ";
      this.rainX = x;
      this.rainY = y;
      this.rainSpeed = speed;
      this.fontSize = size;
    }

    @Override
    public void run() {
      while (isRaining() && rainY < size.height + (rainChars.length + 1) * 15) {
        if (rainSpeed <= 0)
          break;
        try {
          Thread.sleep(rainSpeed);
        } catch (InterruptedException ex) {
        }
        rainY += 2;
      }
      rainSpeed = -1;
    }

    public String[] getRainChars() {
      return rainChars;
    }

    public boolean isEnd() {
      return rainSpeed <= 0;
    }
  }
}

 

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: Java编写数字彩虹通常使用了基于数值计算和图像处理的算法。这些算法可实现在屏幕上以彩虹色展示下落的数字。 首先,一种常用的算法是利用随机数生成器确定数字的位置、大小和颜色。通过随机数来决定数字出现的坐标,可以使得下落的数字在屏幕上呈现随机分布。同时,通过随机生成的颜色给每个数字赋予不同的彩虹色值。 其次,为了实现数字的下落效果,Java编程可以利用循环和定时器控制数字的位置随时间的变化。在每次循环中,通过更新数字的位置参数,使其沿垂直方向下落。速度可以通过调整每一次循环的时间间隔来控制。 此外,为了实现彩虹色效果,还可以使用颜色渐变算法。通过计算颜色的RGB值,并在垂直方向进行渐变,可以使得数字在下落的过程中呈现出从红色到紫色的彩虹色效果。 综上所述,Java编写数字彩虹通常用到了随机数生成、循环、定时器、颜色渐变等算法。这些算法使得数字能够随机下落并呈现彩虹色效果,为用户提供了一种有趣且美观的视觉体验。 ### 回答2: 在Java编写数字彩虹可以使用以下算法: 1. 首先,确定需要生成的数字彩虹的范围,例如从0到9或是其他更大的范围。 2. 创建一个循环,控制数字彩虹的下落速度和持续时间。 3. 在每次循环中,生成一个随机数,使得它在指定的范围内。 4. 根据产生的随机数,确定选择合适的彩虹颜色。可以使用条件语句或是switch语句来处理不同的颜色选择。 5. 在屏幕上绘制数字彩虹,可以使用图形库或是Java的GUI函数来实现。 6. 实现数字彩虹的下落效果,可以使用线程或是计时器等机制来控制下落的速度和位置。 7. 循环结束后,可以选择是否重新开始数字彩虹的下落,或是给出一些结束的提示信息。 总的来说,Java编写数字彩虹主要涉及到随机数生成、颜色选择、图形绘制和动画效果等方面的操作。具体的实现方式可以根据个人的编程习惯和需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值