大鱼吃小鱼课程设计 报告.docx
《大鱼吃小鱼课程设计 报告.docx》由会员分享,可在线阅读,更多相关《大鱼吃小鱼课程设计 报告.docx(16页珍藏版)》请在冰豆网上搜索。
大鱼吃小鱼课程设计报告
学号
1208020211
2013-2014学年第二学期
《面向对象程序设计》
课程设计报告
题目:
大鱼吃小鱼
专业:
网络工程
班级:
网络工程12
(2)
姓名:
管蔚雄
指导教师:
徐宁
成绩:
计算机与信息工程系
2014年6月6日
第一章设计的目的与要求............................................................................2
1.1设计目的......................................................................................................2
1.2设计要求......................................................................................................2
1.3实现功能......................................................................................................2
1.4界面设计......................................................................................................2
第二章开发平台与技术...................................................................................3
2.1java语言....................................................................................................3
2.2greenfoot....................................................................................................4
2.3环境配置.....................................................................................................5
第3章模块具体实现和主要动画触发.......................................................7
小结........................................................................................................................8
参考文献...............................................................................................................8
附录........................................................................................................................9
大鱼吃小鱼
第一章设计目的与要求
1.1设计目的
通过用greenfoot来设计“大鱼吃小鱼”这个游戏,来熟悉
并学会运用greenfoot这个软件的同时巩固我们专业课java知识。
1.2设计要求
1.熟悉GreenFoot平台;
2.对游戏中所需类进行设计;
3.写出源程序文件;
4.对游戏进行调试和分析。
1.3实现功能
敌方有三类鱼(鲨鱼、蓝鱼和小黄鱼),每一类鱼的对象出现后,在游戏中处于随机自由移动状态,敌方大鱼能吃小鱼;主角为红鱼且红鱼只有一条,玩家通过键盘方向键控制移动,红鱼有两级状态,初始时处于低级状态,只能吃黄鱼,能被蓝鱼或鲨鱼吃掉。
初级状态的红鱼经过重重险恶且吃掉一定数量的黄鱼升级后,能吃黄鱼和蓝鱼,但还是能被鲨鱼吃。
吃掉一定数量的鱼,则显示成功信息,结束游戏;若红鱼被鲨鱼或蓝鱼吃掉,则显示失败信息。
1.4界面设计
红鱼是主角,玩家通过键盘方向键控制移动,红鱼有两级状态:
初级状态只能吃小黄鱼,会被蓝鱼和鲨鱼吃掉;吃掉20条小黄鱼后回升级即长大,能吃掉蓝鱼,但还是能被鲨鱼吃掉。
红鱼升级后,吃黄鱼数量达到40,蓝鱼数量达到20,显示成功信息,结束游戏;若红鱼被鲨鱼或蓝鱼吃掉,显示失败信息。
敌方大鱼能吃小鱼,即鲨鱼吃蓝鱼和黄鱼,蓝鱼吃黄鱼。
第二章开发平台和技术
2.1Java语言
简单性:
Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。
Java语言的简单性主要体现在以下三个方面:
Java的风格类似于C++,但是Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。
Java提供了丰富的类库。
Java自身的基本系统所占用空间小于250KB(即编译器和解释器),它实现了垃圾自动收集,简化了内存的管理工作。
可靠性和安全性:
Java不支持指针,这杜绝了内存的非法访问。
Java的自动单元收集防止了内存丢失等动态内存分配导致的问题。
Java解释器运行时实施检査,可以发现数组和宇符串访问的越界;Java提供了异常处理机制,以便从错误处理任务恢复。
Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。
当Java字节码进进入解释器时,首先必须经过字节码校验器的检查,然后Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域。
跨平台性:
面向对象:
把程序实现的每一个具体功能作为类,然后用类来构成对象。
优点是代码可重用、系统易扩展。
多线程:
通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,提高系统的运行效率。
分布性:
分布式包括数据分布和操作分布。
数据分布是指数据可以分散在网络的不同主机上;操作分布是指把一个计箅分散在不同主机上处理。
它支持以上两种分布性。
对于前者,Java提供了一个叫做URL的对象,利用这个对象,可以访问Internet上的所有网络资源;对于后者,Java提供的基于流套接字的网络编程接口,为实现网络的应用和Web应用提供了方便。
丰富的类库和API文档
2.2GreenFoot
Greenfoot是由肯特大学的Michael和Martin开发的一款游戏程序设计平台,主要用于程序设计的辅助教学。
它是一个功能完整的开发环境,可以方便地编写游戏和进行游戏模拟。
Greenfoot也可看做是一个二维图形程序框架和集成开发环境的结合体,它支持面向对象程序设计的全部特性,特别适;合进行基于组件的可视化编程。
Greenfoot具备以下几个特点:
(1)可视化程序设计界面
(2)游戏案例作为项目单元
(3)良好的社区支持
2.3环境配置
开发运行环境:
JDK(JavaDevelopmentKit)+文本编辑器(UltraEdit)
JDK是java开发工具包,包括java类库、java编译器、java解释器、java
运行环境和java命令行工具。
IDE:
集成开发工具
JCreator(Xinox)
JBuilder(Borland)
VisualJ++(MicroSoft)
VisualAgeforJava(IBM)
NetBeansbeans.org
Eclipsehttp:
//www.eclipse.org/downloads
JDK的安装
安装:
和一般应用程序相似,有向导指引。
环境变量的设置:
Path使得系统可以在任何路径下识别java命令。
Classpath为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别。
JDK的安装路径:
C:
\Java\jdk
path路径为:
C:
\Java\jdk\bin
classpath路径为:
.;C:
\Java\jdk\lib
Greenfoot安装:
Greenfoot软件直接在自己的pc机上安装即可用。
第3章模块具体实现和主要动画触发
涉及的类及类名
本实验中world类中有一个子类sea,actor类中有十个子类,分别是主角类即红鱼类Redfish,黄鱼两个类yellowfish1与yellowfish2,蓝鱼两个类bluefish1与bluefish2,鲨鱼类shark,水泡类blister,一个计数器Counter,一个Scoreboard,一个success。
各类实现的效果
sea类:
添加了一个红鱼的对象即主角;计数器的两个对象分别是用于计数吃掉黄鱼的数量和吃掉蓝鱼的数量;黄鱼与蓝鱼在世界里处于随机出现自由移动状态;实现计数器加一的方法;游戏结束的方法;游戏成功的方法;背景音乐循环播放。
Redfish类:
红鱼设置四种状态,在构造方法中设置了其初始状态,然后通过if判断语句来限制它的状态;在act方法中设置了关联键盘向左移游戏动作;吃黄鱼蓝鱼动作,具体实现通过if语句控制;鱼升级及游戏成功也是在act方法中用if语句来限定。
yellowfish1与yellowfish2类:
黄鱼在边界消失。
bluefish1与bluefish2类:
蓝鱼在边界消失;在其act方法里设置了吃黄鱼,通过if语句,并调用sea类的getCount()方法,其数值小于等于20情况下可以吃红鱼。
shark类:
鲨鱼在边界消失;在act方法中设置了吃黄鱼,蓝鱼,红鱼,并且当吃到红鱼,游戏结束,调用sea类的gameover方法。
blister类:
水泡在边界消失。
ScoreBoard与success类:
主要是绘制分数界面背景。
Counter类:
用于计数的类。
小结
此次课程设计,使我更扎实的掌握了本学期专业课java知识。
当然,设计过程中遇到了一些困难和问题,实在想不出来的问同学或请教老师,终于游逆而解。
课程设计体现出自己综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱之处。
实践出真知,通过亲自设计,使我们掌握的知识不再是是纸上谈兵。
说实话,本次课程设计花了不少时间,时间主要花在游戏设计即代码上,游戏做好后,感觉所花时间是值得的,个人对自己设计游戏较满意,虽然不是做得那么精致,还存在些许需要改进的地方,我想以后有机会继续完善它。
我认为,在这次课程设计中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验中,我学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。
参考文献:
Greenfoot官方网站;
Java程序设计教程(牛晓太主编)。
附录:
(部分代码)
sea类:
importgreenfoot.*;
publicclassseaextendsWorld
{
Countermycounter;
Countermycounter1;
GreenfootSoundmusic;
publicsea()
{
super(800,600,1);
addObject(newRedfish(),400,300);
mycounter=newCounter("吃掉的yellowfish数量:
");
mycounter1=newCounter("吃掉的blue数量:
");
addObject(mycounter,100,20);
addObject(mycounter1,300,20);
music=newGreenfootSound("justinbieber-mistletoe.mp3");
}
publicvoidact(){
music.playLoop();
if(Greenfoot.getRandomNumber(100)<3)
{addObject(newyellowfish1(),0,Greenfoot.getRandomNumber(600));
addObject(newyellowfish2(),800,Greenfoot.getRandomNumber(600));
}
if(Greenfoot.getRandomNumber(100)<1)
{addObject(newbluefish1(),0,Greenfoot.getRandomNumber(600));
addObject(newbluefish2(),800,Greenfoot.getRandomNumber(600));
addObject(newshark(),0,Greenfoot.getRandomNumber(600));
addObject(newblister(),Greenfoot.getRandomNumber(800),600);
}
}
publicvoidcountChange(){
mycounter.setValue(mycounter.getValue()+1);
}
publicvoidcountChange1(){
mycounter1.setValue(mycounter1.getValue()+1);
}
publicintgetCount(){
returnmycounter.getValue();}
publicintgetCount1(){
returnmycounter1.getValue();}
publicvoidgameOver()
{addObject(newScoreBoard(10*(mycounter.getValue())+20*(mycounter1.getValue())),getWidth()/2,getHeight()/2);
}
publicvoidgameWin()
{addObject(newsuccess(10*(mycounter.getValue())+20*(mycounter1.getValue())),getWidth()/2,getHeight()/2);
}
}
Redfish类:
importgreenfoot.*;
publicclassRedfishextendsActor
{GreenfootImagesmallL=newGreenfootImage("Z1L.png");
GreenfootImagesmallR=newGreenfootImage("Z1R.png");
GreenfootImageoldL=newGreenfootImage("Z2L.png");
GreenfootImageoldR=newGreenfootImage("Z2R.png");
publicRedfish()
{setImage(smallL);
}
publicvoidact()
{if(Greenfoot.isKeyDown("right")){
if(((sea)getWorld()).getCount()>20){
setImage(oldR);}
else{setImage(smallR);}
move(5);}
if(Greenfoot.isKeyDown("left")){
if(((sea)getWorld()).getCount()>20){
setImage(oldL);}
else{setImage(smallL);}
move(-5);
}
if(Greenfoot.isKeyDown("up"))
{setLocation(getX(),getY()-5);
}
if(Greenfoot.isKeyDown("down"))
{setLocation(getX(),getY()+5);
}
if(((sea)getWorld()).getCount()>20)
{if(getImage()==smallL)
{setImage(oldL);}
if(getImage()==smallR)
{setImage(oldR);}
getbluefish();
}
getyellowfish();
if(((sea)getWorld()).getCount()>40&&((sea)getWorld()).getCount1()>20){
Greenfoot.stop();
((sea)getWorld()).music.stop();
((sea)getWorld()).gameWin();
}
}
publicvoidgetyellowfish()
{
yellowfish1yellow1=(yellowfish1)getOneIntersectingObject(yellowfish1.class);
yellowfish2yellow2=(yellowfish2)getOneIntersectingObject(yellowfish2.class);
if(yellow1!
=null)
{
Greenfoot.playSound("pop.wav");
yellow1.disappear();
((sea)getWorld()).countChange();
}
if(yellow2!
=null)
{
Greenfoot.playSound("pop.wav");
yellow2.disappear();
((sea)getWorld()).countChange();
}
}
publicvoidgetbluefish(){
bluefish1blue1=(bluefish1)getOneIntersectingObject(bluefish1.class);
bluefish2blue2=(bluefish2)getOneIntersectingObject(bluefish2.class);
if(blue1!
=null)
{blue1.disappear();
Greenfoot.playSound("eating.wav");
((sea)getWorld()).countChange1();
}
if(blue2!
=null)
{blue2.disappear();
Greenfoot.playSound("eating.wav");
((sea)getWorld()).countChange1();
}
}
}