随机控制泡泡和分支流程控制
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
使用步骤:
- 导入Random API:import java.util.Random;
- 创建Random对象:Random random=new Random();
- 调用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));
案例:
- 创建Java项目
- 将tedu_utils1.0.jar导入到项目中
- 编写的测试案例:
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 控制泡泡的方向
- 利用随机数生成浮点数类型的变量作为x和y方向的增量,随机范围可以选择1~6区间,不能从0开始,0有可能在原地不动。
double offsetX=Math.random()*(6-1)+1;
double offsetY=Math.random()*(6-1)+1;
- 每次绘图前需要将x坐标增加offsetX,y坐标增加offsetY
x +=offsetX;
y +=offsetY;
- 解决强制类型转换计算,重构代码,将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;
- 判断if分支条件表达式的值:
- 若值为true,则执行指令2;
- 若值为false,则执行指令3;
- 执行指令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);