貪吃蛇游戲需要做兩點:圖形界面和游戲邏輯。在 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();}
}