捕鱼达人

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

武汉理工大学华夏学院课程设计报告书
课程名称:智能手机软件开发
题目:捕鱼达人
系名:
专业班级:
姓名:
学号:
指导教师:
武汉理工大学华夏学院信息工程系
课程设计任务书
课程名称:智能手机软件开发课程设计指导教师:
班级名称:开课系、教研室:
一、课程设计目的与任务
本课程的设计的目的是通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。

结合具体的开发案例捕鱼达人,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。

二、课程设计的内容与基本要求
1、课程设计题目
捕鱼达人
2、课程设计内容
要求学生根据所学的软件工程的理念,利用所学的Android 手机开发的知识,开发一个智能手机游戏捕鱼达人,并针对该手机游戏软件进行需求分析,总体设计、详细设计、编码、测试。

游戏操作
鼠标移动/键盘方向键←→控制炮台射击方向,点击鼠标左键/按空格键射击撒网抓鱼,点击下方的红色+号和-号按钮/数字键1-8键/方向键↑键/滑动鼠标滑轮切换炮台游戏背景音乐设计
游戏背景动画设计
游戏界面设计
游戏关卡设计
游戏积分榜的设计
三、课程设计步骤及时间进度和场地安排
本课程设计将安排在第18周, 教育技术中心。

具体安排如下:
第一天,系统开发平台搭建及主流开发工具安装
第二天,游戏界面的设计
第三天,游戏业务的设计
第四天,游戏关卡的设计
第五天,系统调试测试打包和验收
四、课程设计考核及评分标准
课程设计考核将综合考虑学生考勤和参与度,系统设计方案正确性,系统设计和开发效果以及课程设计报告书的质量。

