)
Java球球大作战线程版一、项目概述项目是基于 Swing 图形化编程 Thread 多线程实现简易球球大作战。核心功能包括鼠标点击生成随机大小、随机速度、随机颜色的小球小球碰到窗体边界自动反弹鼠标拖动可控制第一个小球的移动方向独立线程承载游戏主循环持续刷新画面与角色状态核心技术栈Swing 窗体开发、Graphics 绘图、Thread 多线程、鼠标事件监听、ArrayList 集合二、实体类Ball每个小球都是一个 Ball 对象统一管理坐标、大小、速度、颜色等状态对外提供绘制、移动两个核心方法。对应代码packagecom07.game;importjava.awt.*;publicclassBall{// 核心属性intx,y,size;// 坐标、大小doublespeedX,speedY;// 横向、纵向速度Colorcolor;// 颜色booleanisLife;// 生命状态// 构造方法初始化小球属性publicBall(intx,inty,intsize,doublespeedX,doublespeedY,Colorcolor){this.xx;this.yy;this.sizesize;this.speedXspeedX;this.speedYspeedY;this.colorcolor;this.isLifetrue;}// 行为1绘制小球publicvoiddraw(Graphicsg){g.setColor(color);g.fillOval(x,y,size,size);}// 行为2移动 边界碰撞反弹publicvoidmove(){// 左右边界检测横向速度反向if(x0||x800-size){speedX-speedX;}// 上下边界检测纵向速度反向if(y0||y800-size){speedY-speedY;}// 更新坐标xspeedX;yspeedY;}}三、窗体类GameUI游戏主界面Swing 窗体是游戏的展示窗体负责界面初始化 、界面展示、监听器绑定ArrayList动态管理所有小球对象支持实时增删对应代码packagecom07.game;importjavax.swing.*;importjava.awt.*;importjava.util.ArrayList;publicclassGameUIextendsJFrame{// 存储所有小球的集合ArrayListBallballsnewArrayList();// 鼠标事件监听器GameListenerglnewGameListener();// 构造方法初始化窗体publicGameUI(){setTitle(球球大作战);setSize(800,800);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);// 给监听器传入小球集合实现数据互通gl.ballsthis.balls;// 绑定鼠标点击、拖动事件addMouseListener(gl);addMouseMotionListener(gl);// 获取画笔启动游戏主循环线程GraphicsggetGraphics();GameLoopgameLoopnewGameLoop(balls,g);gameLoop.start();}publicstaticvoidmain(String[]args){newGameUI();}}四、线程类GameLoop继承Thread类重写run()方法编写循环逻辑Thread.sleep(30)控制画面刷新频率约 33 帧 / 秒数值越小画面越流畅固定循环流程绘制背景清屏→ 遍历所有角色 → 绘制角色 → 更新角色状态对应代码packagecom07.game;importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;publicclassGameLoopextendsThread{ArrayListBallballs;Graphicsg;// 背景图片路径需替换为本地实际路径StringimgPathC:\\Users\\ZLYLF\\Desktop\\bg.png;// 构造方法接收小球集合和画笔对象publicGameLoop(ArrayListBallballs,Graphicsg){this.ballsballs;this.gg;}Overridepublicvoidrun(){// 加载背景图片BufferedImagebgImgnull;try{bgImgImageIO.read(newFile(imgPath));}catch(IOExceptione){thrownewRuntimeException(e);}// 游戏主死循环持续刷新画面while(true){try{// 控制刷新间隔单位毫秒Thread.sleep(30);}catch(InterruptedExceptione){thrownewRuntimeException(e);}// 绘制背景覆盖上一帧画面相当于清屏g.drawImage(bgImg,0,0,800,800,null);// 遍历所有小球依次执行绘制和移动for(inti0;iballs.size();i){Ballballballs.get(i);ball.draw(g);ball.move();}}}}五、监听类GameListener鼠标交互通过MouseAdapter实现鼠标事件监听是用户和游戏交互的入口。mousePressed鼠标按下时生成随机属性的小球加入集合mouseDragged鼠标拖动时根据偏移方向修改第一个小球的速度方向对应代码packagecom07.game;importjava.awt.*;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.ArrayList;importjava.util.Random;publicclassGameListenerextendsMouseAdapter{ArrayListBallballs;RandomrandnewRandom();// 记录上一次鼠标的坐标intpreX,preY;// 鼠标按下事件生成新小球OverridepublicvoidmousePressed(MouseEvente){preXe.getX();preYe.getY();// 随机生成大小、速度、颜色intsizerand.nextInt(60)20;doublexSpeedrand.nextInt(5)1;doubleySpeedrand.nextInt(5)1;ColorcolornewColor(rand.nextInt(Integer.MAX_VALUE));// 创建球对象并加入集合BallballnewBall(e.getX(),e.getY(),size,xSpeed,ySpeed,color);balls.add(ball);}// 鼠标拖动事件控制第一个小球的移动方向OverridepublicvoidmouseDragged(MouseEvente){// 集合为空时不执行操作if(balls.size()0){return;}BallcontrolBallballs.get(0);// 计算鼠标偏移量intdxe.getX()-preX;intdye.getY()-preY;// 根据横向偏移修改速度方向if(dx0){// 向左拖动if(controlBall.speedX0){controlBall.speedX-controlBall.speedX;}elseif(controlBall.speedX0){controlBall.speedX-3;}}if(dx0){// 向右拖动if(controlBall.speedX0){controlBall.speedX-controlBall.speedX;}elseif(controlBall.speedX0){controlBall.speedX3;}}// 更新上一次鼠标坐标preXe.getX();preYe.getY();}}六、运行流程与拓展方向完整运行流程执行main方法创建GameUI窗体窗体初始化时创建小球集合、绑定监听器、启动GameLoop线程线程持续循环休眠 30ms → 绘制背景 → 遍历所有球并执行绘制、移动用户点击鼠标 → 生成新球加入集合 → 线程自动渲染新球用户拖动鼠标 → 修改第一个球的速度方向 → 球改变移动轨迹可拓展功能实现球与球之间的碰撞检测新增键盘监听通过方向键控制小球移动后续可增加吃小球、积分系统、躲避障碍、特效等玩法内容