java捕鱼达人课程设计.docx
- 文档编号:30766034
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:32
- 大小:3.75MB
java捕鱼达人课程设计.docx
《java捕鱼达人课程设计.docx》由会员分享,可在线阅读,更多相关《java捕鱼达人课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
java捕鱼达人课程设计
武汉理工大学华夏学院
课程设计报告书
课程名称:
智能手机软件开发
题目:
捕鱼达人
系名:
信息工程系
专业班级:
计算机1112
**********
学号:
***********
********
2014年6月20日
武汉理工大学华夏学院信息工程系
课程设计任务书
课程名称:
智能手机软件开发课程设计指导教师:
凌伟
班级名称:
计算机1111开课系、教研室:
自动化与计算机
三、课程设计目的与任务
本课程的设计的目的是通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。
结合具体的开发案例捕鱼达人,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。
二、课程设计的内容与基本要求
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.设计题目
捕鱼达人
2.开发环境
Eclipse软件开发环境,PC机一台,windows操作系统。
3.需求分析
3.1设计目的
捕鱼达人这个项目是一个娱乐性的游戏开发,该游戏可以给人们带来娱乐的同时还可以给人感官上的享受,所以很受人们的欢迎。
本次游戏的程序设计包含,javaswing组件的合理运用,还有图像的变动达到一个动态的动画效果,线程的运用,游戏的异常处理,等方面的知识。
培养学生运用所学知识的基础理论、基本知识和基本技能,分析解决实际问题能力的一个重要环节。
它与课堂教学环节彼此配合,相辅相成,在某种程度上是课堂学习的继续、深化和检验。
它的实践性和综合性是其它教学环节所不能代替的。
课程设计能使学生受到必需的综合训练,在不同程度上提高各种能力。
通过课程设计,使学生熟练掌握Java语言课程中所学的理论知识,通过综合Java语言的基本知识来解决实际问题,加强学生分析和解决问题的能力。
3.2、设计要求
框架:
2个场景,WelcomePanel,FishGame。
流程:
1)WelcomePanel:
该场景是专门用来做一个欢迎动画的。
2)FishGame:
用来运行游戏的载体窗口。
与用户交流的界面,鱼儿在该window窗体上游动,玩家在上面捕鱼,然后计分等等。
4.概要设计
4.1设计原理及其分析
1.初始化界面需要800*500大小,需要一个游戏开始欢迎界面,游戏框上显示“欢迎捕鱼达人游戏”,3秒之后进入游戏界面,命名为“捕鱼达人”
2.在程序中,我们需要对每一条鱼进行操作(移动,游动,捕鱼,死亡,复活),所以每条鱼我们将它定义为一个对象的线程,便于对鱼的完美操作与控制,游戏中我们定义了7种小鱼和4种大鱼,每条鱼都有两条,所以鱼池中有22条鱼,鱼的数量达到了一定的饱和。
3.鱼的每次移动,它的水平坐标改变了,所以我们需要将它移动之后的状态重画(repaint()方法)出来,从而达到鱼是在移动的。
4.捕鱼的效果,我们被网赋一个能量值,可以改变网的大小,来改变网的能量的大小,而鱼就需要有一个血量值(大鱼的血量高,小鱼血量低),当网在鱼的范围之内的时候,点击鼠标左键让鱼扣除相应的血量值,鼠标右键控制网的大小,点击一下改变一下网的大小,当鱼的血量小于0的时候,鱼就会弹跳几下然后消失,达到捕鱼成功。
5.每个游戏都是需要平衡的,所以我们不能一直捕鱼下去。
体力值,计分,捕鱼条数,等数据来平衡游戏。
当体力值小于0的时候就结束游戏,而捕一条鱼,加上相应鱼的分数,而捕鱼条数上就加1,体力值也相应的回复一部分,不同的鱼分数不同,回复体力值也不同,基本上大鱼分数高,小于分数低。
最后判定输赢就是看分数的高低。
4.2本游戏的模块图
分别有:
鱼的模块,网的模块,鱼池的模块,游戏的模块,每一个模块相当于一个类,
鱼模块:
主要实现鱼图片的加载,鱼游动效果,鱼游动,还有鱼的一些基本属性,
比如鱼的坐标,大小,还有血量值。
一些基本方法,鱼的构造方法。
网模块:
主要实现渔网图片的加载,渔网的属性有坐标,大小的宽和高,还有渔网的power值,渔网中还有一个改变渔网大小的方法。
鱼池模块:
将鱼类的对象,网类的对象都在本类中进行调用,并将相应对象的图片显示出来,并将游戏的背景‘画’出来。
欢迎模块:
将欢迎的图片加载进来。
图4.1系统模块图
图4.2系统类图
5.详细设计
5.1游戏欢迎界面的设计
创建游戏的运行界面的框架,带有main()函数的类,FishGame.java类,专门用来承载游戏的运行,在主函数中创建JFram类的一个对象,即创建window视窗,然后设置大小,默认居中显示,大小不可以改变等功能,具体代码如下:
finalJFramewelcome=newJFrame("欢迎光临");
welcome.setSize(643,435);
welcome.setLocationRelativeTo(null);
welcome.setResizable(false);
welcome.setVisible(true);
图5.1游戏运行的框架
创建WelcomePanel.java类,专门用来创建‘画笔’(即paint()方法),画出要显示出来的欢迎界面,既然是开始界面,我们还要去掉边框,还要等待几秒钟后才能进入游戏界面。
所以王某要创建一个Timer类的一个对象,来合理分配时间上的任务。
实现代码如下:
在WelcomePanel类中:
publicclassWelcomPanelextendsJPanel{
BufferedImagebg;
publicWelcomPanel(){
try{
bg=ImageIO.read(newFile("images/welcome.jpg"));//加载本地的图片
}catch(IOExceptione){
e.printStackTrace();}}
publicvoidpaint(Graphicsg){//g相当于是画笔
g.drawImage(bg,0,0,null);//画图片
}}
然后在FishGame类中的main()函数中创建WelcomPanel类的一个对象,将画出来的动画在创建好的JFrame框架上显示出来。
具体代码如下:
welcome.setUndecorated(true);//隐藏框架,大小不可变
WelcomPanelwel=newWelcomPanel();
welcome.add(wel);
welcome.setVisible(true);//显示
显示效果如下:
图5.2欢迎图画显示
5.2游戏背景的设计
创建的Pool.java类要继承JPanel类,用paint()的方法画出游戏运行的效果出来,首先画出游戏的背景出来。
具体画出的过程如WelcomPanel类的方法类似。
然后再在FishGame.java类中的main()添加如下代码:
finalJFramewin=newJFrame("捕鱼达人游戏");
win.setSize(800,500);
win.setLocationRelativeTo(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Poolbuyu=newPool();win.add(buyu);
Timertimer=newTimer();
timer.schedule(newTimerTask(){
publicvoidrun(){//3秒之后,欢迎界面关闭,游戏窗口打开
welcome.setVisible(false);
win.setVisible(true);
}
},3000);
buyu.action();//调用Pool类对象buyu的action()方法
运行后的游戏背景如下图:
图5.3游戏运行背景
5.3游戏中鱼的设计
创建Fish.java类。
在这个类之中,我们要创建鱼的对象,但是为了方便启动每一条鱼,我们将Fish.java的类继承了Thread类,这样,每一条鱼就相当于一个线程,每一个线程我们就可以对它分别进行控制,比如移动,速度,血量,当然还有鱼游动的效果。
在玩家所看见鱼儿游动的效果其实就是鱼儿游动的一张张图片在不停的变换。
我们所做的鱼儿素材只有静态的图片。
根据研究,只要换的图片帧数达到23张每秒我们就会认为图片就是动的。
所以在鱼儿游动的时候我们还要调用Tread.sleep(1000/60)相当于1秒钟换了60张图片。
速度上已经相当快了。
这里我们在构造方法里面写出BufferedImage类的一个数组对象,将鱼游动的不同图片用缓冲技术将图片加载到游戏中去,加快游戏运行速度,当然由于鱼的类型不同,所以需要写出两个变量出来s1和s2,s1代表不同种类的鱼类,s2代表同一种鱼的不同的游动的样子。
将代码写入Fish.javaL类的构造方法中,如下:
for(inti=0;i<10;i++)
{images[i]=ImageIO.read(newFile("images/fish"+s1+"_"+s2+".png"));}
该构造函数是一个带参数的构造函数,s1就是传过来的参数,鱼的种类有1~9种,加上大于2种共11种鱼。
鱼的移动,鱼有几个属性如下:
x,y代表鱼的左上角的坐标,width,height代表当前鱼的图片的一个宽和高。
我们就对这次的实验做一个简单的要求。
所有的鱼儿都是从最右边开始的。
用一个Random的随机函数随机出鱼出场的位置:
x=random.nextInt(780+width)-width;y=random.nextInt(470+height)-height;speed=random.nextInt(4)+3;//3~6这几句代码的意思是随机出鱼出场的位置在右边,且高度不能超过游戏界面的高度,而随机出来的速度,可以使鱼儿游的快与慢。
不至于所有的鱼儿以相同频率游动。
再写一个step()方法,每Thread.sleep(1000/10)秒,鱼儿就左移一次:
x-=speed;图片也相应的换一次image=images[i++%10];这里与10取余的意思是我们每一种鱼都有10张游动的图片。
当然鱼游出界的时候,鱼儿就重新随机出新的位置来具体实现代码如下:
publicvoidrun(){
inti=0;
while(true){
x-=speed;
image=images[i++%10];//鱼儿每游动一下换一帧图片
if(x<-width){//如果鱼过了左边界,就出场
getOut();}//该方法是用来对鱼的出场处理,给鱼重新随机出新的位置
try{
Thread.sleep(1000/10);
}catch(InterruptedExceptione){e.printStackTrace();}}}
鱼的类王某已经创建完毕,所以王某接下来就是要在Pool类的piant()方法中画出鱼,在此游戏中,王某把每一条鱼都创建了两次,使得鱼池中的鱼不至于嫌少,
代码如下:
for(inti=0;i Fishf=fishes[i]; g.drawImage(f.image,f.x,f.y,null); } 以上代码中,g相当于是paint方法中的一个画笔,用循环的方法将各种鱼画出来,fishes[22]数组代表的是22条鱼,即Fish类的一个数组对象(或者线程)。 在画板中画出鱼后,王某还要启动该鱼的线程: 用for循环将每条鱼的线程启动: fishes[i].start(),i取值0~22。 其实这样的话鱼已经可以移动了,但是,在运行出来以后,其实鱼还没动,这是因为,画面定格了,所以我们需要调用系统的repaint()方法,将鱼游动之后的样子画出来,通过不停的重画,使鱼儿游动起来。 在Pool类中添加action()方法,用一个死循环,不停的重画,然后线程停顿一下Tread.sleep(1000/10)。 最后在FishGame.java中的main()方法中用Pool的对象调用action()方法即可。 运行效果如下: 图5.4在游戏中画出鱼 5.4渔网的设计 创建Net.java类。 与创建鱼的方法类似。 渔网有x,y,表示渔网左上角的坐标,width,height表示渔网的款和高,power,代表渔网的能量值,渔网的网号鱼大,power值越大。 渔网有7中图片,用BufferedImage的数组将本地的7个渔网图片都加载进来,在构造方法中写如下主要代码: for(inti=0;i<7;i++) images[i]=ImageIO.read(newFile("images/net_"+(i+1)+".png")); 同样的道理,在Pool类中的piant()方法中画出渔网, if(net.show){ g.drawImage(net.image,net.x-net.width/2,net.y-net.height/2,null);} show是渔网的一个boolean属性,当他为true时,显示渔网,否则不显示,这是因为当我们鼠标出去游戏界面的时候,不需要显示渔网。 而且在游戏中,王某的渔网是跟着鼠标动的,鼠标在哪,我们的渔网就在哪,所以我们用鼠标监听来处理该事件,鼠标右键点击一下,我们就换一下网,同样的网的power值也将改变。 具体代码在Pool类中写: publicvoidinitMouseAdapter(){ MouseAdapterm=newMouseAdapter(){//监听鼠标移动的方法 publicvoidmouseMoved(MouseEvente){//渔网的位置等于鼠标的位置 intx=e.getX();inty=e.getY(); net.x=x;net.y=y;} publicvoidmousePressed(MouseEvente){//鼠标右键触发来改变渔网的大小 //点击左键捕鱼,右键改变网的大小 intn=e.getModifiers();//获得鼠标的左右位置 System.out.println(n); if(n==4){ net.power++;net.changeThePower(net.power);} publicvoidmouseEntered(MouseEvente){//鼠标进入,渔网显示 net.show=true;} publicvoidmouseExited(MouseEvente){//鼠标出来,渔网不显示 net.show=false;}}; this.addMouseListener(m);//添加鼠标事件监听 this.addMouseMotionListener(m); } 5.5游戏的平衡设计 这个游戏的基本元素都已经设计出来了。 鱼池,鱼,网等都已经实现了,但毕竟这是一个游戏,所以我们还在本游戏中添加了一些游戏的分数,鱼的条数,体力值,还有血量。 大体的就是 在我们有限的体力值内,可以改变渔网的大小(鼠标右键点击,点一下,渔网变大一下,当渔网的编号大于6时,渔网编号重新变为0),来扣除鱼的血量。 当网的中心位置在鱼的图片范围之内是,鼠标左键点击一下就扣除鱼的血量值,具体扣多少要看当前渔网的power值。 而鱼的血量是根据鱼的大小来设定的,大于血量厚,小鱼血量薄,当鱼死之后,鱼就会翻身弹跳几下,实现过程是在鱼死之后根据以上鱼儿游动的效果一样,换上几张鱼被捕之后的图片即可实现。 而当鱼死后,会加上相应的分数,和回复一定的体力值。 当体力值为0的时候,游戏就结束,判断输赢就根据分数来判断。 在Fish.java定义属性有: intblood;//鱼的血量 staticintcount;//捕鱼条数的计数,静态的属性实现累加 staticintscore;//捕鱼后得到的分数 再在该类中添加如下方法,使鱼在死之后进行翻身,达到更好的捕鱼体验,鱼死后就会count++代表又捕到了一条鱼,而分数根据鱼的种类(index属性)的5倍。 privatevoidturnOver(){ for(intj=0;j<3;j++){ for(inti=0;i {image=catchFish[i]; try{Thread.sleep(1000/15); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}}count++; score+=index*5; } 在Pool.java类中我们添加staticintphysics_power;属性,用来记录当前的用户体力值。 该游戏的主要操作是靠鼠标来操作的,所以添加了鼠标监听,然后通过n=e.getModifiers()这句代码获得鼠标的左右位置,左边点击时n=4,代表我们捕鱼的动作。 点击鼠标右边,n=16,代表我们可以变换渔网的大小,在鼠标左击之后,鱼儿扣血,相应的体力值减少,然后判断,体力值是否小于零,如果小于零就弹出对话框,问用户是否结束。 。 具体实现的代码如下: publicvoidinitMouseAdapter(){ publicvoidmousePressed(MouseEvente){ intn=e.getModifiers();//获得鼠标的左右位置 if(n==4){net.power++; if(net.power==8){net.power=1;} if(physics_power net.changeThePower(net.power);} if(n==16){//捕鱼 if(physics_power<=0){ JOptionPane.showMessageDialog(getRootPane(),"游戏结束了"); intm=JOptionPane.showConfirmDialog(getRootPane(),"是否进行下一局"); if(m==JOptionPane.YES_OPTION){ System.out.println("下一局"); newPool();//该方法是将所有数据清零,然后重新开始游戏 }elseif(m==JOptionPane.NO_OPTION){ System.out.println("游戏结束"); System.exit(0);}}else{ for(inti=0;i net.catchThe(fishes[i]);//网捕鱼 physics_power-=net.power; if(physics_power =0) {net.power=physics_power; net.changeThePower(net.power);}}}} 为了提高用户的体验度,我们将以上的属性都在页面上显示出来,有如下属性: 当前的网的大小或者所当前渔网的power值,还有当前的体力值,还有捕鱼的条数,分数,所以我们需要在Pool.java类中的piant()方法中添加如下代码: g.setColor(Color.yellow); Fontfont=newFont("宋体",Font.BOLD,25);g.setFont(font); g.drawString("当前的能量大小为: "+net.power,0,30); g.drawString("体力值为"+physics_power,400,30); g.setColor(Color.red); Fontfont1=newFont("宋体",Font.BOLD,15);g.setFont(font1); g.drawString("点击右键改变网的大小",0,50); g.drawString("当前的条数为"+Fish.count,0,70); g.drawString("得分为: "+Fish.score,0,90); 6.测试与运行 6.1进行游戏测试 图6.1捕鱼过程 6.2体力值为零的时弹出对话框。 图6.2游戏结束 6.3游戏结束后进行选择 点击确定按钮后,再度提示,增加游戏体验度。 点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 捕鱼 课程设计