-
import java.awt.*;
-
import java.awt.event.*;
-
import javax.swing.*;
-
public class SnakeGame extends JFrame {
-
private static final int TILE_SIZE = 25;
-
private static final int GRID_WIDTH = 20;
-
private static final int GRID_HEIGHT = 20;
-
private Snake snake;
-
private Timer gameTimer;
-
public SnakeGame() {
-
snake = new Snake();
-
gameTimer = new Timer(200, new GameLoopListener());
-
setTitle("贪吃蛇");
-
setSize(GRID_WIDTH * TILE_SIZE, GRID_HEIGHT * TILE_SIZE);
-
setDefaultCloseOperation(EXIT_ON_CLOSE);
-
setResizable(false);
-
setVisible(true);
-
addKeyListener(new SnakeKeyListener());
-
startGame();
-
}
-
private void startGame() {
-
snake.initialize(GRID_WIDTH / 2, GRID_HEIGHT / 2);
-
gameTimer.start();
-
}
-
private void gameOver() {
-
gameTimer.stop();
-
JOptionPane.showMessageDialog(this, "游戏结束", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
-
startGame();
-
}
-
private void update() {
-
if (!snake.move()) {
-
gameOver();
-
}
-
}
-
private void draw(Graphics g) {
-
g.clearRect(0, 0, getWidth(), getHeight());
-
g.setColor(Color.GREEN);
-
for (Point point : snake.getBody()) {
-
g.fillRect(point.x * TILE_SIZE, point.y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
-
}
-
}
-
private class GameLoopListener implements ActionListener {
-
public void actionPerformed(ActionEvent e) {
-
update();
-
repaint();
-
}
-
}
-
private class SnakeKeyListener extends KeyAdapter {
-
public void keyPressed(KeyEvent e) {
-
int keyCode = e.getKeyCode();
-
if (keyCode == KeyEvent.VK_UP && snake.getDirection() != Snake.Direction.DOWN) {
-
snake.setDirection(Snake.Direction.UP);
-
} else if (keyCode == KeyEvent.VK_DOWN && snake.getDirection() != Snake.Direction.UP) {
-
snake.setDirection(Snake.Direction.DOWN);
-
} else if (keyCode == KeyEvent.VK_LEFT && snake.getDirection() != Snake.Direction.RIGHT) {
-
snake.setDirection(Snake.Direction.LEFT);
-
} else if (keyCode == KeyEvent.VK_RIGHT && snake.getDirection() != Snake.Direction.LEFT) {
-
snake.setDirection(Snake.Direction.RIGHT);
-
}
-
}
-
}
-
private class Snake {
-
private LinkedList<Point> body;
-
private Direction direction;
-
public Snake() {
-
body = new LinkedList<>();
-
direction = Direction.RIGHT;
-
}
-
public void initialize(int x, int y) {
-
body.clear();
-
body.add(new Point(x, y));
-
}
-
public LinkedList<Point> getBody() {
-
return body;
-
}
-
public Direction getDirection() {
-
return direction;
-
}
-
public void setDirection(Direction direction) {
-
this.direction = direction;
-
}
-
public boolean move() {
-
Point head = body.getFirst();
-
Point newHead;
-
switch (direction) {
-
case UP:
-
newHead = new Point(head.x, head.y - 1);
-
break;
-
case DOWN:
-
newHead = new Point(head.x, head.y + 1);
-
break;
-
case LEFT:
-
newHead = new Point(head.x - 1, head.y);
-
break;
-
case RIGHT:
-
newHead = new Point(head.x + 1, head.y);
-
break;
-
default:
-
return false;
-
}
-
if (newHead.x < 0 || newHead.x >= GRID_WIDTH || newHead.y < 0 || newHead.y >= GRID_HEIGHT
-
|| body.contains(newHead)) {
-
return false;
-
}
-
body.addFirst(newHead);
-
if (body.size() > 1 && !newHead.equals(food)) {
-
body.removeLast();
-
}
-
return true;
-
}
-
public enum Direction {
-
UP, DOWN, LEFT, RIGHT
-
}
-
}
-
public void paint(Graphics g) {
-
super.paint(g);
-
draw(g);
-
}
-
public static void main(String[] args) {
-
new SnakeGame();
-
}
-
}
这个示例使用了 Java 的 Swing 库来创建游戏界面,并提供了基本的贪吃蛇游戏功能。按下上、下、左或右箭头键来控制贪吃蛇的移动方向。
请注意,这只是一个简单的示例,可能还有很多可以改进和优化的地方。