贪吃蛇游戏需要做两点:图形界面和游戏逻辑。在 Java 中,可以使用 Swing 或 JavaFX 来创建图形界面。下面代码创建了一个简单的 Swing 窗口,实现了一个基本的贪吃蛇游戏。在游戏中,使用方向键控制贪吃蛇的移动,吃到食物会增加蛇的长度,如果蛇撞到墙壁或者自己的身体,则游戏结束。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;public class SnakeGame extends JFrame implements ActionListener, KeyListener {private ArrayList<Point> snake;private Point fruit;private Timer timer;private int direction;private boolean gameOver;public SnakeGame() {setTitle("贪吃蛇游戏");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400, 400);setLocationRelativeTo(null);snake = new ArrayList<>();snake.add(new Point(10, 10));fruit = new Point(5, 5);direction = KeyEvent.VK_RIGHT;gameOver = false;timer = new Timer(100, this);timer.start();addKeyListener(this);setFocusable(true);setFocusTraversalKeysEnabled(false);setVisible(true);}public void actionPerformed(ActionEvent e) {if (!gameOver) {move();checkCollision();checkFruit();repaint();}}public void paint(Graphics g) {super.paint(g);if (!gameOver) {g.setColor(Color.RED);g.fillRect(fruit.x * 20, fruit.y * 20, 20, 20);g.setColor(Color.GREEN);for (Point point : snake) {g.fillRect(point.x * 20, point.y * 20, 20, 20);}} else {g.setColor(Color.BLACK);g.setFont(new Font("Arial", Font.BOLD, 30));g.drawString("游戏结束", 130, 200);}}public void move() {for (int i = snake.size() - 1; i > 0; i--) {snake.get(i).x = snake.get(i - 1).x;snake.get(i).y = snake.get(i - 1).y;}switch (direction) {case KeyEvent.VK_UP:snake.get(0).y--;break;case KeyEvent.VK_DOWN:snake.get(0).y++;break;case KeyEvent.VK_LEFT:snake.get(0).x--;break;case KeyEvent.VK_RIGHT:snake.get(0).x++;break;}}public void checkCollision() {Point head = snake.get(0);if (head.x < 0 || head.x >= 20 || head.y < 0 || head.y >= 20) {gameOver = true;timer.stop();}for (int i = 1; i < snake.size(); i++) {if (head.x == snake.get(i).x && head.y == snake.get(i).y) {gameOver = true;timer.stop();break;}}}public void checkFruit() {Point head = snake.get(0);if (head.x == fruit.x && head.y == fruit.y) {snake.add(new Point(snake.get(snake.size() - 1)));generateFruit();}}public void generateFruit() {Random random = new Random();boolean validFruit = false;while (!validFruit) {int x = random.nextInt(20);int y = random.nextInt(20);fruit = new Point(x, y);boolean collision = false;for (Point point : snake) {if (fruit.x == point.x && fruit.y == point.y) {collision = true;break;}}if (!collision) {validFruit = true;}}}public void keyPressed(KeyEvent e) {int key = e.getKeyCode();if ((key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN) &&(key + direction) % 2 != 0) {direction = key;}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}public static void main(String[] args) {new SnakeGame();}
}