高级开发简单游戏制作,期末项目答辩小组作业
资源内容介绍
期末项目答辩 import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Random;import java.util.logging.FileHandler;import java.util.logging.Level;import java.util.logging.Logger;import java.util.logging.SimpleFormatter;public class MainApp extends JPanel { private ArrayList<Students> students; private List<Explosion> explosions; private Professor professor; private BufferedImage splashImage; // splash.png 初始背景图片 private BufferedImage gameBackground; // grasses.gif 游戏背景图片 private Random random; private int score; private int timeLeft; private boolean showSplash; private boolean gameStarted; private Logger logger; public MainApp() { students = new ArrayList<>(); explosions = new ArrayList<>(); random = new Random(); score = 0; timeLeft = 60; showSplash = true; gameStarted = false; setupLogger(); try { splashImage = ImageIO.read(new File("splash.png")); // 初始背景图片 gameBackground = ImageIO.read(new File("grasses.gif")); // 游戏背景图片 } catch (IOException e) { e.printStackTrace(); } professor = new Professor("professor.png", 100, 100); setFocusable(true); requestFocusInWindow(); addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE) { if (showSplash) { showSplash = false; // 停止显示 splash.png repaint(); } else if (!gameStarted) { gameStarted = true; // 开始游戏 generateRandomStudents(); repaint(); } } else if (gameStarted) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: professor.moveUp(getHeight()); break; case KeyEvent.VK_DOWN: professor.moveDown(getHeight()); break; case KeyEvent.VK_LEFT: professor.moveLeft(getWidth()); break; case KeyEvent.VK_RIGHT: professor.moveRight(getWidth()); break; } repaint(); checkCollisions(); } } }); // 计时器,用于显示初始背景 3 秒后切换到 grasses.gif Timer splashTimer = new Timer(3000, e -> { if (showSplash) { showSplash = false; repaint(); } }); splashTimer.setRepeats(false); splashTimer.start(); new Timer(1000, e -> { if (gameStarted) { timeLeft--; if (timeLeft <= 0) { endGame(); } } repaint(); }).start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (showSplash) { g.drawImage(splashImage, 0, 0, getWidth(), getHeight(), null); // 显示初始背景 } else if (!gameStarted) { g.drawImage(gameBackground, 0, 0, getWidth(), getHeight(), null); // 显示游戏背景 g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.BOLD, 30)); g.drawString("Press SPACE to start the game", getWidth() / 4, getHeight() / 2); } else { g.drawImage(gameBackground, 0, 0, getWidth(), getHeight(), null); professor.draw(g); // 绘制教授 for (Students student : students) { student.draw(g); // 绘制学生 } for (Explosion explosion : explosions) { explosion.draw(g); // 绘制爆炸效果 } // 显示时间倒计时在左上方 g.setColor(Color.BLUE); g.fillRect(10, 10, 150, 30); g.setColor(Color.RED); g.drawString("Time: " + timeLeft, 20, 30); // 显示积分在右上方 g.setColor(Color.GREEN); g.fillRect(getWidth() - 160, 10, 150, 30); g.setColor(Color.BLACK); g.drawString("Score: " + score, getWidth() - 150, 30); } } private void generateRandomStudents() { students.clear(); int panelWidth = getWidth(); int panelHeight = getHeight(); if (panelWidth <= 0 || panelHeight <= 0) { System.err.println("Error: Invalid game window size."); return; } int studentType = random.nextInt(2); int x = random.nextInt(panelWidth - 64); int y = random.nextInt(panelHeight - 64); if (studentType == 0) { Student1 student1 = new Student1("student1.png", x, y); students.add(student1); } else { Student2 student2 = new Student2("student2.png", x, y); students.add(student2); } } private void checkCollisions() { Iterator<Students> iterator = students.iterator(); while (iterator.hasNext()) { Students student = iterator.next(); if (professor.getBounds().intersects(student.getBounds())) { handleCollision(student.getX(), student.getY()); iterator.remove(); score+=random.nextInt(9); } } if (students.isEmpty()) { generateRandomStudents(); } } private void handleCollision(int x, int y) { explosions.add(new Explosion("explosion.png", x, y)); Timer explosionTimer = new Timer(500, e -> explosions.remove(0)); explosionTimer.setRepeats(false); explosionTimer.start(); } private void endGame() { gameStarted = false; String message = "Game Over! Your score: " + score; int option = JOptionPane.showConfirmDialog(this, message + "\nDo you want to play again?", "Game Over", JOptionPane.YES_NO_OPTION); if (option == JOptionPane.YES_OPTION) { resetGame(); } else { System.exit(0); } } private void resetGame() { score = 0; timeLeft = 60; students.clear(); explosions.clear(); professor.setPosition(100, 100); showSplash = true; gameStarted = false; repaint(); // 重启初始背景计时器 Timer splashTimer = new Timer(3000, e -> { if (showSplash) { showSplash = false; repaint(); } }); splashTimer.setRepeats(false); splashTimer.start(); } private void setupLogger() { logger = Logger.getLogger("GameLogger"); try { FileHandler fileHandler = new FileHandler("game_log.html"); fileHandler.setFormatter(new SimpleFormatter()); logger.addHandler(fileHandler); } catch (IOException e) { e.printStackTrace(); } logger.setLevel(Level.INFO); } public static void main(String[] args) { JFrame frame = new JFrame("Zhu Haoyuan-20232099 and Zhou Sian-20232036"); Mai