首页 > 编程语言 >跟着王洋老师学编程 - 1.6 下大雪

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

时间:2023-12-27 10:44:20浏览次数:27  
标签:1.6 Thread 王洋 代码 编程 雪花 int new public

一、我的思路

  - 在屏幕上画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 
27         public void run(){
28             for(int i=0;i<200;i++){
29                     x = (int)(Math.random()*1024);
30                     y = (int)(Math.random()*768);
31             arr[i]=new int[]{x,y};
32                 }
33             while(true){
34                 for(int k=0;k<200;k++){
35                     arr[k][1]=arr[k][1]+(int)(Math.random()*50);
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 }

【运行结果】雪花形成了下落的效果,只是每次重绘,屏幕都要闪烁一次,好像没有那么连贯。。不过,总体是可以接受的啦!~ 直到看到老师的版本。

 二、老师的方案

因为雪花的位置需要初始化且需要存储,老师引入了构造方法。

代码一

【运行效果】编译报错,构造方法不正确

【原因分析】构造方法的名字写错,没有与类名保持一致。

代码二

【运行结果】背景没生效,且没有雪花。

【原因分析】背景色不应该设置在Panel上?

代码三

【运行结果】背景颜色生效了,但是依然没有雪花。。。

【原因分析】是不是还是背景色设置的位置不对呀?

 代码四

【运行结果】背景色由失效了,且依然没有雪花。。。

【原因分析】啊! SnowPanelT对象没有添加至窗体呀!!!

代码五

【运行结果】背景色终于生效了,且有雪花。。。但是。。。雪花没动。。。

【原因分析】打印雪花的X轴、Y轴坐标值试试。。

 代码六

【运行结果】雪花X轴、Y轴坐标值只打印了一次!

【原因分析】也就是说,for循环执行一次就完事了。。。

代码七

【运行结果】雪花动了,但是动到底就没了。。。而且整体往左下方偏。

【原因分析】没有做边界值设定!去掉X轴的变化,只对Y轴坐标做限定。

 代码八 - 终极版

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

【运行结果】完美展现了下大雪的效果。。。

 

标签:1.6,Thread,王洋,代码,编程,雪花,int,new,public
From: https://www.cnblogs.com/shannonredeemed/p/17930021.html

相关文章

  • 写给开发者的软件架构实战:并发与并行编程
    1.背景介绍并发与并行编程是计算机科学的基石之一,它们在现代软件系统中扮演着至关重要的角色。随着计算机硬件的不断发展,并发与并行编程的应用也日益广泛。然而,这些概念和技术也带来了许多挑战,如数据一致性、死锁、负载均衡等。在这篇文章中,我们将深入探讨并发与并行编程的核心概念......
  • 线程通讯 网络编程
    //线程的休眠try{Thread.sleep(3000);//毫秒}catch(InterruptedExceptione){e.printStackTrace();}//第二种方式:try{TimeUnit.MINUTES.sleep(3);}catch(InterruptedExceptione){e.printStackTrace();} 联合/插队:join()Threadthread=new......
  • 十八,JAVA 多线程,网络编程
    线程的休眠//线程的休眠try{    Thread.sleep(3000);//毫秒 }catch(InterruptedExceptione){ e.printStackTrace();}//第二种方式:try{    TimeUnit.MINUTES.sleep(3);}catch(InterruptedExceptione){ e.printStackTra......
  • 青少年学习编程的好处
    各位家长、老师和同学们,大家好!今天我要和大家分享的主题是:青少年学习编程的好处。我希望通过今天的分享,让大家更好地了解编程对于青少年的意义和价值。1.封面-主题:青少年学习编程的好处-副标题:提高逻辑思维,培养创新精神,掌握未来技能-报告人:您的名字2.引言-感谢大家的关注和......
  • 跟着王洋老师学编程 - 1.6 下大雪
    一、我的思路-在屏幕上画100~200个雪花,并记录每个雪花的位置-应用线程的run方法,增加每个雪花的Y轴坐标,然后重绘画布 1importjava.awt.*;2publicclassSnow{3publicstaticvoidmain(Stringargs[]){4Framew=newFrame();5......
  • 跟着王洋老师学编程 - 1.5 小球撞墙(switch逻辑,问题是:小球会出现消失的状态。。)
    一、我的思路-创建窗体、设定窗体大小-在窗体中添加画布,并将画布添加至线程-线程run()方法持续执行,坐标不断变化,画布随之重绘,形成小球下落的效果,并随时判断小球X轴、Y轴坐标,触底后,通过flag值调整坐标加减方向代码一1importjava.awt.*;2publicclassBallHitWall{......
  • 1.6kstar,推荐一款开源软件,sharing
    1简介sharing是一个命令行工具,用于将目录和文件从命令行共享到iOS和Android设备,而无需额外的客户端应用程序2安装github源码可以访问如下地址https://github.com/parvardegr/sharinggithub如果无法访问的话,可以后台直接私信该工具需要nodejs环境,通过npm安装npminst......
  • 12V/5V负载开关IC——PC9511/21可编程高精度限流集成28mΩ功率FET
    1概述PC9511/21系列电子保险丝的设计目的是保护输出(OUT)上的电路免受瞬态影响在电源总线(IN)上和大的浪涌电流。同时保护电源总线不受不希望的输出短路的影响以及意外的过载情况。当输出斜坡上升时,浪涌电流为通过限制输出电压的slew速率来限制。转换速率由位于SS引脚。内部小电流源为......
  • PC5028高性能可编程同步升压IC内置驱动N沟道MOSFET宽压输入输出
    概述PC5028是一款高性能的增压器驱动N沟道MOSFET的控制器同步升压功率级,从宽输入电源范围从4.5V到40V。当控制器从输出电压偏置控制器可以从低至启动后1V。开关频率可以通过编程FREQ引脚上的电阻器。恒定频率电流控制体系结构允许设备同步到SYNC/SPS引脚上的外部时钟。为了优化轻负......
  • 在 Python 中,​​?:​​​ 符号并不是一个有效的运算符。这个符号在其他一些编程语言
    在Python中,?:符号并不是一个有效的运算符。这个符号在其他一些编程语言中,如JavaScript或C,被称为条件(三元)运算符。然而,在Python中,我们使用if-else表达式来达到相同的目的。例如:x=10y=20print("xisgreater")ifx>yelseprint("yisgreater")在上述代码中,如果......