java编写的贪吃蛇游戏源码Word文档格式.docx
《java编写的贪吃蛇游戏源码Word文档格式.docx》由会员分享,可在线阅读,更多相关《java编写的贪吃蛇游戏源码Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
![java编写的贪吃蛇游戏源码Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/9/ccc7fd45-7ba7-4272-9d10-daa45d06115c/ccc7fd45-7ba7-4272-9d10-daa45d06115c1.gif)
年
1
月
7
日
1、
函数程序结构图
注释:
二、题目分析
通过分析该程序基本需要以下几个类:
Text(Main方法)、Snake(蛇)、Food(食物)、Yard(窗口)、Map(地图)、Node(节点)、PaintThread(线程)、Dir(方向)、KeyMonitor(键盘监听)。
主要实现蛇运动的基本操作和一些事件反应、游戏分数的记录、暂停、重新开始、更改蛇蛇颜色,蛇的移动速度,地图、死亡模式的改变等功能。
本程序运用Java语言知识,用面向对象的思维设计“贪吃蛇”游戏。
3、结果分析
运行程序出现游戏界面,蛇(Snake)头自动向前移动,用键盘的上(Up)下(Down)左(Left)右(Right)键控制蛇头的移动方向。
游戏窗体中在随机位置出现紫色的食物(Food)。
1、每吃一个加5分
2、默认撞墙不死
3、默认速度3
4、默认地图1
5、默认普通蛇身
6、默认30分提升一个速度档次
7、默认每个速度都走完后更换地图并且速度恢复默认,积分归零
功能键:
1、按F1重新开始
2、按空格键暂停/继续
3、按1/2/3/4/5数字键设置蛇的移动速度(逐渐变快)
4、按F2更换地图(3种)
5、按F3普通蛇/彩蛇的切换
6、按F4更换游戏模式(蛇撞到最外围为死亡还是从另一端返回)
该程序初步完成了“贪吃蛇”的游戏雏形,但是缺乏完善。
比如:
界面效果十分粗糙、屏幕闪烁、缺少声音等。
但是,我们通过编写贪吃蛇,能更好的运用面向对象的思维方式了,并学到了许多有用的经验。
四、附录(程序清单)
1、Snake.java
importjava.awt.Color;
importjava.awt.Graphics;
importjava.awt.event.KeyEvent;
publicclassSnake{
Nodehead=null;
Nodetail=null;
intsize=0;
Yardy;
Noden=newNode(1,2,Dir.D);
publicSnake(Yardy){
head=n;
tail=n;
size=1;
this.y=y;
for(inti=0;
i<
3;
i++)
this.Headadd();
}
publicvoidTailadd(){
Nodenode=null;
switch(tail.dir){
caseL:
node=newNode(tail.m+1,tail.n,tail.dir);
break;
caseU:
node=newNode(tail.m,tail.n+1,tail.dir);
caseR:
node=newNode(tail.m-1,tail.n,tail.dir);
caseD:
}
tail.next=node;
node.pre=tail;
tail=node;
size++;
publicvoidDeltail(){
if(size==0)
return;
tail=tail.pre;
tail.next=null;
publicvoidHeadadd(){
switch(head.dir){
caseL:
node=newNode(head.m-1,head.n,head.dir);
caseU:
node=newNode(head.m,head.n-1,head.dir);
caseR:
node=newNode(head.m+1,head.n,head.dir);
caseD:
node=newNode(head.m,head.n+1,head.dir);
node.next=head;
head.pre=node;
head=node;
size++;
publicvoiddraw(Graphicsg){
if(size<
=0)
move();
for(Noden=head;
n!
=null;
n=n.next){
if(head==n){
g.setColor(Color.BLUE);
if(n.dir==Dir.L||n.dir==Dir.R)
g.fillOval(n.m*Yard.B_WIDTH,n.n*Yard.B_WIDTH,Yard.B_WIDTH,Yard.B_WIDTH-3);
else
g.fillOval(n.m*Yard.B_WIDTH,n.n*Yard.B_WIDTH,Yard.B_WIDTH-3,Yard.B_WIDTH);
}
else
n.draw(g);
publicvoidDeadif(){
switch(Yard.STYLE){
case2:
if(head.m<
0||head.n<
30/Yard.B_WIDTH||head.m>
=(Yard.WIDTH/Yard.B_WIDTH)
||head.n>
=(Yard.HEIGHT/Yard.B_WIDTH)){
y.stop();
case1:
intcols=Yard.WIDTH/Yard.B_WIDTH;
introws=Yard.HEIGHT/Yard.B_WIDTH;
if(head.m<
0)head.m=cols;
elseif(head.m>
=cols)head.m=0;
elseif(head.n<
30/Yard.B_WIDTH)head.n=rows;
elseif(head.n>
=rows)head.n=30/Yard.B_WIDTH;
break;
for(Nodep=head.next;
p!
p=p.next){
if(head.m==p.m&
&
head.n==p.n){
switch(Yard.MAP){
//地图1
//地图2
for(intj=10;
j<
Yard.WIDTH/Yard.B_WIDTH-10;
j++)
{
if(head.m==j&
head.n==10)
y.stop();
head.n==20)
case3:
//地图3
for(intj=20;
26;
if(head.m==Yard.WIDTH/Yard.B_WIDTH-10&
head.n==j)
for(intj=5;
10;
if(head.m==10&
default:
voidmove(){
Yard.MOVECHECK=true;
Headadd();
Deltail();
Deadif();
publicvoideat(foode){
if(y.f.getM()==y.s.head.m&
y.f.getN()==y.s.head.n){
e.reAppear();
this.Tailadd();
y.setscore(y.getscore()+5);
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();
switch(key){
caseKeyEvent.VK_LEFT:
if(head.dir!
=Dir.R)
head.dir=Dir.L;
caseKeyEvent.VK_UP:
=Dir.D)
head.dir=Dir.U;
caseKeyEvent.VK_RIGHT:
=Dir.L)
head.dir=Dir.R;
caseKeyEvent.VK_DOWN:
=Dir.U)
head.dir=Dir.D;
}
2、Food.java
importjava.util.Ra