高级开发简单游戏制作,期末项目答辩小组作业
立即下载
资源介绍:
期末项目答辩
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;
private List 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 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