该界面模拟了一个简单的“吃球”游戏,一开始多个球在屏幕上移动,并检查每个大球是否可以吃掉其他小球,且更新状态,删除已经被吃掉的小球。通过图形绘制和逻辑处理实现了游戏的基本功能。
主界面World.java
package gzeu.test.date919;import cn.tedu.util.App;import java.awt.*;
import java.util.Arrays;
// 吃球的方法:大球的面积加小球的面积
// 圆心距: 当c>R-r不能吃 当c<=R-r能吃 圆心坐标(x+d/2,y+d/2)
// 圆心距:根号([x1+d/2-(x2+d/2)]^2+[y1+d/2-(y2+d/2)]^2)public class World extends App {//创建数组:基本类型int double string、引用类型 类,Ball [] balls=new Ball[20];//用构造函数给数组赋值public World(){for(int i =0;i<balls.length;i++){balls[i] = new Ball(); //没有的东西就new一下}}public void painting(Graphics2D g) //Graphics2D 画笔对象{for(int i =0;i<balls.length;i++){balls[i].paint(g);balls[i].move();}eating();}//打球正在吃小球public void eating(){Ball [] bigBalls = balls;//放打球Ball [] smallBalls = balls;//放小球boolean [] eatens = new boolean[smallBalls.length];//用来存储状态,被吃/没被吃int n=0; //计数器,用来记录被吃小球的for(int i=0;i<balls.length;i++){if(eatens[i]){ //若当前球的状态为被吃,则不能吃其他球continue;}for(int j=0;j<balls.length;j++){//小球不能吃自己if(i==j){continue;}if(eatens[j]){continue;}if(bigBalls[i].eat(smallBalls[j])){eatens[j]=true;n++;}}}//将被吃的小球删掉if(n==0){return;}Ball [] arr = new Ball[smallBalls.length]; //存没有被吃的小球int index =0;for(int i=0;i<smallBalls.length;i++){if(!eatens[i]){arr[index++] = smallBalls[i];}}balls = Arrays.copyOf(arr,index); //将没被吃的小球存在balls里面}public static void main(String[] args) {World w =new World();w.start();}}
球类Ball.java
package gzeu.test.date919;import java.awt.*;public class Ball {int R,G,B;double x,y,d,setx,sety;Color color;//构造方法:初始化参数public Ball(){d=Math.random()*40+60; //Math.random()*(最大值-最小值)+最小值;x=Math.random()*(800-d);y=Math.random()*(620-d);setx=Math.random()*2.5+1;sety=Math.random()*2.5+1;R=(int)(Math.random()*255);G=(int)(Math.random()*255);B=(int)(Math.random()*255);color = new Color(R,G,B);//随机的方向setx = Math.random()>0.5?setx:-setx;sety = Math.random()>0.5?sety:-sety;}//小球移动的方法public void move(){x=x+setx;y=y+sety;if(x>=800-d){setx=-setx;//x=x-s1;是不对的,s1变负值,x值变小,小球网回走x=800-d;}if(x<=0){setx=-setx;//s1为负值,-s1为正值,x值变大,小球网回走}if(y>=620-d){sety=-sety;y=620-d;}if(y<=0){sety=-sety;}}//绘制小球的方法public void paint(Graphics2D g){g.setColor(color);g.fillOval((int)x,(int)y,(int)d,(int)d);}//吃球的方法public boolean eat(Ball smallBall){double X=x,Y=y,D=d;//大球的属性double x=smallBall.x,y=smallBall.y,d=smallBall.d; //小球的属性double R=D/2,r=d/2;//判断当前大球的直径,如果小于小球的直径直接返回falseif(D<d){return false;}double a=X+D/2-(x+d/2),b=Y+D/2-(y+d/2),c=Math.sqrt(a*a+b*b);
// boolean eaten=c<(D/2-d/2);if(c<(D/2-d/2)){double area=Math.PI*R*R+Math.PI*r*r;R =Math.sqrt(area/Math.PI); //求新圆的半径this.d= R*2;}return c<(D/2-d/2);}
}
运行界面