该界面模拟了一个简单的“吃球”游戏,一开始多个球在屏幕上移动,并检查每个大球是否可以吃掉其他小球,且更新状态,删除已经被吃掉的小球。通过图形绘制和逻辑处理实现了游戏的基本功能。
主界面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;
//判断当前大球的直径,如果小于小球的直径直接返回false
if(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);
}
}
运行界面