跟着王洋老师学编程 - 1.6 下大雪

发布时间 2023-12-26 12:16:52作者: Shannon_Zhang

一、我的思路

  - 在屏幕上画100~200个雪花,并记录每个雪花的位置

  - 应用线程的run方法,增加每个雪花的Y轴坐标,然后重绘画布 

 1 import java.awt.*;
 2 public class Snow{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1024,768);
 6         w.setBackground(Color.black);
 7 
 8         SnowPanel sp = new SnowPanel();
 9     Thread t = new Thread(sp);    
10     t.start();
11 
12         w.add(sp);
13         w.setVisible(true);
14     }
15 }
16 
17 class SnowPanel extends Panel implements Runnable{
18     int x = 30, y=30;
19         int[][] arr = new int[200][2];
20         public void paint(Graphics g){
21         for(int i=0;i<200;i++){
22                     x = (int)(Math.random()*1024);
23                    y = (int)(Math.random()*768);
24                     arr[i]=new int[]{x,y};
25             }
26             g.setColor(Color.white);
27         for(int j=0;j<200;j++){
28             g.drawString("*", arr[j][0],arr[j][1]);    
29         }
30         }
31     public void run(){
32 
33         while(true){
34             for(int k=0;k<200;k++){
35                 arr[k][1]=arr[k][1]+(int)(Math.random()*70);
36                 // 打印每个雪花的X轴和Y轴坐标
37                 // System.out.println("arr["+k+"]"+arr[k][0]+" "+arr[k][1]);
38                 if(arr[k][1]>768){
39                     arr[k][1]=0;
40                 }
41             }
42             try{
43                 Thread.sleep((int)(Math.random()*30));
44                 Thread.sleep(300);
45             }catch(Exception e){}
46             repaint();
47         }    
48     }
49     
50 }

【运行结果】雪花没有形成下落的感觉,而只是每个雪花都随机变换了位置。

【原因分析】梳理代码并输出雪花坐标发现:每次重绘,200个雪花都被重新赋予了坐标值,没有按预期的X轴不变、Y轴增加。

【解决方案】因为paint()和while中的代码总是在重复执行,因此,为了确保雪花的初始值存入数组后就不变化,将此段代码放到run()方法的while(trun)之前。

二、修改代码如下

 1 import java.awt.*;
 2 public class Snow{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1024,768);
 6         w.setBackground(Color.black);
 7 
 8         SnowPanel sp = new SnowPanel();
 9     Thread t = new Thread(sp);    
10     t.start();
11 
12         w.add(sp);
13         w.setVisible(true);
14     }
15 }
16 
17 class SnowPanel extends Panel implements Runnable{
18     int x = 30, y=30;
19         int[][] arr = new int[200][2];
20         public void paint(Graphics g){
21             g.setColor(Color.white);
22         for(int j=0;j<200;j++){
23             g.drawString("*", arr[j][0],arr[j][1]);    
24         }
25         }
26     public void run(){
27         for(int i=0;i<200;i++){
28                     x = (int)(Math.random()*1024);
29                    y = (int)(Math.random()*768);
30                     arr[i]=new int[]{x,y};
31             }
32         while(true){
33             for(int k=0;k<200;k++){
34                 arr[k][1]=arr[k][1]+(int)(Math.random()*50);
35                 // 打印每个雪花的X轴和Y轴坐标
36                 // System.out.println("arr["+k+"]"+arr[k][0]+" 
37 
38 "+arr[k][1]);
39                 if(arr[k][1]>768){
40                     arr[k][1]=0;
41                 }
42             }
43             try{
44                 Thread.sleep((int)(Math.random()*30));
45                 Thread.sleep(300);
46             }catch(Exception e){}
47             repaint();
48         }    
49     }
50     
51 }

编译并运行,结果如下

雪花形成了下落的效果,只是每次重绘,屏幕都要闪烁一次,好像没有那么连贯。。不过,总体是可以接受的啦!