用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.rhkb.cn/news/440731.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘自适应粒子滤波(Edge-Adaptive Particle Filter)的MATLAB函数示例,以及相应的讲解

目录 讲解 初始化 预测步骤 观测模拟 权重更新 重采样 状态估计 总结 下面是一个简单的边缘自适应粒子滤波&#xff08;&#xff09;的函数示例&#xff0c;以及相应的讲解。 程序源代码&#xff1a; function X_est edgeAdaptiveParticleFilter(numParticles, numS…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

在线Xpath匹配定位测试工具

具体请前往&#xff1a;在线Xpath-匹配-定位-调试/测试工具

一文看懂计算机中的大小端(Endianess)

文章目录 前言一、什么是大小端二、如何判断大小端三、大小端的转换3.1 使用标准库函数3.2 手动实现大小端转换 前言 本文主要探讨计算机中大小端的相关概念以及如何进行大小端的判断和转换等。 一、什么是大小端 大小端&#xff08;Endianess&#xff09;是指计算机系统在存…

【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录解决方案

【AI学习笔记】基于UnityDeepSeek开发的一些BUG记录&解决方案 背景前摇&#xff1a;&#xff08;省流可不看&#xff09; Unity是大学学的&#xff0c;AI是研究生学的&#xff0c;DeepSeek是第一份实习偷师的&#xff0c;三合一的梦是最近开始做的&#xff0c;BUG是今天遇…

【数据结构】什么是哈希表(散列表)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;哈希表的概念 &#x1f4cc;哈希函数的构造方法 &#x1f38f;直接定址法 &#x1f38f;除留余数法 &#x1f38f;平方取中法 &#x1f38f;折叠法 &#x…

Bolt.new:终极自动化编程工具

兄弟们&#xff0c;终极写代码工具来了—— Bolt.new&#xff01;全方位的编程支持&#xff1a; StackBlitz 推出了 Bolt․new&#xff0c;这是一款结合了 AI 与 WebContainers 技术的强大开发平台&#xff0c;允许用户快速搭建并开发各种类型的全栈应用。 它的主要特点是无需…

前端reactvue3——实现滚动到底加载数据

文章目录 ⭐前言⭐react 实现滚动加载⭐vue3 实现滚动加载⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端react&vue3——实现滚动加载&#xff08;到底部加载&#xff09; scrollTop 属性 一个双精度浮点值&#xff0c;表示元素当前从原点垂直…

安全运营中心 (SOC) 团队对其安全工具感到失望

Vectra AI 表示&#xff0c;安全运营中心 (SOC) 从业人员认为&#xff0c;由于太多孤立的工具和缺乏准确的攻击信号&#xff0c;他们在检测和确定真实威胁的优先级方面正在失败。 人们对供应商的不信任感日益加深&#xff0c;认为供应商的工具在发现真正的攻击方面起的阻碍作用…

ctfshow-web入门(信息收集,持续更新中。。)

写在之前:近期打了个比赛,备受打击,入手了vip账号进修,加油! 文章目录 ctfshow-web1查看源代码ctfshow-web2burp抓包ctfshow-web3burp抓包ctfshow-web4访问robots.txtctfshow-web5dirscarch扫描PHPS文件泄露ctfshow-web6dirscarch扫描ctfshow-web7dirscarch扫描ctfshow-w…

【STM32开发之寄存器版】(六)-通用定时器中断

一、前言 STM32定时器分类 STM32103ZET6具备8个定时器TIMx(x 1,2,...,8)。其中&#xff0c;TIM1和TIM8为高级定时器&#xff0c;TIM2-TIM6为通用定时器&#xff0c;TIM6和TIM7为基本定时器&#xff0c;本文将以TIM3通用定时器为例&#xff0c;分析STM32定时器工作的底层寄存器…

You must konw JS!!(超详细的javascript套餐,适合计算机专业有基础的,包含常见前端开发面试题)

1.起源 JavaScript 起源于 1995 年&#xff0c;当时它主要是为了满足网页交互的需求而被创建。它最初的设计目的是为了让网页开发者能够在网页中添加一些简单的交互效果和动态内容。在那个时期&#xff0c;网页大多是静态的&#xff0c;而 JavaScript 的出现为网页带来了新的活…

jmeter学习(7)beanshell

beanshell preprocessor 发送请求前执行 beanshell postprocessor 发送请求前执行 获取请求相关信息 String body sampler.getArguments().getArgument(0).getValue(); String url sampler.getPath(); 获取响应报文 String responseprev.getResponseDataAsString(); 获…

CMake 教程跟做与翻译

目录 STEP 1: 入门与理解 cmake_minimum_required设置CMake版本的最小值 project声明工程属性 add_executable添加可执行文件 使用CMake构建工程 根据自己的构建工具自行构建 Reference STEP 1: 入门与理解 我们起手的&#xff0c;最基本的 CMake 项目是从单个源代码文件…

【Blender Python】1.概述和基础使用

概述 众所周知&#xff0c;Blender是一款开源免费的3D建模软件&#xff08;当然不限于3D建模&#xff09;。在Blender中&#xff0c;可以使用其内置的Python解释器执行Python代码&#xff0c;用于程序化的生成网格以及其他内容。你可以基于此创建Blender插件。 这个系列就是快…

Electron桌面应用打包现有的vue项目

1 环境准备 Node&#xff1a;v16.20.2&#xff08;本地vue项目nodejs版本&#xff09;Electron&#xff1a;22.3.7vue&#xff1a;2 版本管理 2 Vue项目准备 更新相关依赖npm install --registry https://registry.npmmirror.com/npm run dev 3、引入Electorn 安装指定版…

算法剖析:双指针

文章目录 双指针算法一、 移动零1. 题目2. 算法思想3. 代码实现 二、 复写零1. 题目2. 算法思想3. 代码实现 三、 快乐数1. 题目2. 算法思想3. 代码实现 四、 盛水最多的容器1. 题目2. 算法思想3. 代码实现 五、有效三角形的个数1. 题目2. 算法思想3. 代码实现 六、 和为 s 的两…

UART驱动学习三(TTY驱动部分源码解析)

目录 全局框架图一、tty_io.c 分析1. 关键数据结构和定义2. 文件操作结构体3. 初始化和注册4. 读写操作5. 挂起和恢复6. 信号处理7. 设备类8. 控制台通知9. 辅助函数10. 代码功能11. 带有注释的部分tty_io.c源码 二、tty_ldisc.c 分析1. 关键数据结构和定义2. 行规程操作函数3.…

Android车载——VehicleHal运行流程(Android 11)

1 概述 本篇主要讲解VehicleHal的主要运行流程&#xff0c;包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。 2 获取属性流程 2.1 获取属性流程源码分析 作为服务注册到hwServiceManager中的类是VehicleHalManager&#xff0c;所以&#xff0c;CarServic…

判断是否为二叉排序树(二叉搜索树,二叉查找树)

1.判断给定的二叉树是否为二叉排序树&#xff0c;如果是返回1&#xff0c;不是返回0。 思想&#xff1a; 二叉树是左子树<根<右子树。中序遍历是递增有序&#xff0c;可以通过比较当前结点与前驱关系来进行判断。 代码&#xff1a; //pre为全局变量&#xff0c;保存当…