当前位置: 首页 > article >正文

用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);
    }
}

运行界面


http://www.kler.cn/news/336838.html

相关文章:

  • 4. Getter和Setter注解与lombok
  • 计算机毕业设计hadoop+spark天气预测 天气可视化 天气大数据 空气质量检测 空气质量分析 气象大数据 气象分析 大数据毕业设计 大数据毕设
  • zy91_C#中StringBuilder类以及char类
  • 虚拟机ip突然看不了了
  • 跨平台游戏的特点
  • 地图箭头方向检测系统源码分享
  • SM2无证书及隐式证书公钥机制签名和加密过程详解(二)
  • 上传文件失败,请检查阿里云配置信息:[The specified bucket is not valid.
  • 【力扣 | SQL题 | 每日四题】力扣1571, 1715, 1699, 1445, 1495, 1683
  • Spring Cloud Netflix Ribbon 负载均衡详解和案例示范
  • SQLCMD命令行工具导入数据并生成对应的日志文件
  • VGG16模型实现MNIST图像分类
  • 【Docker】04-Docker部署Java后端
  • 【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers
  • Linux ssh 免密登录配置
  • 算法与数据结构--二分查找
  • Redis篇(最佳实践)(持续更新迭代)
  • Android Framework(八)WMS-窗口动效概述
  • 单链表基本操作(2)
  • BI小白速成课:免费!零基础入门,数据分析新手也能快速上手!