shannonredeemed

跟着王洋老师学编程 - 1.5 小球撞墙(switch+if逻辑)

一、我的思路

- 创建窗体、设定窗体大小

- 在窗体中添加画布,并将画布添加至线程

- 线程run()方法持续执行,坐标不断变化,画布随之重绘,形成小球下落的效果,并随时判断小球X轴、Y轴坐标,触底后,通过flag值调整坐标加减方向

代码一

 1 import java.awt.*;
 2 public class BallHitWall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1024,750);
 6 
 7         MyPanelBall mpb = new MyPanelBall();
 8         w.add(mpb);
 9 
10         Thread t = new Thread(mpb);
11         t.start();
12     
13         w.setVisible(true);
14         
15     }
16 }
17 
18 class MyPanelBall extends Panel implements Runnable{
19     int x=10,y=10,flag=0;
20     public void paint(Graphics g){
21         g.setColor(Color.red);
22         g.fillOval(x,y,10,10);
23     }
24     public void run(){
25         while(true){
26             switch(flag){
27                 case 0: x++;y++;
28                 case 1: x++;y--;
29                 case 2: x--;y++;
30             }
31             if(y>750){
32                 flag=1;
33             }
34             if(x>1024){
35                 flag=2;
36             }
37             if(x<2||y<2){
38                 flag=0;
39             }
40             System.out.println(flag);
41             System.out.println("x:"+x);
42             System.out.println("y:"+y);
43             try{
44                 Thread.sleep(10);
45             }catch(Exception e){}
46             repaint();
47         }
48     }
49 }

 执行结果

小球触底后没有反弹,X\Y轴坐标一直停留在751没变化

冥思苦想无果,下班路上走了一圈,以为是flag重新赋值的代码块位置不对,调整至switch前面,运行,结果依旧。。。查百度——switch用错了?

https://m.runoob.com/java/java-switch-case.html

Break,break,break……

改代码如下: 

 1 import java.awt.*;
 2 public class BallHitWall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(400,300);
 6 
 7         MyPanelBall mpb = new MyPanelBall();
 8         w.add(mpb);
 9 
10         Thread t = new Thread(mpb);
11         t.start();
12 
13         w.setVisible(true);
14 
15     }
16 }
17 
18 class MyPanelBall extends Panel implements Runnable{
19     int x=0,y=0,flag=0;
20     public void paint(Graphics g){
21         g.setColor(Color.red);
22         g.fillOval(x,y,10,10);
23     }
24     public void run(){
25         while(true){
26             switch(flag){
27                 case 0: x++;y++;break;
28                 case 1: x++;y--;break;
29                 case 2: x--;y--;break;
30              case 3: x--;y++;
31             }
32         if(y>=300){
33             if(x>=300){
34                 flag=1;
35             }
36 
37         }
38             if(x>=290&&x<=390&&y>=290){
39                 flag=1;
40             }
41             if(x>=390&&y>=190){
42                 flag=2;
43             }
44             if(y<=1&&x>=200&&x<=390){
45                 flag=3;
46             }
47             if(y<=290&&x<=1){
48                 flag=0;
49             }
50             System.out.println(flag);
51             System.out.println("x:"+x);
52             System.out.println("y:"+y);
53             try{
54                 Thread.sleep(10);
55             }catch(Exception e){}
56             repaint();
57         }
58     }
59 }

【运行结果】 小球实现了反弹,但没能实现小球持续绕着窗口四围反复运动,会出现小球消失在可视窗口的情况。。

再次修改

 

【运行结果】即小球没能实现反弹,第一次转向时,小球的X、Y轴坐标出现了死循环。

【原因分析】当X、Y轴达到边界值之后,程序没能有效控制。

【解决方案】只对边界值进行处理。对中间值不再做判断。

【修改代码如下】

 1 import java.awt.*;
 2 public class BallHitWall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5             w.setSize(400,300);
 6 
 7             MyPanelBall mpb = new MyPanelBall();
 8             w.add(mpb);
 9 
10             Thread t = new Thread(mpb);
11             t.start();
12 
13             w.setVisible(true);
14 
15     }
16 }
17 
18 class MyPanelBall extends Panel implements Runnable{
19     int x=0,y=0,flag=0;
20     public void paint(Graphics g){
21             g.setColor(Color.red);
22             g.fillOval(x,y,10,10);
23     }
24 
25     public void run(){
26         while(true){
27             switch(flag){
28                 case 0: x++;y++;break;
29                 case 1: x++;y--;break;
30                 case 2: x--;y--;break;
31                 case 3: x--;y++;
32             }
33             if(y==260){
34                 flag=1;
35             }
36             if(x==380){
37                 flag=2;
38             }
39             if(y==0){
40                 flag=3;
41             }
42             if(x==0){
43                 flag=0;
44             }        
45             
46             System.out.println(flag);
47         System.out.println("x:"+x);
48             System.out.println("y:"+y);
49             try{
50                     Thread.sleep(10);
51             }catch(Exception e){}
52             repaint();
53         }
54     }
55 }

【运行结果】小球在反复碰撞一周半后,实现了纳什均衡。。只在两点之间进行运动,其他方向都不再运动了。。。重新加if子句也没能解决这个问题。

 

二、老师的方案

不止判断边界值,还会判断小球来的方向,再决定小球反弹的方向。

按老师的思路,修改代码如下:

 1 import java.awt.*;
 2 public class BallHitWall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5             w.setSize(400,300);
 6 
 7             MyPanelBall mpb = new MyPanelBall();
 8             w.add(mpb);
 9 
10             Thread t = new Thread(mpb);
11             t.start();
12 
13             w.setVisible(true);
14 
15     }
16 }
17 
18 class MyPanelBall extends Panel implements Runnable{
19     int x=0,y=0,flag=0;
20     public void paint(Graphics g){
21             g.setColor(Color.red);
22             g.fillOval(x,y,10,10);
23     }
24 
25     public void run(){
26         while(true){
27             switch(flag){
28                 case 0: x++;y++;break;
29                 case 1: x++;y--;break;
30                 case 2: x--;y--;break;
31                 case 3: x--;y++;
32             }
33             if(y==260){
34                 if(flag==0){
35                     flag=1;
36                 }else{
37                     flag=2;
38                 }
39             }
40             if(x==380){
41                 if(flag==1){
42                     flag=2;
43                 }else{
44                     flag=3;
45                 }
46             }
47             if(y==0){
48                 if(flag==2){
49                     flag=3;
50                 }else{
51                     flag=0;
52                 }
53             }
54             if(x==0){
55                 if(flag==3){
56                     flag=0;
57                 }else{
58                     flag=1;
59                 }
60             }        
61             
62             System.out.println(flag);
63         System.out.println("x:"+x);
64             System.out.println("y:"+y);
65             try{
66                     Thread.sleep(10);
67             }catch(Exception e){}
68             repaint();
69         }
70     }
71 }

【运行结果】完美实现小球的圆周运动~~~~

 

posted on 2023-12-26 12:14  Shannon_Zhang  阅读(14)  评论(0编辑  收藏  举报