Java 贪吃蛇游戏:经典游戏,简单实现
设计思路
该程序实现了一个“贪吃蛇”游戏,玩家通过控制蛇的移动,使其吃到食物并不断变长,直到蛇撞到墙壁或自身,游戏结束。
系统基本功能描述
主要程序界面截屏如下:

主要功能:
- 开始游戏:点击“开始”按钮开始游戏,蛇开始移动。
- 控制蛇的移动:通过上下左右箭头键控制蛇的移动方向。
- 吃到食物:蛇头碰到食物后,蛇的长度加一,分数增加。
- 撞到墙壁:蛇撞到墙壁后游戏结束。
- 撞到自身:蛇撞到自身后游戏结束。
- 得分系统:玩家每吃掉一个食物,得分加一。
面向对象类的设计
- test类:主要负责程序的界面布局,包括“开始”按钮和D类的实例。
- D类:负责实现游戏的核心逻辑,包括蛇的移动、碰撞检测、得分计算等。同时,D类实现了Runnable和KeyListener接口,实现多线程和监听键盘事件的功能。
- Point类:表示蛇身体和食物的坐标点,D类中使用了Vector
,存储蛇身体的每个点。
核心代码实现
1. D类中的移动和碰撞检测代码
public void run() {
try {
while (true) {
for (int i = 0; i < v.size() - 1; i++) {
Point p = v.get(i);
Point p2 = v.get(i + 1);
p.x = p2.x;
p.y = p2.y;
}
if (direction == 0) {
Point p = v.get(v.size() - 1);
p.x = p.x + 10;
// 撞墙检测以及得分系统
if (p.x > 580) {
JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
System.exit(0);
}
}
if (direction == 1) {
Point p = v.get(v.size() - 1);
p.x = p.x - 10;
// 撞墙检测以及得分系统
if (p.x < 10) {
JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
System.exit(0);
}
}
if (direction == 2) {
Point p = v.get(v.size() - 1);
p.y = p.y - 10;
// 撞墙检测以及得分系统
if (p.y < 10) {
JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
System.exit(0);
}
}
if (direction == 3) {
Point p = v.get(v.size() - 1);
p.y = p.y + 10;
// 撞墙检测以及得分系统
if (p.y > 370) {
JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
System.exit(0);
}
}
for (int i = 0; i < v.size() - 1; i++) {
Point p = v.get(i);
Point p2 = v.get(v.size() - 1);
// 撞到身体检测以及得分系统
if (p.x == p2.x && p.y == p2.y) {
JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
System.exit(0);
}
}
for (int i = 0; i < v.size(); i++) {
Point p = v.get(i);
if (p.x == food.x && p.y == food.y) {
int t = r.nextInt(20);
food.x = t * 10;
food.y = t * 10;
v.add(new Point(p.x, p.y));
break;
}
}
repaint();
Thread.sleep(100);
}
} catch (Exception e) {
}
}
2. D类中的键盘监听代码
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP && direction != 3) {
direction = 2;
}//增加不能掉头
if (e.getKeyCode() == KeyEvent.VK_DOWN && direction != 2) {
direction = 3;
}//增加不能掉头
if (e.getKeyCode() == KeyEvent.VK_LEFT && direction != 0) {
direction = 1;
}//增加不能掉头
if (e.getKeyCode() == KeyEvent.VK_RIGHT && direction != 1) {
direction = 0;
}//增加不能掉头
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
代码说明:
run()方法实现了蛇的移动逻辑:- 首先,循环遍历蛇身体的每个点,将后一个点的坐标赋给前一个点,实现蛇身移动的效果。
- 根据当前方向(
direction),更新蛇头的坐标。 - 判断蛇头是否撞到墙壁或自身,如果撞到则结束游戏。
- 判断蛇头是否吃到食物,如果吃到则增加蛇的长度并生成新的食物。
keyPressed()方法监听键盘事件,根据按键方向更新蛇的移动方向。
代码结构
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class test extends JFrame implements ActionListener {
String name;
JButton jbn = new JButton('开始');
D jpn = new D();
test() {
Container cn = getContentPane();
cn.setLayout(new BorderLayout());
cn.add(jbn, BorderLayout.NORTH);
cn.add(jpn, BorderLayout.CENTER);
jbn.addActionListener(this);
setSize(600, 400);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Thread t1 = new Thread(jpn);
t1.start();
jpn.requestFocus(true);
}
public static void main(String args[]) {
new test();
}
}
class D extends JPanel implements Runnable, KeyListener {
int x = 10;
int direction = 0;
Random r = new Random();
Vector<Point> v = new Vector<Point>();
Point food = new Point();
D() {
v.add(new Point(20, 10));
v.add(new Point(20, 10));
v.add(new Point(20, 10));
v.add(new Point(20, 10));
int t = r.nextInt(20);
food.x = t * 10;
food.y = t * 10;
addKeyListener(this);
}
public void run() {
// ... (移动和碰撞检测代码)
}
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < v.size(); i++) {
Point p = v.get(i);
int x = p.x;
int y = p.y;
if (i == v.size() - 1) {
g.setColor(Color.blue);
g.fillOval(x, y, 9, 9);
} else {
g.setColor(Color.black);
g.fillOval(x, y, 9, 9);
}
}
int x = food.x;
int y = food.y;
g.setColor(Color.red);
g.fillRect(x, y, 9, 9);
}
public void keyPressed(KeyEvent e) {
// ... (键盘监听代码)
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
流程图

说明:
- 游戏开始时,初始化蛇身和食物的位置。
- 游戏循环:
- 更新蛇身坐标,模拟蛇的移动。
- 判断蛇头是否撞到墙壁或自身。
- 判断蛇头是否吃到食物。
- 重绘游戏界面。
- 暂停一段时间,控制游戏速度。
- 如果游戏结束,则显示游戏结束信息。
注意:
- 以上代码仅供参考,实际实现中可能需要根据具体需求进行调整。
- 本程序仅实现了基本功能,没有实现游戏音效、界面美化等功能。
- 您可以根据自己的需求进行扩展和改进。
总结
本程序使用 Java 实现了一个简单的“贪吃蛇”游戏,展示了使用面向对象编程、多线程和键盘监听等技术实现游戏的基本功能。您可以将其作为学习 Java 游戏开发的入门案例。
原文地址: https://www.cveoy.top/t/topic/oFMr 著作权归作者所有。请勿转载和采集!