parent
5dfb1bb841
commit
622094e4a9
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue