diff --git a/src/GameController.java b/src/GameController.java new file mode 100644 index 0000000..a4cab82 --- /dev/null +++ b/src/GameController.java @@ -0,0 +1,111 @@ +package com.snakegame; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class GameController implements ActionListener { + private final Timer timer; + private final GamePanel panel; + private boolean isPaused = false; + + public GameController(GamePanel panel) { + this.panel = panel; + this.timer = new Timer(panel.getConfig().getSpeed(), this); + } + + public void start() { + timer.start(); + } + + public void pause() { + isPaused = !isPaused; + if (isPaused) { + timer.stop(); + } else { + timer.start(); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + if (!isPaused) { + gameLoop(); + } + } + + private void gameLoop() { + Snake snake1 = panel.getSnake1(); + Snake snake2 = panel.getSnake2(); + Food food = panel.getFood(); + GameConfig config = panel.getConfig(); + + // 移动蛇 + snake1.move(); + if (config.getGameMode().equals("双人")) { + snake2.move(); + } + + // 碰撞检测 + Point head1 = snake1.getHead(); + if (CollisionUtils.checkWallCollision(head1, config) || + snake1.getBody().subList(1, snake1.getBody().size()).contains(head1) || + (config.getGameMode().equals("双人") && snake2.getBody().contains(head1))) { + gameOver(); + return; + } + + if (config.getGameMode().equals("双人")) { + Point head2 = snake2.getHead(); + if (CollisionUtils.checkWallCollision(head2, config) || + snake2.getBody().subList(1, snake2.getBody().size()).contains(head2) || + snake1.getBody().contains(head2)) { + gameOver(); + return; + } + } + + // 食物检测 + if (head1.equals(food.getPosition())) { + snake1.grow(); + panel.increaseScore1(); + food.respawn(); + } + + if (config.getGameMode().equals("双人")) { + Point head2 = snake2.getHead(); + if (head2.equals(food.getPosition())) { + snake2.grow(); + panel.increaseScore2(); + food.respawn(); + } + } + + panel.repaint(); + } + + private void gameOver() { + timer.stop(); + String message; + if (panel.getConfig().getGameMode().equals("单人")) { + message = "得分: " + panel.getScore1(); + } else { + message = "得分: 蛇1 - " + panel.getScore1() + ", 蛇2 - " + panel.getScore2(); + } + Object[] options = {"继续", "退出"}; + int result = JOptionPane.showOptionDialog(panel, + message, + "游戏结束", + JOptionPane.DEFAULT_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + options, + options[1]); + if (result == 0) { + Main.showSettingsFrame(); + } else { + System.exit(0); + } + } +} \ No newline at end of file