随机控制泡泡和分支流程控制

随机控制泡泡和分支流程控制

1 随机数

1.1 随机数生成器

Java通过算法实现一个随机数生成器。

1.2 Math.random()

Math.random()返回值是一个0到1之间的随机数,其范围包括0不包括1。

如果需要生成[min,max]随机数使用如下公式即可:

int r=(int)(Math.random()*(max-min))+min;

案例:

//随机数案例
double r=Math.random();//产生0-1之间的数,不可能为1
System.out.println(r);
System.out.println(r*100);//扩大一百倍
System.out.println((int)(r*100));//取整数
System.out.println((int)(r*100)+100);//取值200以内

int max=200;
int min=100;
int n=(int)(r*(max-min))+min;
System.out.println(n);	

n=(int)(Math.random()*(max-min))+min;
System.out.println(n);	

max =80;
min =50;
n=(int)(Math.random()*(max-min)+min);
System.out.println(n);
1.3 Random API

使用步骤:

  1. 导入Random API:import java.util.Random;
  2. 创建Random对象:Random random=new Random();
  3. 调用random的方法获得随机数:int n=random.nextlnt(100);参数100表示随机数的最大范围。此时方法返回随机数范围是:[0,100]

如果需要生成[min,max)随机数使用如下公式即可:

int r=random.nextlnt(max-min)+min;

案例:生成100-200之间的随机整数

import java.util.Random;
public class Rand {
	public static void main(String[] args) {
		/*
		 * Random演示
		 */
        //生成100以内的随机数
		Random random=new Random();
		int n=random.nextInt(100);
		System.out.println(n);
		//生成(100-200之间的随机数)
		n=random.nextInt(100)+100;
		System.out.println(n);
		//n=random.nextInt(max-min)+min;
	}	
}

2 利用随机数创建泡泡

2.1 随机的出场位置

利用随机数计算出泡泡的位置:

int x=(int)(Math.random()*(width-w));
int y=(int)(Math.random()*(height-h));

案例:

  1. 创建Java项目
  2. 将tedu_utils1.0.jar导入到项目中
  3. 编写的测试案例:
public class Demo3 extends App{
	int x=(int)(Math.random()*(800-60));//窗口宽800
	int y=(int)(Math.random()*(600-60));//窗口高600
    
    public void painting(Graphics2D g){
        g.setColor(new Color(0,0,255));//绘制蓝色
        g.fillOval(x,y,60,60)//绘制第一个圆
    }
    public static void main(String[] args){
		Demo3 app=new Demo3();//开权限
		app.start();//启动程序
	}
}
2.2 随机控制泡泡的大小

利用随机数生成10-60整数作为泡泡的大小:

int d=(int)(Math.random()*(60-10))+10;

利用随机数生成圆的大小d以后,在将所有原有固定的圆大小替换为变量d。

public class Demo4 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    public void painting(Graphics2D g){
        g.setColor(new Color(0,0,255));//绘制蓝色
        g.fillOval(x,y,d,d)//绘制第一个圆
    }
    public static void main(String[] args){
		Demo4 app=new Demo4();//开权限
		app.start();//启动程序
	}
}
2.3 随机的泡泡颜色

控制不同的颜色分量数值大小就可以混合出不同的颜色,每个颜色分量其范围是0~255,可以利用随机数生成[0,256)范围内随机数作为一个颜色分量:

int r=(int)(Math.random()*(256));//随机红色比例
int g =(int)(Math.random()*(256));//随机绿色比例
int b =(int)(Math.random()*(256));//随机蓝色比例
Color color=new Color(r,g,b);

代码:

public class Demo5 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    public void painting(Graphics2D g){
        g.setColor(color);//绘制颜色
        g.fillOval(x,y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo5 app=new Demo5();//开权限
		app.start();//启动程序
	}
}

3 控制泡泡的方向

  1. 利用随机数生成浮点数类型的变量作为x和y方向的增量,随机范围可以选择1~6区间,不能从0开始,0有可能在原地不动。
double offsetX=Math.random()*(6-1)+1;
double offsetY=Math.random()*(6-1)+1;
  1. 每次绘图前需要将x坐标增加offsetX,y坐标增加offsetY
x +=offsetX;
y +=offsetY;
  1. 解决强制类型转换计算,重构代码,将x,y类型更换为double
double x=(int)offsetX=Math.random()*(800-d);
double y=(int)offsetY=Math.random()*(600-d);

g.fillOval(x,y,d,d)会出现编译错误,原因是g.fillOval(x,y,d,d)只能接受int类型的参数,只需要利用强制类型转换,将double类型的x,y转换为int类型即可:

