自学内容网 自学内容网

用java做一个简易版球球大作战

该界面模拟了一个简单的“吃球”游戏,一开始多个球在屏幕上移动,并检查每个大球是否可以吃掉其他小球,且更新状态,删除已经被吃掉的小球。通过图形绘制和逻辑处理实现了游戏的基本功能。

主界面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);
    }
}

运行界面


原文地址:https://blog.csdn.net/qq_68383591/article/details/142746644

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!