java写贪吃蛇代码
javaimport 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。游戏中的贪吃蛇会随着吃到食物而增长,如果蛇头碰到墙壁或者碰到自己的身体,则游戏结束。
你可以根据需要对游戏进行扩展,比如添加计分系统、难度级别、美化界面等功能。
计分系统: 在游戏中添加一个计分系统,使玩家可以追踪他们的分数。每次吃到食物时增加分数,并在游戏界面上显示分数。
难度级别: 添加不同的难度级别,例如通过增加蛇的移动速度或加速度来增加游戏的难度。
界面美化: 通过添加图像、动画效果、背景音乐等来美化游戏界面,使游戏更具吸引力。
游戏暂停和重新开始功能: 添加游戏暂停和重新开始的功能,允许玩家在游戏进行中暂停游戏,并在需要时重新开始游戏。
边界和自撞效果: 可以考虑在贪吃蛇触碰到边界或者自己的身体时,添加一些动画效果或者游戏提示,使游戏更加生动和有趣。
游戏结束界面: 当游戏结束时,显示一个游戏结束的界面,包括玩家的得分和重新开始游戏的选项。
添加关卡和关卡进度: 分为多个关卡,每个关卡有不同的挑战和难度,玩家可以根据自己的进度解锁新的关卡。
游戏设置选项: 允许玩家自定义游戏设置,例如蛇的颜色、背景音乐、难度级别等。