package com.yzk.springbootshiro;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SnakeGame extends JFrame {
private int screenWidth = 800;
private int screenHeight = 600;
private int blockSize = 20;
private int delay = 200;
private int snakeSize = 3;
private int score = 0;
private int level = 1;
private int[] snakeX;
private int[] snakeY;
private int foodX;
private int foodY;
private boolean gameOver = false;
private boolean paused = false;
private Direction direction = Direction.RIGHT;
private Timer timer;
public SnakeGame() {
setTitle("贪吃蛇游戏");
setSize(screenWidth, screenHeight);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
snakeX = new int[screenWidth * screenHeight / (blockSize * blockSize)];
snakeY = new int[screenWidth * screenHeight / (blockSize * blockSize)];
initGame();
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP && direction != Direction.DOWN) {
direction = Direction.UP;
} else if (key == KeyEvent.VK_DOWN && direction != Direction.UP) {
direction = Direction.DOWN;
} else if (key == KeyEvent.VK_LEFT && direction != Direction.RIGHT) {
direction = Direction.LEFT;
} else if (key == KeyEvent.VK_RIGHT && direction != Direction.LEFT) {
direction = Direction.RIGHT;
} else if (key == KeyEvent.VK_SPACE) {
togglePause();
} else if (key == KeyEvent.VK_PLUS || key == KeyEvent.VK_ADD) {
increaseSpeed();
} else if (key == KeyEvent.VK_MINUS || key == KeyEvent.VK_SUBTRACT) {
decreaseSpeed();
}
}
});
createMenu();
timer = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!gameOver && !paused) {
move();
checkCollision();
repaint();
}
}
});
setVisible(true);
timer.start();
}
private void initGame() {
score = 0;
snakeSize = 3;
gameOver = false;
paused = false;
direction = Direction.RIGHT;
delay = 200;
level = 1;
// Initialize the snake position
for (int i = 0; i < snakeSize; i++) {
snakeX[i] = (screenWidth / 2) - i * blockSize;
snakeY[i] = screenHeight / 2;
}
// Place the food randomly
generateFood();
}
private void move() {
// Move the body of the snake
for (int i = snakeSize - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
// Move the head of the snake
if (direction == Direction.UP) {
snakeY[0] -= blockSize;
} else if (direction == Direction.DOWN) {
snakeY[0] += blockSize;
} else if (direction == Direction.LEFT) {
snakeX[0] -= blockSize;
} else if (direction == Direction.RIGHT) {
snakeX[0] += blockSize;
}
}
private void checkCollision() {
// Check if the snake hits the boundary
if (snakeX[0] < 0 || snakeX[0] >= screenWidth || snakeY[0] < 0 || snakeY[0] >= screenHeight) {
gameOver = true;
}
// Check if the snake hits itself
for (int i = 1; i < snakeSize; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
gameOver = true;
break;
}
}
// Check if the snake eats the food
if (snakeX[0] == foodX && snakeY[0] == foodY) {
score++;
snakeSize++;
generateFood();
if (score % 5 == 0) {
level++;
increaseSpeed();
}
}
}
private void generateFood() {
int maxX = (screenWidth / blockSize) - 1;
int maxY = (screenHeight / blockSize) - 1;
foodX = (int) (Math.random() * maxX) * blockSize;
foodY = (int) (Math.random() * maxY) * blockSize;
}
private void togglePause() {
paused = !paused;
if (paused) {
timer.stop();
} else {
timer.start();
}
}
private void increaseSpeed() {
if (delay > 50) {
delay -= 50;
timer.setDelay(delay);
}
}
private void decreaseSpeed() {
if (delay < 500) {
delay += 50;
timer.setDelay(delay);
}
}
private void createMenu() {
JMenuBar menuBar = new JMenuBar();
JMenu gameMenu = new JMenu("游戏");
JMenuItem newGameMenuItem = new JMenuItem("新游戏");
newGameMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
initGame();
timer.start();
}
});
gameMenu.add(newGameMenuItem);
JMenuItem pauseMenuItem = new JMenuItem("暂停");
pauseMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
togglePause();
}
});
gameMenu.add(pauseMenuItem);
JMenuItem quitMenuItem = new JMenuItem("退出");
quitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
gameMenu.add(quitMenuItem);
JMenu settingsMenu = new JMenu("设置");
JMenuItem increaseSpeedMenuItem = new JMenuItem("加速");
increaseSpeedMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
increaseSpeed();
}
});
settingsMenu.add(increaseSpeedMenuItem);
JMenuItem decreaseSpeedMenuItem = new JMenuItem("减速");
decreaseSpeedMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
decreaseSpeed();
}
});
settingsMenu.add(decreaseSpeedMenuItem);
menuBar.add(gameMenu);
menuBar.add(settingsMenu);
setJMenuBar(menuBar);
}
@Override
public void paint(Graphics g) {
super.paint(g);
if (gameOver) {
g.setColor(Color.RED);
g.setFont(new Font("Arial", Font.BOLD, 40));
g.drawString("游戏结束", screenWidth / 2 - 100, screenHeight / 2);
} else {
// Draw the snake
g.setColor(Color.GREEN);
for (int i = 0; i < snakeSize; i++) {
g.fillRect(snakeX[i], snakeY[i], blockSize, blockSize);
}
// Draw the food
g.setColor(Color.RED);
g.fillRect(foodX, foodY, blockSize, blockSize);
// Draw the score and level
g.setColor(Color.WHITE);
g.setFont(new Font("Arial", Font.PLAIN, 20));
g.drawString("得分: " + score, 10, 20);
g.drawString("等级: " + level, 10, 40);
}
}
public static void main(String[] args) {
new SnakeGame();
}
}
enum Direction {
UP,
DOWN,
LEFT,
RIGHT
}