g.fillOval((int)x,(int)y,d,d);

案例代码:

public class Demo6 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    
    public void painting(Graphics2D g){
        x +=offsetX;
		y +=offsetY;
        g.setColor(color);//绘制颜色
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo6 app=new Demo6();//开权限
		app.start();//启动程序
	}
}

利用三元运算符实现圆形向任意方向飞行:

//二分之一的概率去修改offsetX,Y的正负
offsetX = Math.random()<0.5 ? -offsetX : offsetX;
offsetY = Math.random()<0.5 ? -offsetY : offsetY;

完整代码:

public class Demo7 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    {//语句块
    offsetX = Math.random()<0.5 ? -offsetX : offsetX;
	offsetY = Math.random()<0.5 ? -offsetY : offsetY;
    }
    public void painting(Graphics2D g){
        x +=offsetX;
		y +=offsetY;
        g.setColor(color);//绘制颜色
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo7 app=new Demo7();//开权限
		app.start();//启动程序
	}
}

4 流程控制

  • 顺序执行就是指程序按照从上到下顺序执行指令序列
  • 分支就是指根据分支条件选择一条指令序列执行
  • 循环就是指根据循环条件反复执行指令序列

5 分支流程控制

分支条件语句分为三种:单路分支,双路分支,多路分支。

5.1 If单路分支流程控制

执行流程为:

  • 先执行指令1;

  • 然后执行判断分支条件表达式,得到boolean值;

    • 若值为true,则执行if语句块中的指令2;
    • 若值为false,则不执行if语句块中的指令2;
  • 最后执行指令3。

案例:商品总价大于等于500时,打八折

public class IfDemo{
    public static void main(String[] args){
        //IF语句演示
        Scanner console=new Scanner(System.in);
        System.out.print("请输入商品总价:");
        double total=console.nextDouble();
        if(total>=500){
            //total=total*0.8;
            total *=0.8;
        }
        System.out.println("付款金额:"+total);
    }
}
5.2 碰到边缘反弹功能

碰到右侧边界的条件是:x>800-d,则算法实现如下:

x +=offsetX;
y +=offsetY;
if(x>=800-d) {
offsetX=-offsetX;
}
System.out.println("碰到右边缘: "+x+","+y);
System.out.println(offsetX+","+ofsetY);    

案例代码:

public class Demo8 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    {//语句块
    offsetX = Math.random()<0.5 ? -offsetX : offsetX;
	offsetY = Math.random()<0.5 ? -offsetY : offsetY;
    }
    public void painting(Graphics2D g){
        g.setColor(color);//绘制颜色
        x +=offsetX;
		y +=offsetY;
        
        if(x>=800-d) {
        offsetX=-offsetX;
        }
        System.out.println(x+","+y);
        System.out.println(offsetX+","+offsetY);  
        
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo8 app=new Demo8();//开权限
		app.start();//启动程序
	}
}

左边界,上边界,下边界同理:

public class Demo9 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    {//语句块
    offsetX = Math.random()<0.5 ? -offsetX : offsetX;
	offsetY = Math.random()<0.5 ? -offsetY : offsetY;
    }
    public void painting(Graphics2D g){
        g.setColor(color);//绘制颜色
        x +=offsetX;
		y +=offsetY;
        
        if(x>=800-d) {
        offsetX=-offsetX;
        }
        if(y>=600-d) {
        offsetY=-offsetY;
        }
        if(x<0) {
        offsetX=-offsetX;
        }
        if(y<0) {
        offsetY=-offsetY;
        }
        System.out.println(x+","+y);
        System.out.println(offsetX+","+offsetY);  
        
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo9 app=new Demo9();//开权限
		app.start();//启动程序
	}
}
5.3 If else 双路分支语句

执行流程:

  1. 执行指令1;
  2. 判断if分支条件表达式的值:
  • 若值为true,则执行指令2;
  • 若值为false,则执行指令3;
  1. 执行指令4。

二选一的执行流程,可以解决如下案例:

  • 总价大于等于500成立,打8折
  • 不成立,总价打95折
