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

news2024/11/24 22:36:05

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

主界面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.coloradmin.cn/o/2195486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue基础练习|ref

<script setup> import {ref} from "vue" const msgref("Hello Vue") </script> <template><div><h1>{{msg}}</h1><input v-model"msg"></div> </template>

家庭网络中,路由器和交换机的连接顺序

家庭网络中路由器和交换机的先后连接顺序 是由你的用网需求决定&#xff01; 光纤入户首先连接的肯定是光猫&#xff0c;而在光猫的后面&#xff0c;是先连接交换机&#xff1f;还是应该接路由器呢&#xff1f; 答案是&#xff1a;都可以 情况一&#xff1a;先连交换机&…

Nuxt.js 应用中的 app:mounted 钩子详解

title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: app:mounted 钩子在 Vue 应用的生命周期中扮演着重要角色,提供了在组件被挂载后的执行时机。通过合理利用这个钩子,我们能够提高组件的交互性、用户体验以及…

使用bert模型进行命名实体识别任务

一、实验内容 本实验使用预训练的 BERT 模型进行命名实体识别&#xff08;NER&#xff09;任务&#xff0c;并且使用 Hugging Face 的 Transformers 库完成模型的训练、验证和测试。最后&#xff0c;使用测试集评估模型性能&#xff0c;计算NER指标。 二、算法介绍 Bert是一种…

Oracle 11g RAC 节点异常重启问题分析

一、背景 在国庆期间巡检的时候&#xff0c;发现数据库alert日志中出现了异常重启的信息&#xff0c;当即对该报错进行分析处理。 二、处理过程 &#xff08;1&#xff09;数据库告警日志分析 node1 alert&#xff1a; Sat Oct 05 13:05:14 2024 Thread 1 advanced to log …

前端模块化进化史:从全局 function 到 ES Modules

目前&#xff0c;前端开发已经离不开由 CommonJS、ES Modules 和 Webpack 构建的模块化开发环境。无论是 JavaScript、CSS、图片还是其他资源&#xff0c;都可以作为一个模块来处理。那么&#xff0c;模块化究竟是如何发展到今天的呢&#xff1f; 全局函数模式 最初的前端模块…

C# 属性和方法

本课要点&#xff1a; 1、属性的使用 2、方法的使用 一 数据安全问题 示例 static void Main(string[] args) {Student stu new Student();stu.age -2; }二 属性 private int age; //年龄 public int Age {get { return age; }set{if (value > 0 && value <…

JavaEE: 深入解析HTTP协议的奥秘(2)

文章目录 HTTP认识 URLURL encode 介绍 认识 "方法"(method)GETPOST其他方法 HTTP JavaEE: 深入解析HTTP协议的奥秘(1) 书接上文~ 认识 URL 平时我们俗称的"网址"其实就是说的 URL .(唯一资源定位符) URL 不是 HTTP 专属的,很多协议都会用到. 其实除了 …

软考-程序设计语言基础

一、程序设计语言概述 (一)程序设计语言的基本概念 1. 程序设计语言的目的 为了书写计算机程序而人为设计的符号语言&#xff0c;用于对计算过程进行描述、组织和推导。 2.低级语言 机器语言&#xff1a; 机器语言是计算机最原始的语言&#xff0c;由0和1的代码构成 计算机…

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

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

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…

助动词的分类及其缩略形式

助动词的分类及其缩略形式 1. 助动词 (auxiliary verb)2. 基本助动词 (primary auxiliary)2.1. 基本助动词 be、do 和 have2.2. 实义动词 be、do 和 have 3. 情态助动词 (modal auxiliary)3.1. 情态助动词取代情态动词 4. 半助动词 (semi-auxiliary)4.1. 不能与 it ... that-cl…

MoveIt2-humble----Planning Around Objects(a)

4.Pick and Place with MoveIt Task Constructor 本节教程会教你创建一个功能包&#xff0c;使用MoveIt Task Constructor规划一个抓取和放置的操作。MoveIt Task Constructor 提供了一种方式&#xff0c;去规划由多种不同子任务&#xff08;也称为阶段&#xff09;所组成的任…

详解Redis分布式锁在SpringBoot的@Async方法中没锁住的坑

背景 Redis分布式锁很有用处&#xff0c;在秒杀、抢购、订单、限流特别是一些用到异步分布式并行处理任务时频繁的用到&#xff0c;可以说它是一个BS架构的应用中最高频使用的技术之一。 但是我们经常会碰到这样的一个问题&#xff0c;那就是我们都按照标准做了但有时运行着、…

分层解耦-05.IOCDI-DI详解

一.依赖注入的注解 在我们的项目中&#xff0c;EmpService的实现类有两个&#xff0c;分别是EmpServiceA和EmpServiceB。这两个实现类都加上Service注解。我们运行程序&#xff0c;就会报错。 这是因为我们依赖注入的注解Autowired默认是按照类型来寻找bean对象的进行依赖注入…

基于Qt的速度仪表盘控件实现

本文将详细讲解一个基于Qt的速度仪表盘控件的实现过程&#xff0c;并对代码进行详细的注释说明。该控件可以模拟汽车仪表盘的外观&#xff0c;并通过滑动条动态改变速度显示。本文将从代码结构、绘制组件到实现细节进行讲解&#xff0c;帮助您理解如何使用Qt框架自定义绘制控件…

CSRF | GET 型 CSRF 漏洞攻击

关注这个漏洞的其他相关笔记&#xff1a;CSRF 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;GET 型 CSRF 漏洞攻击 —— 理论篇 GET 型 CSRF 漏洞是指攻击者通过构造恶意的 HTTP GET 请求&#xff0c;利用用户的登录状态&#xff0c;在用户不知情的情况下&#xff0c;诱使浏览器…

Cortex-M3/M4/M7 芯片 Fault 分析原理与实战

目录 一、简介1、异常类型2、异常优先级3、同步异步问题4、异常具体类型 二、Fault exception registers1、Control registers1.1 CCR1.2 SHP1.3 SHCSR 2、Status and address registers2.1 HardFault Status Register——HSFR2.2 Configurable Fault Status Register——CFSR2…

《Linux从小白到高手》进阶实操篇:用户及权限有关的实际工作场景应用

List item 本篇为《Linux从小白到高手》进阶实操篇的第一篇&#xff0c;主要介绍分享一些用户及权限有关的实际工作场景应用。 场景1&#xff1a; 实际工作中你一定会碰到如下图所示的情景&#xff1a;本部门有5个组&#xff0c;分别为&#xff1a;①Root组&#xff1a;用户…

Python中对象obj类型确定最pythonic的方式——isinstance()函数

python中确定对象obj的类型&#xff0c;isinstance函数最是优雅&#xff0c;type、issubclass等函数也可以&#xff0c;但终究“曲折”。 (笔记模板由python脚本于2024年10月07日 19:42:38创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…