java贪吃蛇游戏说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 功能说明
此程序是基于JFrame,结合JPanel和Component的监听器来实现的贪吃蛇小游戏。主要实现功能如下:
1) 利用方向键来改变蛇的运行方向。
2) 在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自
身则游戏结束,否则正常运行。
3) 空格键暂停或继续游戏。
4) 通过菜单选项可选择三种刷新速度。
2 类说明
1. 类之间的关系如图1所示。
SnakeGame
SnakeFrame
SnakeRunnable
StatusRunnable
SnakePanel
Node
Snake
图1类之间的关系
序号文件名主要功能
1SnakeGame该文件为程序入口,含有main方法。
2SnakeFrame 实现菜单控制运行等总体要求,实现方向键控制蛇的方向,空格键控制游戏暂停或继续,还有分数等。
3Snake 该文件实现蛇的结构和具体运动,如判断食物是否和怎样被吃掉及判断后的动作。
4Node该文件实现组成蛇身的单位-食物。
5SnakePanel 该文件实现画板功能,用两色间隔画蛇身。
6StatusRunnable该文件为记录状态的线程。
7SnakeRunnable该文件为蛇运动以及记录分数的线程。
2. java源文件及其功能如表所示。
3 主要算法(附代码)
1. 吃食物的判断——isEaten()
private boolean isEaten() {
Node head = body.get(0);//取得蛇头部的坐标
if (derection == Snake.RIGHT && (head.x + Node.W) == food.x
&& head.y == food.y)
return true;
if (derection == Snake.LEFT && (head.x - Node.W) == food.x
&& head.y == food.y)
return true;
if (derection == Snake.UP && head.x == food.x && (head.y - Node.H) == food.y)
return true;
if (derection == Snake.DOWN && head.x == food.x && (head.y + Node.H) == food.y)
return true;
else
return false;
}
2. 碰撞判断——isCollsion()
private boolean isCollsion() {
Node node = body.get(0);// 获取下标为0的元素,即蛇头// 碰壁。横:300-20=280;纵:400-20=380
if (derection == Snake.RIGHT && node.x == 280)
return true;
if (derection == Snake.UP && node.y == 0)
return true;
if (derection == Snake.LEFT && node.x == 0)
return true;
if (derection == Snake.DOWN && node.y == 380)
return true;
// 蛇头碰到蛇身
Node temp = null;
int i = 0;
for (i = 3; i < body.size(); i++) {
temp = body.get(i);
if (temp.x == node.x && temp.y == node.y)
break; }
if (i < body.size())
return true;
else
return false;
}
3. 产生食物——createFood()
public void createFood() {
Node node = new Node(0, 0);
boolean isInBody = true;
int x = 0, y = 0;
int X = 0, Y = 0;
int i = 0;
while (isInBody) {
x = (int) (Math.random() * 15);
y = (int) (Math.random() * 20);
X = x * Node.W;
Y = y * Node.H;
for (i = 0; i < body.size(); i++) {
if (X == body.get(i).x && Y ==
body.get(i).y)
break; }
if (i < body.size())
isInBody = true;
else
isInBody = false;
}
food = new Node(X, Y);
}
4. 改变行进方向——changeDirection(int newDer)
public void changeDirection(int newDer) {
if (derection % 2 != newDer % 2)// 如果与原来方向相同或相反,则无法改变
derection = newDer;
}
5. 蛇运动——move()
public void move() {
if (isEaten()) {// 如果食物被吃掉