public class IfDemo1{
    public static void main(String[] args){
        //if else语句演示
        Scanner console=new Scanner(System.in);
        System.out.print("请输入商品总价:");
        double total=console.nextDouble();
        if(total>=500){
            //total=total*0.8;
            total *=0.8;
        }else{
            total *=0.95;
        }
        System.out.println("付款金额:"+total);
    }
}
5.4 利用If else跟踪泡泡碰到边缘
if(x>=800-d) {
offsetx=-offsetx;
System.out.println("碰到右边缘: "+x);
System.out.println("正常飞行");

完整案例:

public class Demo10 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    {//语句块
    offsetX = Math.random()<0.5 ? -offsetX : offsetX;
	offsetY = Math.random()<0.5 ? -offsetY : offsetY;
    }
    public void painting(Graphics2D g){
        g.setColor(color);//绘制颜色
        x +=offsetX;
		y +=offsetY;
        
        if(x>=800-d) {
        offsetX=-offsetX;
            System.out.println("碰到右边缘: "+x);
        }else{
            System.out.println("正常飞行");
        }
        
        if(y>=600-d) {
        offsetY=-offsetY;
            System.out.println("碰到下边缘: "+y);
        }else{
             System.out.println("正常飞行");
        }
        
        if(x<0) {
        offsetX=-offsetX;
            System.out.println("碰到左边缘: "+x);
        }else{
            System.out.println("正常飞行");
        }
        
        if(y<0) {
        offsetY=-offsetY;
            System.out.println("碰到上边缘: "+y);
        }else{
            System.out.println("正常飞行");
        }
        //System.out.println(x+","+y);
        //System.out.println(offsetX+","+offsetY);  
        
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo10 app=new Demo10();//开权限
		app.start();//启动程序
	}
}
5.5 If else If多路分支语句

实现多个条件多选一执行:

  • 如果商品总价大于等于800,则打七折
  • 如果商品总价小于800大于等于500,则打八折
  • 如果商品总价小于500大于等于200,则打九折
  • 如果商品总价小于200,则打九五折

案例:

public class IfDemo2{
    public static void main(String[] args){
        //if else if语句演示
        Scanner console=new Scanner(System.in);
        System.out.print("请输入商品总价:");
        double total=console.nextDouble();
        if(total>=800){
            //total=total*0.7;
            total *=0.7;
        }else if(total>=500){
            total *=0.8;
        }else if(total>=200){
            total *=0.9
        }else{
            total *=0.95;
        }
        System.out.println("付款金额:"+total);
    }
}
5.6 利用多路分支优化边缘检测

案例代码:

x+=offsetX;
y+=offsetY;
if(x>=800-d) {
			offsetX=-offsetX;
			System.out.println("碰到右边缘: "+x);
}else if(y>=600-d) {
			offsetY=-offsetY;
			System.out.println("碰到下边缘: "+y);
}else if(x<0) {
			offsetX=-offsetX;
			System.out.println("碰到左边缘: "+x);
}else if(y<0) {
			offsetY=-offsetY;
			System.out.println("碰到上边缘: "+y);
}else {
			System.out.println("正常飞行");
}

完整案例:

public class Demo11 extends App{
    int d=(int)(Math.random()*(60-10))+10;//直径
	int x=(int)(Math.random()*(800-d));//窗口宽800
	int y=(int)(Math.random()*(600-d));//窗口高600
    
    int r=(int)(Math.random()*(256));//随机红色比例
    int g =(int)(Math.random()*(256));//随机绿色比例
    int b =(int)(Math.random()*(256));//随机蓝色比例
    Color color=new Color(r,g,b);
    
    double offsetX=Math.random()*(6-1)+1;
	double offsetY=Math.random()*(6-1)+1;
    {//语句块
    offsetX = Math.random()<0.5 ? -offsetX : offsetX;
	offsetY = Math.random()<0.5 ? -offsetY : offsetY;
    }
    public void painting(Graphics2D g){
        g.setColor(color);//绘制颜色
        x +=offsetX;
		y +=offsetY;
        
        if(x>=800-d) {
			offsetX=-offsetX;
			System.out.println("碰到右边缘: "+x);
        }else if(y>=600-d) {
                    offsetY=-offsetY;
                    System.out.println("碰到下边缘: "+y);
        }else if(x<0) {
                    offsetX=-offsetX;
                    System.out.println("碰到左边缘: "+x);
        }else if(y<0) {
                    offsetY=-offsetY;
                    System.out.println("碰到上边缘: "+y);
        }else {
                    System.out.println("正常飞行");
        }
                //System.out.println(x+","+y);
        //System.out.println(offsetX+","+offsetY);  
        
        g.fillOval((int)x,(int)y,d,d)//绘制圆
    }
    public static void main(String[] args){
		Demo11 app=new Demo11();//开权限
		app.start();//启动程序
	}
}

6 添加多个泡泡

  • 添加泡泡加相应的变量即可,如:随机的出场位置,泡泡的大小,颜色,语句块等
  • 绘制颜色的时候可将g.setColor(new Color(0,0,255))写为g.setColor(color);
上一篇:前端大佬带你玩转超简易图片放大镜


下一篇:正弦余弦定理,求圆弧度或度数