java编写的贪吃蛇游戏源码.docx

上传人:b****7 文档编号:9236482 上传时间:2023-02-03 格式:DOCX 页数:26 大小:19.66KB
下载 相关 举报
java编写的贪吃蛇游戏源码.docx_第1页
第1页 / 共26页
java编写的贪吃蛇游戏源码.docx_第2页
第2页 / 共26页
java编写的贪吃蛇游戏源码.docx_第3页
第3页 / 共26页
java编写的贪吃蛇游戏源码.docx_第4页
第4页 / 共26页
java编写的贪吃蛇游戏源码.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

java编写的贪吃蛇游戏源码.docx

《java编写的贪吃蛇游戏源码.docx》由会员分享,可在线阅读,更多相关《java编写的贪吃蛇游戏源码.docx(26页珍藏版)》请在冰豆网上搜索。

java编写的贪吃蛇游戏源码.docx

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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1