代码编织梦想

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
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51114682/article/details/131025405