JAVA吃豆豆项目报告Word格式文档下载.docx
《JAVA吃豆豆项目报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JAVA吃豆豆项目报告Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
2总体设计
2.1主类设计
2.2游戏功能的设计
大嘴鱼在吃到小鱼后会升级,速度加快。
3详细设计与实现
3.1大嘴鱼的设计
首先生成创建imgae,获取image的画笔Graphics,利用Graphics完成游戏界面的绘制。
Food类的绘制,遍历Food集合,向Food类的paint方法传入画笔。
绘制大嘴鱼,小鱼。
Food对象用自身方法绘制自己。
另绘制积分字段,根据游戏时长绘制游戏状态。
最后讲image画入Frame中,完成界面的绘制过程。
Frame继承了Runnable方法,在其run方法中,每30毫秒,调用repaint方法,重绘场景,完成地图场景的刷新。
/**
*@(#)fish.BigMouthFish.java2008-7-31
*CopyRightInformation:
Tarena
*Project:
fish
*JDKversionused:
jdk1.6.4
*Comments:
大嘴鱼类
*Version:
1.0
*SrDateModifiedByWhy&
Whatismodified
*1.2008-7-31小猪新建
**/
packagefish;
importjava.awt.Color;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.Timer;
/**
*大嘴鱼类<
br>
*此类继承AcitonListener,实现AcitonPerformed方法,练习ActionListener的另一种实现方法<
*此类还练习定时器Timer的使用<
*此类还练习图形类Graphics的使用<
*2008-7-31
*@author达内科技[TarenaTrainingGroup]
*@version1.0
*@sinceJDK1.6(建议)
*/
publicclassBigMouthFishimplementsActionListener{
/**大嘴鱼嘴的方向:
0-上*/
publicstaticintUP=0;
/**大嘴鱼嘴的方向:
1-右*/
publicstaticintRIGHT=1;
2-下*/
publicstaticintDOWN=2;
3-左*/
publicstaticintLEFT=3;
/**大嘴鱼的身体大小,以size为半径画圆*/
publicintsize=50;
/**大嘴鱼现在的方向(以嘴的方向为基准)*/
publicintdirection=RIGHT;
/**大嘴鱼身体的颜色*/
privateColorcolor=Color.CYAN;
/**大嘴鱼的位置x*/
publicintposx=80;
/**大嘴鱼的位置y*/
publicintposy=80;
/**大嘴鱼的速度,鱼每次前进的像素*/
publicintspeed=4;
/**大嘴鱼眼睛的大小*/
privateinteyesize=size/5;
/**大嘴鱼眼睛的位置x*/
privateinteyeposx=posx+size/2;
/**大嘴鱼眼睛的位置y*/
privateinteyeposy=posy+size/5;
/**大嘴鱼眼睛的颜色*/
privateColoreyecolor=Color.RED;
/**大嘴鱼嘴的最大角度的一半*/
privateintmaxMonth=30;
/**大嘴鱼现在嘴角的角度*/
privateintmonthsize=30;
/**大嘴鱼的嘴是否张开*/
privatebooleanisOpen=true;
privateTimertime=null;
*大嘴鱼缺省构造函数.<
*创建一个位置为(200,200),大小为50,方向为右,颜色为Color.CYAN,速度为10的大嘴鱼
publicBigMouthFish(){
//this的使用。
this(200,200,50,RIGHT,Color.CYAN,4);
}
*根据位置、大小、方向、颜色、速度构造一个大嘴鱼。
*@paramposx大嘴鱼的位置x。
*@paramposy大嘴鱼的位置y。
*@paramsize大嘴鱼的大小。
*@paramdirection大嘴鱼的方向:
0-上;
1-右;
2-下;
3-左。
出入错误时,默认改为1。
*@paramcolor大嘴鱼的颜色。
*@paramspeed大嘴鱼的速度。
publicBigMouthFish(intposx,intposy,intsize,intdirection,Colorcolor,intspeed){
this.posx=posx;
this.posy=posy;
this.size=size;
if(direction==1||direction==2||direction==3||direction==4)
this.direction=direction;
this.color=color;
this.speed=speed;
eyesize=size/7;
initEye();
time=newTimer(FishPool.reTime,this);
time.start();
}
*大嘴鱼移动。
根据鱼的方向移动鱼。
publicvoidmove(){
switch(direction){
case0:
posy--;
break;
case1:
posx++;
case2:
posy++;
case3:
posx--;
default:
}
*改变大嘴鱼身体的颜色。
*@paramcolor欲改变大嘴鱼身体的颜色
publicvoidchangeColor(Colorcolor){
*改变大嘴鱼的方向
*@paramdirection欲改变大嘴鱼的方向
publicvoidchangeDir(intdirection){
this.direction=direction;
*使用画笔绘画大嘴鱼.大嘴鱼的头像:
一个扇形的是鱼脸,上面有一个小圆是眼睛<
*1.保存画笔颜色<
*2.绘制大嘴鱼的脸<
*3.绘制大嘴鱼的眼睛<
*4.恢复画笔颜色<
*@paramg画笔
publicvoidpaint(Graphicsg){
//保存画笔的颜色
Colorc=g.getColor();
//绘制鱼脸
g.setColor(color);
//从(posx,posy)点开始,绘制宽为size,高为size,开始角度为(direction%2==0?
(direction+1):
(direction-1))*90+monthsize,弧度为360-2*maxMonth的弧形
g.fillArc(posx,posy,size,size,(direction%2==0?
(direction-1))*90+monthsize,360-2*monthsize);
//绘制鱼眼
g.setColor(eyecolor);
g.fillOval(eyeposx,eyeposy,eyesize,eyesize);
//恢复画笔颜色
g.setColor(c);
*大嘴鱼张嘴闭嘴事件<
*此处只负责鱼的角度的变化,不负责鱼的重绘。
*重绘在鱼池中实现。
<
*这样的好处:
保证鱼的绘制和步伐分开。
显示层和逻辑层单独处理。
(面向对象的责任问题)。
*@parame事件对象
publicvoidactionPerformed(ActionEvente){
if(isOpen){
monthsize-=2;
if(monthsize<
=0)
isOpen=false;
}else{
monthsize+=2;
if(monthsize>
=maxMonth)
isOpen=true;
*方向改变时,眼睛的改变。
privatevoidinitEye(){
case0:
eyeposx=posx+size/7;
eyeposy=posy+size/2-eyesize;
break;
case1:
eyeposx=posx+size/2;
eyeposy=posy+size/7;
case2:
eyeposx=posx+size*5/7;
eyeposy=posy+size/2;
case3:
eyeposx=posx+size/2-eyesize;
default:
}
3.2小鱼的设计
小鱼15秒内如果没被吃掉,将在10秒后消失。
消失前会闪烁不停。
*@(#)fish.FishBean.java2008-7-31
豆豆类
*豆豆类
*@authorAdministrator
publicclassFishBeanimplementsActionListener{
/**小鱼的位置x*/
publicintposx=190;
/**小鱼的位置y*/
publicintposy=190;
/**小鱼的大小,以size为半径画豆豆(圆)。
publicintsize=10;
/**小鱼的当前颜色*/
privateColorcolor=Color.MAGENTA;
/**小鱼的新颜色*/
privateColornewColor=Color.MAGENTA;
/**小鱼的旧颜色*/
privateColoroldColor=Color.GRAY;
/**小鱼消失时的闪烁时间*/
publicstaticintflickerTime=350;
/**小鱼消失时的闪烁次数*/
publicstaticintfilckerNum=8;
privateinthasFileckedNum=0;
/**小鱼消失时闪烁的定时器*/
privateTimertimer=null;
*缺省构造函数。
按位置(40,40),大小15,颜色Color.MAGENTA构造一个豆豆。
publicFishBean(){
this(190,190,10,Color.MAGENTA,Color.GRAY);
*按照位置、大小、颜色构造一个豆豆类。
*@paramposx豆豆的水平坐标x。
*@paramposy豆豆的垂直坐标y。
*@paramsize豆豆的大小。
*@paramnewColor豆豆的颜色。
*@paramoldColor豆豆的旧颜色
publicFishBean(intposx,intposy,intsize,ColornewColor,ColoroldColor){
this.newColor=newColor;
this.oldColor=oldColor;
this.color=newColor;
timer=newTimer(flickerTime,this);
*移动豆豆到新的位置。
*@paramposx豆豆的新水平坐标x。
*@paramposy豆豆的新垂直坐标y。
publicvoidnewPos(intposx,intposy){
*绘制豆豆。
g.fillOval(posx,posy,size,size);
*停止Timer。
publicvoidstopTimer(){
color=newColor;
timer.stop();
hasFileckedNum=0;
*启动Timer。
publicvoidrunTimer(){
timer.start();
*定时器事件。
hasFileckedNum++;
if(color.equals(newColor)||color==newColor)
color=oldColor;
else
color=newColor;
//定时器运行的次数完成时,停止定时器。
if(hasFileckedNum==filckerNum&
&
timer.isRunning()){
stopTimer();
*Timer定时器是否运行中。
*@return返回Timer是否运行中。
publicbooleantimerIsRunning(){
returntimer.isRunning();
3.3碰撞检测代替的实现
该游戏并不对大嘴鱼进行碰撞检测。
省去了地图绘制过程。
利用之前所生成的坐标点集合。
大嘴鱼并不对地图边缘进行碰撞检测。
*@(#)tools.FishUtilities.java2008-7-31
tools
检测大嘴鱼和小鱼碰撞类。
packagetools;
importfish.BigMouthFish;
importfish.FishBean;
*检测大嘴鱼和小鱼碰撞类。
*此类练习Math的静态函数的使用。
publicclassFishUtilities{
*返回大嘴鱼是否吃掉了小鱼。
*方式:
检测2鱼(圆)之间是否相切或相交。
*判断2圆心之间的距离小于2圆半径之和。
此处判断小于大嘴鱼的半径即可。
让大嘴鱼可以吃掉小鱼。
*@paramfish
*@parambean
*@return返回大鱼是否吃掉小鱼。
publicstaticbooleanisInteraction(BigMouthFishfish,FishBeanbean){
returnMath.pow(fish.posx+fish.size/2-bean.posx-bean.size/2,2)+Math.pow(fish.posy+fish.size/2-bean.posy-bean.size/2,2)<
=Math.pow(fish.size/2,2);
大嘴鱼移动的时候,先改变tx、ty临时坐标,判断临时坐标是否在坐标集中。
如果在,将临时坐标赋予坐标。
否则恢复临时坐标,将无法移动。
3.4随机出现小鱼的实现
小鱼被大鱼吃掉后将会随机刷新在地图的某一个地点。
*@(#)RandomUtil.java2008.07.01
DataCollectorSys_Client
数学类-随机数生成类
*1.2007.07.17小猪新建
importjava.util.Random;
*数学类-随机数生成类
*2008-07-16
publicclassRandomUtil{
*生成a-b的随机数
*@parama整数a
*@paramb整数b
*@returna-b的随机数
publicstaticintrandomInt(inta,intb){
intt,n=0;
if(a>
b)
{
t=a;
a=b;
b=t;
t=(int)(Math.ceil(Math.log10(b)));
//对b向上取整
while(true)
n=(int)(Math.random()*Math.pow(10,t));
//随机数*10的t次方
if(n>
=a&
n<
=b)
//System.out.println("
生成的随机数如下:
"
+n);
returnn;
*返回0-a的随机数。
*@parama整数a。
*@return返回0-a的随机数。
publicstaticintrandomInt(inta){
returnnewRandom().nextInt(a);