捕鱼达人.docx
《捕鱼达人.docx》由会员分享,可在线阅读,更多相关《捕鱼达人.docx(23页珍藏版)》请在冰点文库上搜索。
捕鱼达人
武汉理工大学华夏学院
课程设计报告书
课程名称:
智能手机软件开发
题目:
捕鱼达人
系名:
专业班级:
姓名:
学号:
指导教师:
武汉理工大学华夏学院信息工程系
课程设计任务书
课程名称:
智能手机软件开发课程设计指导教师:
班级名称:
开课系、教研室:
一、课程设计目的与任务
本课程的设计的目的是通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。
结合具体的开发案例捕鱼达人,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。
二、课程设计的内容与基本要求
1、课程设计题目
捕鱼达人
2、课程设计内容
要求学生根据所学的软件工程的理念,利用所学的Android手机开发的知识,开发一个智能手机游戏捕鱼达人,并针对该手机游戏软件进行需求分析,总体设计、详细设计、编码、测试。
游戏操作
鼠标移动/键盘方向键←→控制炮台射击方向,点击鼠标左键/按空格键射击撒网抓鱼,点击下方的红色+号和-号按钮/数字键1-8键/方向键↑键/滑动鼠标滑轮切换炮台
游戏背景音乐设计
游戏背景动画设计
游戏界面设计
游戏关卡设计
游戏积分榜的设计
三、课程设计步骤及时间进度和场地安排
本课程设计将安排在第18周,教育技术中心。
具体安排如下:
第一天,系统开发平台搭建及主流开发工具安装
第二天,游戏界面的设计
第三天,游戏业务的设计
第四天,游戏关卡的设计
第五天,系统调试测试打包和验收
周次
星期一
星期二
星期三
星期四
星期五
第18周
第1-8节
第1-8节
第1-8节
第1-8节
第1-8节
地点
现教221
现教221
现教221
现教221
现教221
四、课程设计考核及评分标准
课程设计考核将综合考虑学生考勤和参与度,系统设计方案正确性,系统设计和开发效果以及课程设计报告书的质量。
具体评分标准如下:
设置六个评分点
(1)设计方案正确,具有可行性、创新性;25分
(2)系统开发效果较好;25分
(3)态度认真、刻苦钻研、遵守纪律;10分
(4)设计报告规范、课程设计报告质量高、参考文献充分20分
(5)课程设计答辩概念清晰,内容正确10分
(6)课程设计期间的课堂考勤、答疑与统筹考虑。
10分
按上述六项分别记分后求和,总分按五级记分法记载最后成绩。
优秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),
不及格(0~59分)
目录
1.设计题目1
2.开发环境1
3.需求分析1
3.1设计目的1
3.2设计任务1
4.概要设计2
4.1系统模块2
4.2主要功能模块2
4.2.1Fish类2
4.2.2Net类3
4.2.3Pool类3
5.详细设计4
5.1游戏欢迎界面的设计4
5.2鼠标控制渔网的移动4
5.3网是如何捕到鱼5
5.4捕鱼达人流程图5
6.运行与调试7
6.1游戏开始7
6.2游戏结束7
7.心得体会8
8.参考文献8
附录9
1.设计题目
捕鱼达人
2.开发环境
Windowsxp系统
Eclipse8.5编写程序
3.需求分析
3.1设计目的
通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。
结合具体的开发案例捕鱼达人,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。
3.2设计任务
1)有游戏欢迎界面。
2)点击右键,网的power值变大。
3)点击左键,进行捕鱼。
4)每点击一个左键,体力值就会减少。
5)当捕到鱼时,体力值会有所回升,界面上会显示捕鱼数和得分。
6)当体力值用完后,会提示是否进行下一局,若选择是,则游戏重新开始;反之,则退出游戏。
4.概要设计
4.1系统模块
捕鱼达人主要分为5个模块,FishGame类,主要是规划游戏的框架;Fish类写鱼的属性;Net类写网的属性;Pool类;WelcomePanel类。
图4.1系统模块图
4.2主要功能模块
4.2.1Fish类
图4.2鱼类模块图
4.2.2Net类
图4.3渔网类模块图
4.2.3Pool类
图4.4鱼池类模块图
5.详细设计
5.1游戏欢迎界面的设计
在FishGame中画好游戏的框架,在WelcomePanel将
finalJFramewelcome=newJFrame("Welcome");
welcome.setSize(643,450);
welcome.setLocationRelativeTo(null);
welcome.setResizable(false);
welcome.setUndecorated(true);//隐藏框架
在WelcomePanel将背景图bg加载进来,在FishGame中将bg加载到框架中,使用setVisible使背景图显示出来
WelcomePanelwelcomePanel=newWelcomePanel();
welcome.add(welcomePanel);
welcome.setVisible(true);
5.2鼠标控制渔网的移动
利用鼠标监听的方法,获取鼠标在游戏界面上的坐标,然后将鼠标的x,y赋给网的x,y。
使用mouseEntered,mouseExited判断来判断鼠标是否在游戏界面内。
若在,则显示网;反之,则不显示网。
publicvoidinitMouseAdapter(){
MouseAdapterm=newMouseAdapter(){//监听鼠标移动的方法
publicvoidmouseMoved(MouseEvente){
intx=e.getX();
inty=e.getY();
//网跟着鼠标移动
net.x=x;
net.y=y;
}
//监听鼠标移入游戏界面的方法
publicvoidmouseEntered(MouseEvente){//网显示
net.show=true;
}
//监听鼠标移出界面的方法
publicvoidmouseExited(MouseEvente){//网消失
net.show=false;
}
5.3网是如何捕到鱼
网要想捕到鱼,首先判断网的中心点是否在鱼身上,若在鱼身上,鱼掉去power值的血量。
当鱼的血量小于0时,鱼相当于被捕到。
/*网捕鱼的方法*/
publicvoidcatchThe(Fishfish){
//如果网的中心店落在鱼的身上,就算捕上了
//如果捕上了,鱼掉血。
如果鱼的血量为负,死了。
if(catchOn(fish)){
//fish.blood掉血
fish.blood-=power;
}
}
/*判断网的中心点是否在鱼身上,是否捕上了这条鱼*/
publicbooleancatchOn(Fishfish){
returnx>=fish.x&&x<=fish.x+fish.width&&y>fish.y&&y<=fish.y+fish.height;
}
5.4捕鱼达人流程图
运行程序后,出现欢迎界面延时2秒后,显示游戏界面,点击鼠标右键网的大小发生改变,点击左键,进行捕鱼,体力值减少,当鱼的生命值小于0时,表示被捕到,当前体力值有所回升。
图5.1系统流程图
6.运行与调试
6.1游戏开始
图6.1游戏开始界面
6.2游戏结束
图6.2游戏结束界面
7.心得体会
通过捕鱼达人游戏的设计,我学会了很多新的知识。
这个游戏的设计是一个综合性的过程,这次课程设计使我进一步掌握了设计开发软件的方法与技术,培养创造性的工程设计能力和分析、解决问题的能力。
同时,在设计一个游戏时,要满足客户体验度,学会对开发出来的软件进行优化。
这次的课程设计让我对Java有了新的认识,首先我接触了很多上课见过见过但没有实际用过的类和方法,让我对编程有了许多新的思想。
老师讲解了一些从来没有用过的语句块,然后我们自己整合进入代码,再实现我们想要的功能。
编程是个艰难的过程,很多功能语句都需要上网或者是查其他书籍来查看他们的用法,课本上的东西对我们来说远远不够,我们要把目光放长远一些。
这次的课程设计使我对JAVA的许多东西都有了更深一步的了解,以前对自己的要求是看得懂就行,现在才发现,光能看懂是远远不够的,能看懂并不代表你会!
只有自己真的亲身体验到了,才会知道。
这次的课程设计是这个学期最累的两个礼拜,但是,我们的付出总算有回报,虽然我们的计算机可能还存在不少的问题,但是基本达到了我们预期的要求,所以,这次的课程设计同样是我最充实的一个课程设计。
同时也通过做课程设计学到了一点数据库的知识,感觉这些知识更贴近实际应用。
先从最简单的主窗体,到主窗体的菜单,组件添加,再到各个功能的独立窗体的建立,再到最后的数据库连接,功能的实现,一步步走来,收获颇多。
8.参考文献
1.[美]BruceEckel.ThinkingInJava.英文第4版.北京:
机械工业出版社,2007
2.陈轶.姚晓昆编著.Java程序设计实验指导.北京:
清华大学出版社,2006
3.杨昭编著.二级Java语言程序设计教程.北京:
中国水利水电出版社,2006
附录
Pool类代码:
packagecom.tarena.fishgame;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
publicclassPoolextendsJPanel{
BufferedImagebg;//背景图
//Fishfish=newFish();
Fish[]fishes=newFish[9+9+2];
Netnet;
staticintph_power=200;//体力
publicPool(){
try{
bg=ImageIO.read(newFile("images/bg.jpg"));
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
newPool();//初始化鱼和网
}
publicvoidnewPool(){
for(inti=0;iif(fishes[i]!
=null){
fishes[i].stop();
}
}
for(inti=0;i<9;i++){
fishes[i]=newFish(i+1);//给每一条鱼赋值
fishes[9+i]=newFish(i+1);
}
fishes[18]=newFish(13);
fishes[19]=newFish(14);
net=newNet();//创建了一个网的对象
for(inti=0;ifishes[i].start();//开启鱼线程,让鱼动起来
}
Fish.count=0;
Fish.score=0;
}
/*鼠标监听的事件*/
publicvoidinitMouseAdapter(){
MouseAdapterm=newMouseAdapter(){
//监听鼠标移动的方法
publicvoidmouseMoved(MouseEvente){
intx=e.getX();
inty=e.getY();
//System.out.println(x+","+y);//网的坐标
net.x=x;
net.y=y;
}
publicvoidmouseEntered(MouseEvente){
//网显示出来
net.show=true;
}
//监听鼠标移出游戏界面的方法
publicvoidmouseExited(MouseEvente){
//网消失
net.show=false;
}
//鼠标点击的方法
publicvoidmousePressed(MouseEvente){
//点击左键,捕鱼;点击右键,改变网的大小
intn=e.getModifiers();//获得鼠标点击的键的代号
//System.out.println(n);
if(n==4){
//网的大小变化
net.power++;
if(net.power==8){
net.power=1;
}
if(ph_powernet.power--;
}
net.changeThePower(net.power);//变图
}
if(n==16){
//捕鱼
if(ph_power>0){
ph_power-=net.power;
}
if(ph_power<=0){//游戏结束
JOptionPane.showMessageDialog(getRootPane(),"游戏结束了!
");
//是否进行下一局,m表示用户选着的按钮代号
intm=JOptionPane.showConfirmDialog(getRootPane(),"是否运行下一局");
if(m==JOptionPane.YES_OPTION){
//进行下一局
newPool();
ph_power=200;
//net.power=1;
System.out.println("重新开始");
}elseif(m==JOptionPane.NO_OPTION){
//结束游戏
System.exit(0);
}
}else{
for(inti=0;inet.catchThe(fishes[i]);//网捕鱼
}
ph_power-=net.power;
if(ph_power=0){
net.power=1;
net.changeThePower(net.power);
}
}
}
}
};
this.addMouseListener(m);//鼠标移动监听
this.addMouseMotionListener(m);//鼠标拖拽监听
}
/*画图*/
publicvoidpaint(Graphicsg){
//画背景
g.drawImage(bg,0,0,null);
//g.drawImage(fish.image,fish.x,fish.y,null);
for(inti=0;iFishf=fishes[i];//获取到要画的鱼
g.drawImage(f.image,f.x,f.y,null);
}
//写出网的power
g.setColor(Color.yellow);
Fontfont=newFont("宋体",Font.BOLD,25);
g.setFont(font);
g.drawString("当前POWER值为:
"+net.power,550,30);
g.setColor(Color.red);
Fontfont1=newFont("宋体",Font.BOLD,15);
g.setFont(font1);
g.drawString("点击右键改变网的大小",570,50);
g.setColor(Color.yellow);
g.drawString("当前体力值:
"+ph_power,20,20);
g.drawString("捕鱼数:
"+Fish.count,20,50);
g.drawString("得分为:
"+Fish.score,20,70);
//画网
if(net.show){
g.drawImage(net.image,net.x-net.width/2,net.y-net.height/2,null);
}
}
/*让鱼动起来,并且重回游戏界面的方法*/
publicvoidaction(){
initMouseAdapter();//添加鼠标监听
while(true){
repaint();
try{
Thread.sleep(1000/24);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
Fish类:
packagecom.tarena.fishgame;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjava.util.Random;
importjavax.imageio.ImageIO;
/*鱼类*/
publicclassFishextendsThread{
BufferedImageimage;//鱼的图片
BufferedImage[]images=newBufferedImage[10];//每一条鱼都有十张图
BufferedImage[]images_catch;
intx;//鱼的位置
inty;
intwidth;//鱼的宽和高
intheight;
intspeed;//鱼的游动速度
intblood;//血量
intindex;//表示第几条鱼
staticintcount;//捕鱼数
staticintscore;//得分
Randomrandom=newRandom();//随机函数生成器
publicFish(intindex){
//给图片数组初始化
if(index<8){
images_catch=newBufferedImage[2];
}else{
images_catch=newBufferedImage[4];
}
this.index=index;
Strings1=(index<10?
"0":
"")+index;//三目运算符
Strings2;
try{
//image=ImageIO.read(newFile("images/fish"+s1+"_01.png"));
for(inti=0;i<10;i++){//加载鱼的一组图片
s2=(i==9?
"":
"0")+(i+1);
images[i]=ImageIO.read(newFile("images/fish"+s1+"_"+s2+".png"));
}
for(inti=0;iimages_catch[i]=ImageIO.read(newFile("images/fish"+s1+"_catch_0"+(i+1)+".png"));
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
image=images[0];
width=image.getWidth();//把鱼图片的宽和高赋值给鱼
height=image.getHeight();
x=random.nextInt(800+width)-width;
y=random.nextInt(480+height)-height;
speed=random.nextInt(4)+3;//3-6
blood=index*3;
}
/*线程的方法,鱼游动*/
publicvoidrun(){
inti=0;
while(true){
x-=speed;
image=images[i++%10];
if(x<-width){//如果鱼过了左边界,鱼出场
getOut();
}
if(blood<=0){
//挣扎,出场
turnOver();
getOut();
}
try{
Thread.sleep(1000/20);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
/*鱼出场的方法*/
publicvoid