球球大作战 JAVA项目

📅 2026/7/11 8:26:23 👁️ 阅读次数 📝 编程学习
球球大作战 JAVA项目

UI类 GameUI

​ import javax.swing.*; import java.awt.*; import java.util.ArrayList; public class GameUI { ArrayList<Player> playerList = new ArrayList<>(); GameListener gameListener = new GameListener(); KeyBoardListener keyBoardListener = new KeyBoardListener(); Player hero; JFrame jf = new JFrame("球球大作战"); public GameUI() { jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500, 800); jf.setLocationRelativeTo(null); jf.setVisible(true); jf.addMouseListener(gameListener); jf.addMouseMotionListener(gameListener); gameListener.gameUI = this; jf.addKeyListener(keyBoardListener); keyBoardListener.gameUI = this; hero = new Player(225, 375, 50, 0, 0, new Color(255, 0, 218)); GameLoop gameLoop = new GameLoop(this); gameLoop.start(); } public static void main(String[] args) { new GameUI(); } } ​

采用传统UI构造方法,并创建玩家类hero,用start开始线程

游戏监听类 Gamelitener

import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.Random; public class GameListener implements MouseListener, MouseMotionListener { GameUI gameUI; @Override public void mouseDragged(MouseEvent e) { int x = e.getX(); int y = e.getY(); } @Override public void mousePressed(MouseEvent e) { Random random = new Random(); int x = e.getX(); int y = e.getY(); int size = random.nextInt(40) + 30; int speedx = random.nextInt(5) - 2; int speedy = random.nextInt(5) - 2; Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); Player player = new Player(x, y, size, speedx, speedy, color); gameUI.playerList.add(player); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { } }

监听类继承mouselistener和mousemotionlistener两类,重写鼠标点击方法,当鼠标按下时,随机生成不同大小颜色速度的小球,并加入动态列表

键盘监听类 KeyBoardListener

import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyBoardListener implements KeyListener { GameUI gameUI; // 四个方向标记 public boolean up, down, left, right; @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_UP: up = true; break; case KeyEvent.VK_DOWN: down = true; break; case KeyEvent.VK_LEFT: left = true; break; case KeyEvent.VK_RIGHT: right = true; break; } } @Override public void keyReleased(KeyEvent e) { int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_UP: up = false; break; case KeyEvent.VK_DOWN: down = false; break; case KeyEvent.VK_LEFT: left = false; break; case KeyEvent.VK_RIGHT: right = false; break; } } @Override public void keyTyped(KeyEvent e) { } }

继承keylistener,监听键盘动作,通过上下左右四个按键移动玩家小球移动

玩家类 Player

import java.awt.*; import java.util.ArrayList; public class Player { private int x, y, size; private int speedx; private int speedy; private Color color; public Player(int x, int y, int size, int speedx, int speedy, Color color) { this.x = x; this.y = y; this.size = size; this.speedx = speedx; this.speedy = speedy; this.color = color; } // 绘制方法 public void draw(Graphics g) { g.setColor(color); g.fillOval(x, y, size, size); } // 移动方法 public void move() { if (x < 0 || x > 500 - size) { speedx = -speedx; } if (y < 0 || y > 800 - size) { speedy = -speedy; } x += speedx; y += speedy; } // 获取圆心X public int getCenterX(){ return this.x + size / 2; } // 获取圆心Y public int getCenterY(){ return this.y + size / 2; } // 获取半径 public double getRadius(){ return size / 2.0; } // 碰撞检测 public void hit(ArrayList<Player> playerList) { int index = playerList.indexOf(this); for (int i = index + 1; i < playerList.size(); i++) { Player otPlayer = playerList.get(i); double dx = otPlayer.getCenterX() - this.getCenterX(); double dy = otPlayer.getCenterY() - this.getCenterY(); double dist = Math.sqrt(dx * dx + dy * dy); double sumRadius = this.getRadius() + otPlayer.getRadius(); if (dist < sumRadius) { double overlap = sumRadius - dist; // 单位法线向量 double nx = dx / dist; double ny = dy / dist; this.x -= overlap * nx / 2; this.y -= overlap * ny / 2; otPlayer.x += overlap * nx / 2; otPlayer.y += overlap * ny / 2; int tempSpeedx = speedx; int tempSpeedy = speedy; speedx = otPlayer.getSpeedx(); speedy = otPlayer.getSpeedy(); otPlayer.setSpeedx(tempSpeedx); otPlayer.setSpeedy(tempSpeedy); } } } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getSpeedx() { return speedx; } public void setSpeedx(int speedx) { this.speedx = speedx; } public int getSpeedy() { return speedy; } public void setSpeedy(int speedy) { this.speedy = speedy; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } }

绘制与移动小球,创建列表playlist储存小球信息并判断是否碰撞,碰撞后速度交换

游戏循环线程 GameLoop

import java.awt.*; import java.util.ArrayList; public class GameLoop extends Thread{ private GameUI gameUI; private GameListener gameListener; private KeyBoardListener keyBoardListener; private ArrayList<Player> playerList; private Graphics g; private final int playerSpeed = 5; public GameLoop(GameUI gameUI) { this.gameUI = gameUI; gameListener = gameUI.gameListener; playerList = gameUI.playerList; keyBoardListener = gameUI.keyBoardListener; g=gameUI.jf.getGraphics(); } @Override public void run() { while(true){ try { Thread.sleep(30); } catch (InterruptedException e) { throw new RuntimeException(e); } g.clearRect(0,0,500,800); Player hero = gameUI.hero; // 重置临时速度 int dx = 0; int dy = 0; if(keyBoardListener.up) dy -= playerSpeed; if(keyBoardListener.down) dy += playerSpeed; if(keyBoardListener.left) dx -= playerSpeed; if(keyBoardListener.right) dx += playerSpeed; hero.setX(hero.getX() + dx); hero.setY(hero.getY() + dy); int w = 500, h = 800; int size = hero.getSize(); if(hero.getX() < 0) hero.setX(0); if(hero.getX() > w - size) hero.setX(w - size); if(hero.getY() < 0) hero.setY(0); if(hero.getY() > h - size) hero.setY(h - size); hero.hit(playerList); for (int i = 0; i < playerList.size(); i++) { Player player = playerList.get(i); player.draw(g); player.move(); player.hit(playerList); } hero.draw(g); } } public GameListener getGameListener() { return gameListener; } public GameUI getGameUI() { return gameUI; } }

继承thread类,重写run方法,实现控制玩家小球并参与碰撞