1、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.BigMout
2、hFish.java 2008-7-31 * Copy Right Information : Tarena * Project : fish * JDK version used : jdk1.6.4 * Comments : 大嘴鱼类 * Version : 1.0 * Sr Date Modified By Why & What is modified * 1. 2008-7-31 小猪 新建 */package fish;import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;im
3、port java.awt.event.ActionListener;import javax.swing.Timer; /* * 大嘴鱼类 * 此类继承AcitonListener,实现AcitonPerformed方法,练习ActionListener的另一种实现方法 * 此类还练习定时器Timer的使用 * 此类还练习图形类Graphics的使用 * 2008-7-31 * author 达内科技Tarena Training Group * version 1.0 * since JDK1.6(建议) */public class BigMouthFish implements Act
4、ionListener/* 大嘴鱼嘴的方向:0-上 */ public static int UP = 0; /* 大嘴鱼嘴的方向:1-右 */ public static int RIGHT = 1;2-下 */ public static int DOWN = 2;3-左 */ public static int LEFT = 3;/* 大嘴鱼的身体大小,以size为半径画圆 */ public int size = 50; /* 大嘴鱼现在的方向(以嘴的方向为基准) */ public int direction = RIGHT; /* 大嘴鱼身体的颜色 */ private Color
5、 color = Color.CYAN; /* 大嘴鱼的位置x */ public int posx = 80; /* 大嘴鱼的位置y */ public int posy = 80; /* 大嘴鱼的速度,鱼每次前进的像素 */ public int speed = 4; /* 大嘴鱼眼睛的大小 */ private int eyesize = size/5; /* 大嘴鱼眼睛的位置x */ private int eyeposx = posx+size/2; /* 大嘴鱼眼睛的位置y */ private int eyeposy = posy+size/5; /* 大嘴鱼眼睛的颜色 */ p
6、rivate Color eyecolor = Color.RED; /* 大嘴鱼嘴的最大角度的一半 */ private int maxMonth = 30; /* 大嘴鱼现在嘴角的角度 */ private int monthsize = 30;/* 大嘴鱼的嘴是否张开 */ private boolean isOpen = true;private Timer time = null; * 大嘴鱼缺省构造函数. * 创建一个位置为(200,200),大小为50,方向为右,颜色为Color.CYAN,速度为10的大嘴鱼 public BigMouthFish() /this的使用。 thi
7、s(200,200,50,RIGHT,Color.CYAN,4); * 根据位置、大小、方向、颜色、速度构造一个大嘴鱼。 * param posx 大嘴鱼的位置x。 * param posy 大嘴鱼的位置y。 * param size 大嘴鱼的大小。 * param direction 大嘴鱼的方向:0-上;1-右;2-下;3-左。出入错误时,默认改为1。 * param color 大嘴鱼的颜色。 * param speed 大嘴鱼的速度。 public BigMouthFish(int posx,int posy,int size,int direction,Color color,int
8、 speed) 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 = new Timer(FishPool.reTime,this); time.start(); * 大嘴鱼移动。根据鱼的方向移动鱼。 public voi
9、d move() switch (direction) case 0: posy-; break; case 1: posx+; case 2: posy+; case 3: posx-; default: * 改变大嘴鱼身体的颜色。 * param color 欲改变大嘴鱼身体的颜色 public void changeColor(Color color) * 改变大嘴鱼的方向 * param direction 欲改变大嘴鱼的方向 public void changeDir(int direction) this.direction = direction; * 使用画笔绘画大嘴鱼.大嘴鱼
10、的头像:一个扇形的是鱼脸,上面有一个小圆是眼睛 * 1.保存画笔颜色 * 2.绘制大嘴鱼的脸 * 3.绘制大嘴鱼的眼睛 * 4.恢复画笔颜色 * param g 画笔 public void paint(Graphics g) /保存画笔的颜色 Color c = g.getColor(); /绘制鱼脸 g.setColor(color); /从(posx,posy)点开始,绘制宽为size,高为size,开始角度为(direction%2=0?(direction+1):(direction-1)*90+monthsize,弧度为360-2*maxMonth的弧形 g.fillArc(pos
11、x, 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); * 大嘴鱼张嘴闭嘴事件 * 此处只负责鱼的角度的变化,不负责鱼的重绘。 * 重绘在鱼池中实现。 * 这样的好处:保证鱼的绘制和步伐分开。显示层和逻辑层单独处理。(面向对象的责任问题)。 * param e 事件对象 public void
12、 actionPerformed(ActionEvent e) if(isOpen) monthsize -= 2; if(monthsize=maxMonth) isOpen = true; * 方向改变时,眼睛的改变。 private void initEye() case 0: eyeposx = posx+size/7; eyeposy = posy+size/2-eyesize; break; case 1: eyeposx = posx+size/2; eyeposy = posy+size/7; case 2: eyeposx = posx+size*5/7; eyeposy =
13、 posy+size/2; case 3: eyeposx = posx+size/2-eyesize; default:3.2小鱼的设计小鱼15秒内如果没被吃掉,将在10秒后消失。消失前会闪烁不停。 * (#)fish.FishBean.java 2008-7-31 豆豆类 * 豆豆类 * author Administratorpublic class FishBean implements ActionListener /* 小鱼的位置x */ public int posx = 190; /* 小鱼的位置y */ public int posy = 190; /* 小鱼的大小,以siz
14、e为半径画豆豆(圆)。 public int size = 10; /* 小鱼的当前颜色 */ private Color color = Color.MAGENTA; /* 小鱼的新颜色 */ private Color newColor = Color.MAGENTA; /* 小鱼的旧颜色 */ private Color oldColor = Color.GRAY; /* 小鱼消失时的闪烁时间 */ public static int flickerTime = 350; /* 小鱼消失时的闪烁次数 */ public static int filckerNum = 8; private
15、 int hasFileckedNum = 0; /* 小鱼消失时闪烁的定时器 */ private Timer timer = null; * 缺省构造函数。按位置(40,40),大小15,颜色Color.MAGENTA构造一个豆豆。 public FishBean() this(190,190,10,Color.MAGENTA,Color.GRAY); * 按照位置、大小、颜色构造一个豆豆类。 * param posx 豆豆的水平坐标x。 * param posy 豆豆的垂直坐标y。 * param size 豆豆的大小。 * param newColor 豆豆的颜色。 * param o
16、ldColor 豆豆的旧颜色 public FishBean(int posx,int posy,int size,Color newColor,Color oldColor) this.newColor = newColor; this.oldColor = oldColor; this.color = newColor; timer = new Timer(flickerTime,this); * 移动豆豆到新的位置。 * param posx 豆豆的新水平坐标x。 * param posy 豆豆的新垂直坐标y。 public void newPos(int posx,int posy)
17、* 绘制豆豆。 g.fillOval(posx, posy, size, size); * 停止Timer。 public void stopTimer() color = newColor; timer.stop(); hasFileckedNum = 0; * 启动Timer。 public void runTimer() timer.start(); * 定时器事件。 hasFileckedNum+; if(color.equals(newColor) | color=newColor) color = oldColor; else color = newColor; /定时器运行的次数
18、完成时,停止定时器。 if(hasFileckedNum=filckerNum & timer.isRunning() stopTimer(); * Timer定时器是否运行中。 * return 返回Timer是否运行中。 public boolean timerIsRunning() return timer.isRunning();3.3碰撞检测代替的实现 该游戏并不对大嘴鱼进行碰撞检测。省去了地图绘制过程。利用之前所生成的坐标点集合。大嘴鱼并不对地图边缘进行碰撞检测。 * (#)tools.FishUtilities.java 2008-7-31 tools 检测大嘴鱼和小鱼碰撞类。p
19、ackage tools;import fish.BigMouthFish;import fish.FishBean; * 检测大嘴鱼和小鱼碰撞类。 * 此类练习Math的静态函数的使用。public class FishUtilities * 返回大嘴鱼是否吃掉了小鱼。 * 方式:检测2鱼(圆)之间是否相切或相交。 * 判断2圆心之间的距离小于2圆半径之和。此处判断小于大嘴鱼的半径即可。让大嘴鱼可以吃掉小鱼。 * param fish * param bean * return 返回大鱼是否吃掉小鱼。 public static boolean isInteraction(BigMouthF
20、ish fish,FishBean bean) return Math.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)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); return n; * 返回0-a的随机数。 * param a 整数a。 * return 返回0-a的随机数。 public static int randomInt(int a) return new Random().nextInt(a);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1