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

用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;//判断当前大球的直径,如果小于小球的直径直接返回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);}
}

运行界面


http://www.mrgr.cn/news/44908.html

相关文章:

  • Java基础语法
  • 【MySQL】使用 JDBC 连接数据库
  • C语言的类型提升机制
  • Arduino UNO R3自学笔记22 之 Arduino电机的闭环控制(PID)
  • macos php开发环境之macport安装的php扩展安装,php常用扩展安装,port中可用的所有php扩展列表
  • 【可答疑】基于51单片机的倒车雷达测距(含仿真、代码、报告、演示视频等)
  • js操作元素的其他操作(4个案例+效果图+代码)
  • Chrome浏览器调用ActiveX控件--allWebOffice控件
  • OJ在线评测系统 微服务 用分布式消息队列 RabbitMQ 解耦判题服务和题目服务 手搓交换机和队列 实现项目异步化
  • 大厂面试真题:说一说CMS和G1
  • Docker 部署 Redis 监控系统实战:Redis Exporter 与 Prometheus 完整配置指南
  • Python爬取b站视频:验证cookie是否有效
  • 今日指数day8实战补充(上)
  • React学习01 jsx、组件与组件的三大属性
  • 【操作系统】虚拟机
  • 鸿蒙next开启地图服务
  • 从被动防御到主动防护:等保测评的转型探索与实践
  • DNS 反向解析导致 ssh 连接缓慢
  • 【Docker】04-Docker部署Java后端
  • 【判断推理】逻辑基础