java写贪吃蛇代码

java
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 KeyListener, ActionListener { private final int blockSize = 20; private final int width = 30; private final int height = 20; private ArrayList<Point> snake = new ArrayList<>(); private Point food; private int direction = KeyEvent.VK_RIGHT; private Timer timer; public SnakeGame() { setTitle("Snake Game"); setSize(width * blockSize, height * blockSize); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); getContentPane().setBackground(Color.BLACK); addKeyListener(this); initGame(); timer = new Timer(100, this); timer.start(); } private void initGame() { snake.clear(); snake.add(new Point(5, 5)); generateFood(); } private void generateFood() { Random rand = new Random(); int x = rand.nextInt(width); int y = rand.nextInt(height); food = new Point(x, y); } @Override public void paint(Graphics g) { super.paint(g); for (Point p : snake) { g.setColor(Color.GREEN); g.fillRect(p.x * blockSize, p.y * blockSize, blockSize, blockSize); } g.setColor(Color.RED); g.fillRect(food.x * blockSize, food.y * blockSize, blockSize, blockSize); } @Override public void actionPerformed(ActionEvent e) { move(); checkCollision(); repaint(); } private void move() { Point head = snake.get(0); Point newHead = (Point) head.clone(); switch (direction) { case KeyEvent.VK_UP: newHead.y--; break; case KeyEvent.VK_DOWN: newHead.y++; break; case KeyEvent.VK_LEFT: newHead.x--; break; case KeyEvent.VK_RIGHT: newHead.x++; break; } snake.add(0, newHead); if (!newHead.equals(food)) { snake.remove(snake.size() - 1); } else { generateFood(); } } private void checkCollision() { Point head = snake.get(0); if (head.x < 0 || head.x >= width || head.y < 0 || head.y >= height || snake.lastIndexOf(head) > 0) { gameOver(); } } private void gameOver() { timer.stop(); JOptionPane.showMessageDialog(this, "Game Over!", "Game Over", JOptionPane.INFORMATION_MESSAGE); initGame(); timer.start(); } @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if ((key == KeyEvent.VK_LEFT && direction != KeyEvent.VK_RIGHT) || (key == KeyEvent.VK_RIGHT && direction != KeyEvent.VK_LEFT) || (key == KeyEvent.VK_UP && direction != KeyEvent.VK_DOWN) || (key == KeyEvent.VK_DOWN && direction != KeyEvent.VK_UP)) { direction = key; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new SnakeGame().setVisible(true)); } }

这个代码创建了一个简单的贪吃蛇游戏,使用了基本的Swing库来实现GUI。游戏中的贪吃蛇会随着吃到食物而增长,如果蛇头碰到墙壁或者碰到自己的身体,则游戏结束。

你可以根据需要对游戏进行扩展,比如添加计分系统、难度级别、美化界面等功能。

计分系统: 在游戏中添加一个计分系统,使玩家可以追踪他们的分数。每次吃到食物时增加分数,并在游戏界面上显示分数。

难度级别: 添加不同的难度级别,例如通过增加蛇的移动速度或加速度来增加游戏的难度。

界面美化: 通过添加图像、动画效果、背景音乐等来美化游戏界面,使游戏更具吸引力。

游戏暂停和重新开始功能: 添加游戏暂停和重新开始的功能,允许玩家在游戏进行中暂停游戏,并在需要时重新开始游戏。

边界和自撞效果: 可以考虑在贪吃蛇触碰到边界或者自己的身体时,添加一些动画效果或者游戏提示,使游戏更加生动和有趣。

游戏结束界面: 当游戏结束时,显示一个游戏结束的界面,包括玩家的得分和重新开始游戏的选项。

添加关卡和关卡进度: 分为多个关卡,每个关卡有不同的挑战和难度,玩家可以根据自己的进度解锁新的关卡。

游戏设置选项: 允许玩家自定义游戏设置,例如蛇的颜色、背景音乐、难度级别等。