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