智能手机软件开发-飞扬的小鸟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计报告书
课程名称:智能手机软件开发
题目:飞扬的小鸟
系名:信息工程系
专业班级:计算机1111
姓名:
学号: ***********
****:**
2014 年 6 月 22 日
武汉理工大学华夏学院信息工程系
课程设计任务书
课程名称:智能手机软件开发课程设计指导教师:凌伟
班级名称:计算机1111 开课系、教研室:自动化与计算机
一、课程设计目的与任务
本课程的设计的目的是通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。
结合具体的开发案例飞扬的小鸟,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。
二、课程设计的内容与基本要求
1、课程设计题目
飞扬的小鸟
2、课程设计内容
要求学生根据所学的软件工程的理念,利用所学的Android 手机开发的知识,开发一个智能手机游戏飞扬的小鸟,并针对该手机游戏软件进行需求分析,总体设计、详细设计、编码、测试。
《飞扬的小鸟》是由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。
游戏玩法:在游戏开始后,点击屏幕,要记住是保持一定的规律的仔细观察点击屏幕,不要让小鸟掉下来。
游戏过程:让小鸟不要撞到管子,每穿过一个管子的缝隙得1分。
游戏背景音乐设计
游戏背景动画设计
游戏界面设计
游戏关卡设计
游戏积分榜的设计
三、课程设计步骤及时间进度和场地安排
本课程设计将安排在第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.1课设设计题目
飞扬的小鸟
1.2 设计目的
⑴通过实践使同学们经历智能手机软件开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的智能手机开发的知识。
⑵结合具体的开发案例飞扬的小鸟,理解并初步掌握智能手机开发的主要环节和步骤以及智能手机游戏开发的知识。
⑶要求学生根据所学的软件工程的理念,利用所学的Android 手机开发的知识,开发一个智能手机游戏飞扬的小鸟;
⑷针对该手机游戏软件进行需求分析,总体设计、详细设计、编码、测试。
1.3 设计任务及要求
⑴设计“飞扬的小鸟”游戏包括:游戏玩法,游戏过程,游戏背景音乐设计,游戏背景动画设计,游戏界面设计,游戏关卡设计,游戏积分榜的设计。
⑵游戏玩法:游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。
2软硬件运行环境及开发工具
2.1 硬件环境
CPU:Pentium 4 3.0以上。
内存:512MB以上。
硬盘:80GB以上。
显示器:1024×768像素以上。
数据库:Access2000以上。
操作系统:Windows XP或更高版本。
2.2软件环境
MyElipse、JAVA
3游戏总体设计
3.1游戏功能简介
玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡,具体的功能如下:
(1)登录界面按下图标进入游戏;
(2)每点击一下屏幕,小鸟飞一下;
⑶小鸟要是碰到柱子或者撞到地面就显示游戏结束界面。
3.2游戏的整体流程图
图1 游戏的整体流程图
4 系统详细设计
经过需求分析、功能模块设计之后要进入详细设计阶段,本阶段将按游戏的主要模块进行论述,重在阐述具体的某项功能的实现方法或运用到的相关技术。
4.1游戏背景动画设计
代码如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame win = new JFrame("飞扬的小鸟作者:卢灿");
win.setSize(432, 674);
win.setLocationRelativeTo(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setResizable(false);
World world = new World();// 创建一个小鸟活动世界
win.add(world);// 把面板(world)添加到可视化窗口界面(win)里面
win.setVisible(true);
world.action();//让游戏界面动起来
}
}
4.2游戏界面设计
代码如下:
World world = new World();// 创建一个小鸟活动世界
win.add(world);// 把面板(world)添加到可视化窗口界面(win)里面
win.setVisible(true);
world.action();//让游戏界面动起来
4.3游戏关卡设计
//游戏输赢的判定,代码如下:
if(bird.hit(ground)||bird.hit(c1)||bird.hit(c2)){
isGameOver=true;
}
4.4游戏积分榜的设计
代码如下:
if(bird.x==c1.x||bird.x==c2.x){
//得一分
score++;
}
repaint();//重绘游戏界面
try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5 操作说明及运行结果
5.1 操作说明
⑴游戏玩法:玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。
⑵游戏积分榜的设计:让小鸟不要撞到管子,每穿过一个管子的缝隙得1分。
5.2运行结果
登录界面的设计
图2 登录界面
游戏过程中的界面设计
图3 游戏过程中的界面游戏结束时的界面设计
图4 游戏结束时的界面
6总结
在本次课程设计中,我们遇到的困难很多,在解决它们的同时我们又学到了很多,获益非浅,特别是如何分析、建立、开发一个游戏。
在一个游戏开发的过程中编码不是重要的,重要的是分析游戏、建立起游戏模型。
在分析一个游戏前,分析人员必须要对将要开发的游戏所涉及到的各方面知识有一个认识,然后将游戏的模型建立起来。
而且一个成功的游戏要符合用户的需要,要以用户为中心,开发出用户想要的游戏,而不能自以为是,想当然。
在游戏编写中,我们认识到游戏要有简便的界面,完备的文挡。
拥有这些条件,游戏的复杂度才能大大减少,修改代码时更加容易下手。
我认为,所谓良好的界面,就是用户需要的界面,力求简便全面。
所以设计一个界面时,开发人员必须要了解用户的想法,从用户的角度去设计,当然,开发不能全听用户的意见,在详细分析了游戏后,开发人员可以向用户提出一些修改的意见,在双方多次交流后定出游戏所需的功能,以决定界面的实现。
在编码中,良好的编程风格与习惯是提高工作效率的一个重要方面,而且良好的编程风格与习惯也是使软件便于维护的基础。
那如何是良好的编程风格与习惯呢?我们认为主要是程序的模块化、必要的注释和完备的设计文挡三个方面。
所谓模块化就是使程序的功能实现分成多个单独的功能模块,而不能在一大段代码中实现多个功能,如果这样做,别的人是非常难读懂你的程序。
必要的注释,显而易见是要在程序的编写中加入对程序的说明,原因就是为了别人能读懂你的程序,再一段时间后你自己还能读懂自己的程序。
而完备的设计文挡是在系统开发过程中记录下开发的全部过程,拥有它,在以后维护软件时就有依据使维护工作变得简单一些。
总结这次课程设计给我们感受最深的至少有四点:
1.进行软游戏件开发这样的工作,要有恒心,要能静下新来做,而不能浮躁。
2.要遵循游戏开发本身的规律和善于吸收已有的经验。
3.要善于同别人交流与合作,善于获取有用的各种资源。
4.要真真实实多查资料,多问,多看。
7参考文献
[1] 王建华. ASP NET 2.0 动态网站开发技术与实践[M].北京:电子工业出版社,2007.
[2]王珊萨师煊,数据库系统概论(第四版),高等教育出版社,2006
[3]萨师煊,SQL Server 从入门到精通,高等教育出版社,2006
[4] 周之黄玫译, SQL Server 2000技术参考大全, 清华大学出版社,2001
[5]余杰李莎莎,SQLServer项目开发实践,中国铁道出版社,2006
附录
进入界面设计
package com.tarent.flappybird;
import javax.swing.JFrame;
public class FlappyBird {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame win = new JFrame("飞扬的小鸟作者:卢灿");
win.setSize(432, 674);
win.setLocationRelativeTo(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setResizable(false);
World world = new World();// 创建一个小鸟活动世界
win.add(world);// 把面板(world)添加到可视化窗口界面(win)里面
win.setVisible(true);
world.action();//让游戏界面动起来
}
}
小鸟类
package com.tarent.flappybird;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
/**小鸟类*/
public class Bird {
BufferedImage image;//鸟的图片
BufferedImage[] images=new BufferedImage[8];
int x;//鸟的中心点
int y;
int width;//鸟的宽和高
int height;
double alpha=0;
double s;//t秒移动的距离
double g=4;
double t=0.25;
double speed=20;//鸟的速度
int index=0;//(让index++%8,赋值给图片的下标)
public Bird(){
//循环加载鸟的每一张图,存放在images数组里边
for(int i=0;i<8;i++){
try{
images[i]=ImageIO.read(getClass().getResource(i+".png"));
}catch(IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
image=images[0];
width=image.getWidth();
height=image.getHeight();
x=132;//鸟的位置
y=280;
}
public void step(){
//x不变,y自由落体
double v0=speed;
s=v0*t-0.5*g*t*t;
y-=s;//y=y-s;
speed=v0-g*t;//最后的速度作为鸟的初速度
alpha=Math.atan(s/8);
//换图片
image=images[index++%8];
}
public void flappy(){
speed=20;
}
/*判断鸟是否碰撞到了地面*/
public boolean hit(Ground ground){
if(y+height/2>=ground.y){
alpha=-3.14/2;//垂直撞地
return true;//碰到了地面
}
return false;
}
public boolean hit(Column column){//子类重载上面的hit方法,根据参数列表不同,访问
//不同的重载方法。
int m=x+width/2;
int n=x-width/2;
int a=column.x-column.width/2;
int b=column.x+column.width/2;
if(m>=a&&n<=b){
int a1=y-15;
int a2=y+15;
int b1=column.y-column.grap/2;
int b2=column.y+column.grap/2;
if(a1<=b1||a2>=b2){
return true;
}
}
return false;
}
}
小鸟世界类
package com.tarent.flappybird;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
//ctrl + shift +f 排版
public class World extends JPanel {
BufferedImage bg;// 背景图
BufferedImage start_image;//游戏开始
BufferedImage gameover_image;//游戏结束
Ground ground;//土地
Column c1;//两个柱子
Column c2;
Bird bird;//鸟
boolean isGameOver;//判断游戏是否结束
boolean started;//判断游戏是否开始
int score=0;//得分
/* 构造器,构造方法,构造函数,用来给属性赋初始值*/ public World() {
// 加载背景图
bg = ImageIO.read(getClass().getResource("bg.png"));
start_image=ImageIO.read(getClass().getResource("start.png"));
gameover_image=ImageIO.read(getClass().getResource("gameover.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// try catch解决异常
//初始化土地,柱子,鸟
newWorld();
}
public void newWorld(){
ground = new Ground();//初始化土地
c1 = new Column(1);//第一根柱子
c2 = new Column(2);//第二根柱子
bird=new Bird();//初始化鸟
score=0;
isGameOver=false;
started=false;
}
/* 画图的方法,g是画图工具*/
public void paint(Graphics g) {
// 画背景图
g.drawImage(bg, 0, 0, null);
/*,先画柱子后画土地,美观*/
//画柱子
g.drawImage(c1.image, c1.x-c1.width/2, c1.y-c1.height/2, null);//画第一个柱子
g.drawImage(c2.image, c2.x-c2.width/2, c2.y-c2.height/2, null);//画第二个柱子
//画土地
g.drawImage(ground.image,ground.x, ground.y, null);//画土地
//画鸟
//bird.alpha =-1.2;//赋值改变头朝向
Graphics2D g1=(Graphics2D)g;
//在鸟的(x,y)位置,把坐标系旋转alpha倾角
g1.rotate(-bird.alpha,bird.x,bird.y);
g1.drawImage(bird.image,bird.x-bird.width/2,bird.y-bird.height/2,null);
g1.rotate(bird.alpha,bird.x,bird.y);
if(!started){//画游戏开始的示意图
g.drawImage(start_image, 0, 0, null);
}
if(isGameOver){
g.drawImage(gameover_image, 0, 0, null);
//画分数
Font f=new Font("隶书",Font.BOLD,25);
g.setFont(f);
g.setColor(Color.black);
g.drawString("你的得分为:"+score, 10, 20);
}
/**让图片动起来的方法*/
public void action(){
//为该游戏界面,添加鼠标监听事件
MouseAdapter m=new MouseAdapter(){
//监听鼠标点击操作
public void mousePressed(MouseEvent e){
System.out.println("点我!随便点");
if(isGameOver){
newWorld();//重新开始
}else{
//鸟跳一下
bird.flappy();
started=true;//开始游戏
}
}
};
this.addMouseListener(m);
while(true){
if(started){//游戏开始,并且结束,这个过程,才动if(!isGameOver){
ground.step();//土地动一次
c1.step();//柱子动一次
c2.step();
bird.step();
}
}
//是否得分
if(bird.x==c1.x||bird.x==c2.x){
//得一分
score++;
}
repaint();//重绘游戏界面
try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//游戏输赢的判定
if(bird.hit(ground)||bird.hit(c1)||bird.hit(c2)){
isGameOver=true;
}
}
}
}
柱子类
package com.tarent.flappybird;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
/**柱子类*/
public class Column {
BufferedImage image;//柱子的图片
int x;//柱子的中心点
int y;
int width;//柱子的宽和高
int height;
int distance;//两根柱子的距离
int grap=144;//一根柱子中间的间隙距离
Random random = new Random();//随机函数生成器,用来随机柱子高度/* 构造器,给属性赋初值**/
public Column(int num){//num代表第几根柱子
try {
image = ImageIO.read(getClass().getResource("Column.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
width = image.getWidth();//把图片的宽和高赋值给柱子
height = image.getHeight();
y = random.nextInt(218)+132;//已经计算好的数据,不能改
distance = 245;
x = (num-1)*distance + 550;
}
/*让柱子动的方法*/
public void step(){
x--;
if(x<-width/2){
//重新进场
x = 2*distance-width/2;
y = random.nextInt(218)+132;
}
}
}
土地类
package com.tarent.flappybird;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
/** 土地类*/
public class Ground {
BufferedImage image;//土地的图片
int x;//土地的位置
int y;
public Ground(){
//先加载图片
try {
image = ImageIO.read(getClass().getResource("ground.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
x = 0;
y = 500;
}
/**土地动起来的方法*/
public void step(){
x--;
if(x<=-110){
x = 0;
}
}
}。