具体评分标准如下:
设置六个评分点
(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.1 Fish类 (2)
4.2.2 Net类 (3)
4.2.3 Pool类 (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.开发环境
Windows xp系统
Eclipse 8.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.1 Fish类
图4.2鱼类模块图
4.2.2 Net类
图4.3渔网类模块图4.2.3 Pool类
图4.4鱼池类模块图
5.详细设计
5.1游戏欢迎界面的设计
在FishGame中画好游戏的框架,在WelcomePanel将
final JFrame welcome=new JFrame("Welcome");
welcome.setSize(643,450);
welcome.setLocationRelativeTo(null);
welcome.setResizable(false);
welcome.setUndecorated(true);//隐藏框架
在WelcomePanel将背景图bg加载进来,在FishGame中将bg加载到框架中,使用setVisible 使背景图显示出来
WelcomePanel welcomePanel=new WelcomePanel();
welcome.add(welcomePanel);
welcome.setVisible(true);
5.2鼠标控制渔网的移动
利用鼠标监听的方法,获取鼠标在游戏界面上的坐标,然后将鼠标的x,y赋给网的x,y。

使用mouseEntered,mouseExited判断来判断鼠标是否在游戏界面内。

若在,则显示网;反之,则不显示网。

public void initMouseAdapter(){
MouseAdapter m=new MouseAdapter(){//监听鼠标移动的方法
public void mouseMoved(MouseEvent e) {
int x=e.getX();
int y=e.getY();
//网跟着鼠标移动
net.x=x;
net.y=y;
}
//监听鼠标移入游戏界面的方法
public void mouseEntered(MouseEvent e){ //网显示
net.show=true;
}
//监听鼠标移出界面的方法
public void mouseExited(MouseEvent e){ //网消失
net.show=false;
}
5.3网是如何捕到鱼
网要想捕到鱼,首先判断网的中心点是否在鱼身上,若在鱼身上,鱼掉去power值的血量。

当鱼的血量小于0时,鱼相当于被捕到。

/*网捕鱼的方法*/
public void catchThe(Fish fish){
//如果网的中心店落在鱼的身上,就算捕上了
//如果捕上了,鱼掉血。

如果鱼的血量为负,死了。

if(catchOn(fish)){
//fish.blood 掉血
fish.blood-=power;
}
}
/*判断网的中心点是否在鱼身上,是否捕上了这条鱼*/
public boolean catchOn(Fish fish){
return x>=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有了新的认识,首先我接触了很多上课见过见过但没有实际用过的类和方法,让我对编程有了许多新的思想。

老师讲解了一些从来没有用过的语句块,然后我们自己整合进入代码,再实现我们想要的功能。

编程是个艰难的过程,很多功能语句都需要上网或者是查其他书籍来查看他们的用法,课本上的东西对我们来说远远不够,我们要把目光放长远一些。

这次的课程设计使我对JA V A的许多东西都有了更深一步的了解,以前对自己的要求是看得懂就行,现在才发现,光能看懂是远远不够的,能看懂并不代表你会!只有自己真的亲身体验到了,才会知道。

这次的课程设计是这个学期最累的两个礼拜,但是,我们的付出总算有回报,虽然我们的计算机可能还存在不少的问题,但是基本达到了我们预期的要求,所以,这次的课程设计同样是我最充实的一个课程设计。

同时也通过做课程设计学到了一点数据库的知识,感觉这些知识更贴近实际应用。

先从最简单的主窗体,到主窗体的菜单,组件添加,再到各个功能的独立窗体的建立,再到最后的数据库连接,功能的实现,一步步走来,收获颇多。

8.参考文献
1. [美]Bruce Eckel. Thinking In Java.英文第4版.北京:机械工业出版社,2007
2. 陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006
3 .杨昭编著.二级Java语言程序设计教程.北京:中国水利水电出版社,2006
附录
Pool类代码:
package com.tarena.fishgame;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Pool extends JPanel {
BufferedImage bg; //背景图
// Fish fish=new Fish();
Fish[] fishes=new Fish[9+9+2];
Net net;
static int ph_power=200;//体力
public Pool(){
try {
bg=ImageIO.read(new File("images/bg.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
newPool();//初始化鱼和网
}
public void newPool(){
for(int i=0;i<fishes.length;i++){
if(fishes[i]!=null){
fishes[i].stop();
}
}
for(int i=0;i<9;i++){
fishes[i]=new Fish(i+1);//给每一条鱼赋值
fishes[9+i]=new Fish(i+1);
}
fishes[18]=new Fish(13);
fishes[19]=new Fish(14);
net =new Net(); //创建了一个网的对象
for(int i=0;i<fishes.length;i++){
fishes[i].start();//开启鱼线程,让鱼动起来
}
Fish.count=0;
Fish.score=0;
}
/*鼠标监听的事件*/
public void initMouseAdapter(){
MouseAdapter m=new MouseAdapter(){
//监听鼠标移动的方法
public void mouseMoved(MouseEvent e) {
int x=e.getX();
int y=e.getY();
// System.out.println(x+","+y); //网的坐标
net.x=x;
net.y=y;
}
public void mouseEntered(MouseEvent e){
//网显示出来
net.show=true;
}
//监听鼠标移出游戏界面的方法
public void mouseExited(MouseEvent e){
//网消失
net.show=false;
}
//鼠标点击的方法
public void mousePressed(MouseEvent e) {
//点击左键,捕鱼;点击右键,改变网的大小
int n=e.getModifiers();//获得鼠标点击的键的代号
//System.out.println(n);
if(n==4){
//网的大小变化
net.power++;
if(net.power==8){
net.power=1;
}
if(ph_power<net.power){
net.power--;
}
net.changeThePower(net.power);//变图
}
if(n==16){
//捕鱼
if(ph_power>0){
ph_power-=net.power;
}
if(ph_power<=0){//游戏结束
JOptionPane.showMessageDialog(getRootPane(), "游戏结束了!");
//是否进行下一局,m表示用户选着的按钮代号
int m=JOptionPane.showConfirmDialog(getRootPane(), "是否运行下一局");
if(m==JOptionPane.YES_OPTION){
//进行下一局
newPool();
ph_power=200;
// net.power=1;
System.out.println("重新开始");
}else if(m==JOptionPane.NO_OPTION){
//结束游戏
System.exit(0);
}
}else{
for(int i=0;i<fishes.length;i++){
net.catchThe(fishes[i]); //网捕鱼
}
ph_power-=net.power;
if(ph_power<net.power&&ph_power!=0){
net.power=1;
net.changeThePower(net.power);
}
}
}
}
};
this.addMouseListener(m);//鼠标移动监听
this.addMouseMotionListener(m);//鼠标拖拽监听
}
/*画图*/
public void paint(Graphics g){
//画背景
g.drawImage(bg,0,0,null);
// g.drawImage(fish.image, fish.x, fish.y, null);
for(int i=0;i<fishes.length;i++){
Fish f=fishes[i];//获取到要画的鱼
g.drawImage(f.image, f.x, f.y, null);
}
//写出网的power
g.setColor(Color.yellow);
Font font=new Font("宋体",Font.BOLD,25);
g.setFont(font);
g.drawString("当前POWER值为:"+net.power,550,30);
g.setColor(Color.red);
Font font1=new Font("宋体",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); }
}
/*让鱼动起来,并且重回游戏界面的方法*/
public void action(){
initMouseAdapter();//添加鼠标监听
while(true){
repaint();
try {
Thread.sleep(1000/24);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Fish类:
package com.tarena.fishgame;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
/*鱼类*/
public class Fish extends Thread{
BufferedImage image;//鱼的图片
BufferedImage [] images=new BufferedImage[10];//每一条鱼都有十张图
BufferedImage [] images_catch;
int x; //鱼的位置
int y;
int width; //鱼的宽和高
int height;
int speed;//鱼的游动速度
int blood;//血量
int index;//表示第几条鱼
static int count; //捕鱼数
static int score; //得分
Random random=new Random();//随机函数生成器
public Fish(int index){
//给图片数组初始化
if(index<8){
images_catch=new BufferedImage[2];
}else{
images_catch=new BufferedImage[4];
}
this.index=index;
String s1=(index<10?"0":"")+index;//三目运算符
String s2 ;
try {
//image=ImageIO.read(new File("images/fish"+s1+"_01.png"));
for(int i=0;i<10;i++){ //加载鱼的一组图片
s2=(i==9?"":"0")+(i+1);
images[i]=ImageIO.read(new File("images/fish"+s1+"_"+s2+".png"));
}
for(int i=0;i<images_catch.length;i++){ //加载鱼被补到的一组图片
images_catch[i]=ImageIO.read(new File("images/fish"+s1+"_catch_0"+(i+1)+".png"));
}
} catch (IOException e) {
// TODO Auto-generated catch block
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;
}
/*线程的方法,鱼游动*/
public void run(){
int i=0;
while(true){
x-=speed;
image=images[i++%10];
if(x<-width){ //如果鱼过了左边界,鱼出场
getOut();
}
if(blood<=0){
//挣扎,出场
turnOver();
getOut();
}
try {
Thread.sleep(1000/20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*鱼出场的方法*/
public void getOut(){
x=800;
y=random.nextInt(480+height)-height;
speed=random.nextInt(4)+3; //3-6
blood=index*3;
}
/*鱼死后,挣扎的方法*/
public void turnOver(){
for(int j=0;j<2;j++){
for(int i=0;i<images_catch.length;i++){
image=images_catch[i];
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
count++;
score+=index*3;
Pool.ph_power+=index*4;
}
}。

相关文档
最新文档