java编写的贪吃蛇游戏源码.docx
- 文档编号:9236482
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:26
- 大小:19.66KB
java编写的贪吃蛇游戏源码.docx
《java编写的贪吃蛇游戏源码.docx》由会员分享,可在线阅读,更多相关《java编写的贪吃蛇游戏源码.docx(26页珍藏版)》请在冰豆网上搜索。
java编写的贪吃蛇游戏源码
1、
类名
函数程序结构图
注释:
方法名
贪吃蛇
Map
Yard
Text
Snake
PaintThread
Node
KeyMonitor
Food
Direction
Draw
Mian
函数
paint
ScoreCheck
.stop
getscore
setscore
processKey
Deadif
Tailadd
Deltail
Headadd
Tailadd()
Deltail()
Headadd
draw
move
eat
keyPressed
Run
Pause
Restart
go_on
isPause
setPause
install
Draw
reAppear
getM
setM
getN
setN
Draw
Keypressed
定义
方向变量L,U,D,R
二、题目分析
通过分析该程序基本需要以下几个类:
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);
break;
caseR:
node=newNode(tail.m-1,tail.n,tail.dir);
break;
caseD:
node=newNode(tail.m,tail.n+1,tail.dir);
break;
}
tail.next=node;
node.pre=tail;
tail=node;
size++;
}
publicvoidDeltail(){
if(size==0)
return;
tail=tail.pre;
tail.next=null;
}
publicvoidHeadadd(){
Nodenode=null;
switch(head.dir){
caseL:
node=newNode(head.m-1,head.n,head.dir);
break;
caseU:
node=newNode(head.m,head.n-1,head.dir);
break;
caseR:
node=newNode(head.m+1,head.n,head.dir);
break;
caseD:
node=newNode(head.m,head.n+1,head.dir);
break;
}
node.next=head;
head.pre=node;
head=node;
size++;
}
publicvoiddraw(Graphicsg){
if(size<=0)
return;
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();
}
break;
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!
=null;p=p.next){
if(head.m==p.m&&head.n==p.n){
y.stop();
}
}
switch(Yard.MAP){
case1:
//地图1
break;
case2:
//地图2
for(intj=10;j { if(head.m==j&&head.n==10) y.stop(); } for(intj=10;j { if(head.m==j&&head.n==20) y.stop(); } break; case3: //地图3 for(intj=10;j { if(head.m==j&&head.n==10) y.stop(); } for(intj=10;j { if(head.m==j&&head.n==20) y.stop(); } for(intj=20;j<26;j++) { if(head.m==Yard.WIDTH/Yard.B_WIDTH-10&&head.n==j) y.stop(); } for(intj=5;j<10;j++) { if(head.m==10&&head.n==j) y.stop(); } break; default: break; } } 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; break; caseKeyEvent.VK_UP: if(head.dir! =Dir.D) head.dir=Dir.U; break; caseKeyEvent.VK_RIGHT: if(head.dir! =Dir.L) head.dir=Dir.R; break; caseKeyEvent.VK_DOWN: if(head.dir! =Dir.U) head.dir=Dir.D; break; } } } 2、Food.java importjava.awt.Color; importjava.awt.Graphics; importjava.util.Random; publicclassFood{ publicstaticintFOODSTYLE=1; privateintm=r.nextInt(Yard.WIDTH/Yard.B_WIDTH);//横格 privateintn=r.nextInt(Yard.HEIGHT/Yard.B_WIDTH-30/Yard.B_WIDTH)+30/Yard.B_WIDTH;//竖格 publicstaticRandomr=newRandom(); publicintgetM(){ returnm; } publicvoidsetM(intm){ this.m=m; } publicintgetN(){ returnn; } publicvoidsetN(intn){ this.n=n; } publicvoidreAppear(){ this.m=r.nextInt(Yard.WIDTH/Yard.B_WIDTH); this.n=r.nextInt(Yard.HEIGHT/Yard.B_WIDTH-30/Yard.B_WIDTH)+30/Yard.B_WIDTH; } publicvoiddraw(Graphicsg){ switch(Yard.MAP){ case2: //地图1 for(intj=10;j { if(m==j&&n==10) this.reAppear(); } for(intj=10;j { if(m==j&&n==20) this.reAppear(); } break; case3: //地图2 for(intj=10;j { if(m==j&&n==10) this.reAppear(); } for(intj=10;j { if(m==j&&n==20) this.reAppear(); } for(intj=20;j<26;j++) { if(m==Yard.WIDTH/Yard.B_WIDTH-10&&n==j) this.reAppear(); } for(intj=5;j<10;j++) { if(m==10&&n==j) this.reAppear(); } break; default: break; } Colorold=g.getColor(); g.setColor(newColor(100,13,250)); g.fillOval(m*Yard.B_WIDTH,n*Yard.B_WIDTH,Yard.B_WIDTH, Yard.B_WIDTH); g.setColor(old); } } 3、Yard.java importjava.awt.Color; importjava.awt.Font; importjava.awt.Frame; importjava.awt.Graphics; importjava.awt.event.KeyEvent; importjava.awt.event.WindowAdapter; importjava.awt.event.WindowEvent; publicclassYardextendsFrame{ publicstaticfinalintWIDTH=600; publicstaticfinalintHEIGHT=480; publicstaticfinalintB_WIDTH=15; privateintscore=0; publicstaticintMAP=1;//地形 publicstaticintSTYLE=1;//模式 publicstaticintSBODY=1;//蛇身颜色模式 publicstaticbooleanMOVECHECK=true; PaintThreadth=newPaintThread(this); privatebooleangameover=false; publicbooleanisGameover(){ returngameover; } publicvoidsetGameover(booleangameover){ this.gameover=gameover; } publicYard(){ Colorc=newColor(0,166,0); this.setTitle("贪吃蛇"); this.setLocation(200,200); this.setSize(WIDTH,HEIGHT); this.setBackground(c); this.setResizable(false); this.setVisible(true); this.addWindowListener(newWindowAdapter(){//匿名的局部类 @Override publicvoidwindowClosing(WindowEvente){ setVisible(false); System.exit(0); } }); this.addKeyListener(newKeyMonitor()); th.start(); } Foodf=newFood(); Snakes=newSnake(this); @Override publicvoidpaint(Graphicsg){ //画格 Colorold=g.getColor(); Map.draw(g); f.draw(g);//画蛋 s.draw(g);//画蛇 s.eat(f); g.setColor(Color.YELLOW); g.drawString("score: "+score,10,60); g.setFont(newFont("宋体",Font.BOLD,50)); if(gameover){ g.setColor(Color.black); g.fillRect(0,0,WIDTH,HEIGHT); g.setColor(Color.YELLOW); g.drawString("游戏结束! ",200,180); g.setFont(newFont("宋体",Font.BOLD,30)); g.drawString("score: "+score,10,60); th.pause(); } g.setColor(old); this.ScoreCheck(g); } publicvoidScoreCheck(Graphicsg){ if(score==30)th.install(90); if(score==60)th.install(60); if(score==90){ th.install(120); MAP++; if(MAP==4){ g.setColor(Color.black); g.fillRect(0,0,WIDTH,HEIGHT); g.setColor(Color.YELLOW); g.drawString("恭喜你通全关了! ",130,180); g.setFont(newFont("宋体",Font.BOLD,30)); g.drawString("score: "+score,10,60); th.pause(); } else{ g.setColor(Color.black); g.fillRect(0,0,WIDTH,HEIGHT); g.setColor(Color.YELLOW); g.drawString("恭喜你过关了! ",130,180); g.drawString("下一关载入中...",130,280); g.setFont(newFont("宋体",Font.BOLD,30)); g.drawString("score: "+score,10,60); try{ th.sleep(3000); }catch(InterruptedExceptione){ e.printStackTrace(); } f.reAppear(); th.reStart(); } } } publicvoidstop(){ gameover=true; } publicintgetscore(){ returnscore; } publicvoidsetscore(inti){ score=i; } publicvoidprocessKey(intkey,KeyEvente){ if(MOVECHECK){ s.keyPressed(e); MOVECHECK=false; } switch(key){ caseKeyEvent.VK_SPACE: if(! th.isPause()) th.pause(); else th.go_on(); break; caseKeyEvent.VK_F1: th.reStart(); break; caseKeyEvent.VK_1: th.install(300); break; caseKeyEvent.VK_2: th.install(200);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 编写 贪吃 游戏 源码