《基于Android操作系统的足球小将手机游戏毕业论文.doc》由会员分享,可在线阅读,更多相关《基于Android操作系统的足球小将手机游戏毕业论文.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、石家庄科技信息职业学院毕 业 论 文题目:基于Android操作系统的足球小将手机游戏 学 号: 090124006 姓 名: 专业班级:软件技术(游戏方向) 09-24 班指导教师: 完成日期: 2011-12-18 摘要: 近年来,随着经济的日益发展,人们的生活水平不断提高,生活质量也在渐渐的改善。适当的游戏对人们的业余生活是不可必缺的。说到游戏,种类有好多种。在电脑游戏上的分类也很多。RCG(赛车游戏)、FTG(格斗游戏)、SPG(体育游戏)、RPG(角色扮演)、ACT(动作游戏)、AVG(冒险游戏)、PUZ(益智游戏) 等等。虽说繁多的游戏种类让人目不暇接,游戏的可玩性、可延续性和可对
2、比性是益智类游戏深受各年龄阶层玩家欢迎的原因。当今网络发展迅速,益智类游戏被广泛运用到网络各大平台上。借鉴网络各大平台上的益智游戏,我利用java 、Android API语言开发了本游戏项目。我通过Eclipse 、Android SDK 利用Java语言编写的足球小将,在游戏中控制自己的球员击球、进门,达到一定分数获得胜利。关键字: 足球小将;道具;声音;分数;关卡ABSTRACT: In recent years, growing as the economy, improving peoples living standard and quality of life has also
3、gradually improved. Appropriate games on peoples spare time are not lack of will. There are so many kind of game. Also the classification of the computer games. Such as RCG (racing game), FTG (Fighting Game), SPG (sports games), RPG (role playing), ACT (action game), AVG (adventure game), PUZ (Puzzl
4、e Games) and so on. Although there are too many kinds for the eye to take in. continuity and comparability is a popular puzzle game player of all ages welcome reason. The rapid developments of todays networks, puzzle games are widely applied to various network platforms. I use Java, Android the API
5、language development of the game project.I through Eclipse Android SDK Java language prepared by the football, in the game, players control their own hit the door, reaching certain scores victory. Key words: Football Soccer;Prop; sound; scores; levels目 录一、 前言3二、 相关研究综述5三、 研究的目标、内容与意义63.1 研究目标63.2 研究
6、主要内容6 3.2 研究的意义6 四、 Android程序设计相关技术概论.84.1 XML界面布局.94.2 Android的Activity组件94.3 SQLite数据库.94.4 Android 2D图形编程9五、 游戏研究的重点、算法与思路 105.1游戏研究的重点105.2游戏研究的算法165.3游戏界面.205.4游戏的思路26六、 论文总结 28参考文献 30致谢.31附录一(游戏截图).32前 言现在,游戏的类型也由最初的动作游戏和简单益智游戏向更复杂、更高智力,更具真实性的游戏发展。目前的游戏种类繁多,包括角色扮演、仿真模拟类、人工智能、休闲类、渲染类、网络类等等,甚至有的
7、游戏包含了好几种类型。足球小将游戏一直以来都很多。但仿真模拟类的游戏却有不少,现在休闲类的技术广泛的应用到很多游戏里面等等。最广泛应用的应该就是交换排列检测。随着技术的不断提高,玩家对游戏真实性的要求也不断提高。相信益智类游戏的技术,以后会更加深入各种游戏之中。鉴于游戏的对社会的巨大影响力和光辉的发展前景,以及我们自己对游戏爱好,这次的毕业设计我们决定尝试设计和制作一个具有一定可玩性的游戏。期间,我们收集相关资料、研究同类型的游戏、阅读有关这类型游戏和相关技术性的书籍,通过制作游戏项目来熟悉游戏的制作思路、过程,加深对面向对象编程语言的掌握,培养自己的耐心、细心和考虑问题的全面性,同时解决本课
8、题要完成的问题,如游戏框架如何构建,如何将DirectX的内容封装,如何完善游戏的各种功能,如何能让游戏有音乐和音效的实现,如何能让游戏过关,如何能让游戏界面美观,看起来舒服感觉。二、相关研究综述近年来,国内外的专家学者以及一线的开发人员从理论、方法、技术等不同的角度对Android手机操作系统进行了一定的研究。本小节将从Android手机操作系统的发展历程、研究现状、程序开发设计简介四个方面分析总结国内外的相关研究结果。今天我们来聊一聊Android系统的历史,首先我们就要先来说说Android系统这个名字的来历。Android这一次最先出现在法国作家利尔 亚当在1886年发飙的科幻小说未来
9、夏娃中,作者将外表像人类的机器起名为Android,这也就是Android小人名字的由来。知道了Android名字的来历我们再来看一下Android系统的来历。Android系统一开始并不是由谷歌研发出来了,Android系统原来的公司名字就叫做Android,谷歌公司在2005收购了这个仅成立22月的高科技企业。Android系统也开始由谷歌接手研发,Android系统的负责人以及Android公司的CEO安迪鲁宾成为谷歌公司的工程部副总裁,继续负责Android项目的研发工作。在2007年11月5日这天,谷歌公司正式向外接展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全
10、球性的联盟组织,该组织由34家 手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系统以及应用软件,将共同开发Android系统的开放源 代码。三、研究的目标、内容与意义3.1 研究目标本项目主要研究的目标分为:程序设计思想实践改进目标、Android平台手机开发技术的研究目标。(1)运用面向对象的编程思想统一过程,对Chess足球小将手机游戏的系统结构、过程、功能等要素进行可视化的描述,为Android程序设计的可视化提供方法、技术上的支持,为系统的理论模型和软件建模提供参照。(2)本系统中使用了多种基于Android平台的软件开发技术,根据要实现的系
11、统功能,系统需要使用到的技术及技术研究的目标主要有:手机游戏用户界面的人性化、个性化界面布局,给用户以良好的游戏体验;移动设备上的图形编程,提供流畅靓丽的游戏过程界面;3.2 研究主要内容项目研究的内容主要有以下二大块:第一部分是手机游戏的界面设计和背景音效的设计。和PC上的游戏开发有些许不同,手机游戏更加的注重用户体验,一个人性化的、时尚靓丽的游戏界面和优美个性化的音效设计是一个成功的手机游戏要达到的基本要求。第二部分是对局智能程序的设计。可以和设计好的AI(Artificial Intelligence)算法进行游戏。人工智能程序设计是一项对算法要求很高的程序设计,特别是在手机这种硬件资源
12、紧缺的环境中,更是需要一个高效的算法来提供强大的AI对局支持3.3 研究的意义 游戏制作的目的是满足了人们休闲的需要,在紧张工作之余益智类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友,也可以到达跨省、跨市,甚至跨国间人们互相娱乐的目的。而消消看游戏学会锻炼眼力,时间利用快速、连续的移动,在十行十列限制区内,交换相对一致球移动。消消看除了掌握正确的动作和遵循一般的规律以外,还应学会一些特殊的变化。变节奏和变位置的,以避免加分被对手赢了。应掌握多种方式的移动球,做到能里能外,而且学会多获取随机出现增加的新球。 足球小将游戏是一个比较经典的游戏,根
13、据软件工程有关的规范,以合理的开发原则,设计出消消看游戏,并给人们的生活带来唯美的艺术享受和健康愉快的补充。 游戏软件是一种与文化背景密切联系的产品,具有很强的民族性和丰富的文化内涵。伴随着游戏软件在市场上的销售,与其相关的文化也随之传播。因此发展我国自主的益智、健康的游戏软件已是当务之急。游戏是一种基于计算机的应用软件,是新型的休闲娱乐方式。当前开发的游戏软件应该做到知识性、娱乐性、趣味性、教育性相统一。通过此次课题的设计,掌握制作一个游戏软件的方法,以及制作游戏软件的整个流程,制作游戏软件的步骤,为以后的就业工作打下基础。四、 Android程序设计相关技术概论Android作为一个移动设
14、备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次:图4.1 Android系统架构4.1 XML界面布局XML 是一种基于 XML 的语言,因此需要对 XML(特别是 XML 名称空间)很熟悉。XML是英文“XML User Interface Language”的首字母缩写。顾名思义,它是一种应用XML来描述使用者界面的标示语言。 4.2 Android的Activity组件Activity,一般代表手机屏幕的一屏,相当于浏览器的一个页面。在Activi
15、ty中添加view,实现应用界面和用户交互。一个应用程序一般由多个Activity构成,这些Activity之间可互相跳转,可进行页面间的数据传递。每个Activity都有自己的生命周期。4.3 SQLite数据库在Android平台上,集成了一个嵌入式关系型数据库SQLite。SQLite是支持结构化查询的轻量级数据库,能很好得适应于移动设备的应用。Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。4
16、.4 Android 2D图形编程 1、Simple Graphics in View:就是直接使用Android已经实现的一些画图操作,比如说images,shapes,colors,pre-defined animation等等。这种方式只能画静态或者极为简单的2D图画,对于实时性很强的动画,高品质的游戏都是没法实现的。2、Canvas:首先我们要明白这个Canvas是一个2D的概念,是在Skia中定义的。也就是说在这个方式下还是说的画2D图形。五、 游戏研究重点、算法与思路5.1游戏研究的重点1.1 如何拼接 用一张整图不现实,这样会影响程序的执行效率,而且很占空间只有通过图块的拼接。1
17、.2 装载地图 将地图索引写进文件,在程序装载的时候,通过输入输出流来读地图内容。2、游戏按键 在游戏中通过手触或者使用左右键使球员左右移动,通过判断击球的角度来确定足球运行的方向和速度,当你有事需要处理时,你可以点击两个比分中间的标志,来暂停住游戏的运行。3、关卡 关卡地图的设置:不同的关卡,对手的移动速度是不同的 4、帮助信息(1)让自己的队员击中球(2)抓住时间打中道具,让你有更大的赢面。(3)控制左右键来使球员移动。5.2游戏研究的算法 (1)后台电脑判断左右移动public class AIThread extends ThreadGameView father;/视图类引用bool
18、ean flag;/循环控制变量int sleepSpan = 30;/睡眠时间/构造器,初始化成员变量public AIThread(GameView father)this.father = father;flag = true;/设置线程标志位/线程启动后的执行方法public void run()while(flag) int d = father.ball.direction;/获取足球运动方向if(d 0 & d8 & d15)/如果足球方向偏右father.aiDirection = 12;/AI运动方向改为向右tryThread.sleep(sleepSpan);/休眠一段时间
19、catch(Exception e)e.printStackTrace();/打印并捕获异常(2) 碰撞测试(足球与边框) public void checkForBorders()int d = direction;/左右是不是出边界了if(x 8 & d16 & d!=12)/如果不是正撞到左边界if(Math.random() 12?1:5) + (int)(Math.random()*100)%3;else if(d = 12)/如果是正撞到左边界if(Math.random() 0.5?3:5);else if(x father.fieldRight)/撞到右边界if(d 0 & d
20、8 & d!=4)if(Math.random() 4?9:13) + (int)(Math.random()*100)%3;else if(d = 4)/如果是正撞到右边界if(Math.random() 0.5?11:13);d = direction;/判断是否撞到上边界if(y 0 & d12&d16)if(Math.random() 12?24:8) - d;else/一定几率随机变向direction = (d12?9:5) + (int)(Math.random()*100)%3;else if(d = 0)/正撞到上边界if(Math.random() 0.4)/一定几率沿正确
21、反射路线返回direction = 8;elsedirection = (Math.random() father.fieldDown)/不是正撞if(d 4 & d12 & d!=8)if(Math.random() 8?24:8) - d;else/随机变向direction = (d8?13:1) +(int)(Math.random()*100)%3;else if(d = 8)/正撞到下边界if(Math.random() 0.5?1:15);/* * 此方法检测是否碰到AI运动员,如果碰到,则调用handleCollision方法处理碰撞, * 同时播放声音设置足球新速率和设置la
22、stKicker */public void checkForAIPlayers()int r = (this.ballSize + father.playerSize)/2;for(Player p:father.alAIPlayer)if(p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y) = r*r)/发生碰撞handleCollision(this,p);/处理碰撞if(father.father.wantSound & father.father.mpKick!=null)/播放声音try /用try/catch语
23、句包装father.father.mpKick.start(); catch (Exception e) velocity = p.power;lastKicker = 8;/记录最后一脚是谁踢的/* * 此方法检测是否碰到了玩家 的足球运动员, */public void checkForUserPlayers()int r = (this.ballSize + father.playerSize)/2;for(Player p:father.alMyPlayer)if(p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y)
24、15)ball.direction = ball.direction % 16;else/攻击方向向下ball.direction = 7 + (int)(Math.random()*100)%3;/取7,8,9中一个break;/* * 此方法用于检测是否进球,如是,则相应球队得分加1,然后判断游戏是否结束(游戏规则是谁先进够8个谁就赢) */public void checkIfScoreAGoal()if(this.y father.AIGoalLeft & this.x = father.fieldDown & this.x father.myGoalLeft & this.x 20)
25、minVelocity = 20;/* * 该方法判断是否碰到了Bonus,如果碰到,对相应的Bonus进行操作 * 改变其状态,调用其方法修改游戏参数等等,并播放声音 */public void checkForBonus()if(father.balLive.size() != 0)for(Bonus b:father.balLive)if(b.x - x)*(b.x - x) + (b.y-y)*(b.y-y) = (b.bonusSize/2+ballSize/2)*(b.bonusSize/2+ballSize/2)& b.status = Bonus.LIVE)b.status =
26、 Bonus.EFFECTIVE;father.balLive.remove(b);b.setTarget(this.lastKicker);b.doJob();b.setTimeout(Bonus.EFFECT_SPAN);if(father.father.wantSound)if(b instanceof IceBonus)/是冰冻小球try father.father.mpIce.start(); catch (Exception e) else if( b instanceof LargerGoalBonus)/是扩大球门的try father.father.mpLargerGoal.
27、start(); catch (Exception e) break;5.3游戏界面public class FootballActivity extends Activity View current; / 记录当前ViewGameView gv; / GameView对象WelcomeView welcome; / 欢迎界面LoadingView lv; / 进度条加载界面int keyState = 0; / xxxx00为不动,xxxx10为向左,xxxx01为向右PlayerMoveThread pmt; / 移动球员位置的线程boolean wantSound = true; /
28、是否播放声音标志位int layoutArray; / 表示球员球场站位的数组MediaPlayer mpWelcomeMusic; / 游戏开始前的欢迎音乐MediaPlayer mpKick; / 踢球音效MediaPlayer mpCheerForWin; / 赢了的音乐MediaPlayer mpCheerForLose; / 输了的音乐MediaPlayer mpCheerForGoal; / 进球后的音乐MediaPlayer mpIce; / 撞到冰山后的音乐MediaPlayer mpLargerGoal; / 撞到打开球门后的音乐Rect rectPlus; / 代表增加球员
29、按钮的矩形框Rect rectMinus; / 代表减少球员按钮的矩形框Rect rectSound; / 是否播放声音按钮的矩形框Rect rectStart; / 开始按钮的矩形框Rect rectQuit; / 退出按钮的矩形框Rect rectGallery; / 表示Gallery的矩形框int imageIDs = / 存放8个俱乐部的图片IDR.drawable.club_1, R.drawable.club_2, R.drawable.club_3, R.drawable.club_4,R.drawable.club_5, R.drawable.club_6, R.drawab
30、le.club_7,R.drawable.club_8 ;int clubID = imageIDs0; / 记录用户选择的俱乐部的IDpublic void onCreate(Bundle savedInstanceState) / 重写onCreate方法super.onCreate(savedInstanceState);initWelcomeSound(this); / 初始化开场动画音乐requestWindowFeature(Window.FEATURE_NO_TITLE); / 设置全屏getWindow().setFlags(WindowManager.LayoutParams
31、.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);welcome = new WelcomeView(this); / 将屏幕切到欢迎界面setContentView(welcome);/ current是当前activity中打开的视图current = welcome;/ wantSound一个变量表示用户是否开启音乐if (wantSound & mpWelcomeMusic != null) / 如需要,播放相应声音mpWelcomeMusic.start();initRects(); / 初始化用于匹配点击事件的
32、矩形框/ 方法:初始化欢迎界面的声音public void initWelcomeSound(Context context) mpWelcomeMusic = MediaPlayer.create(context, R.raw.music);/ 方法:初始化矩形框public void initRects() rectPlus = new Rect3;rectMinus = new Rect3;for (int i = 0; i 3; i+) rectPlusi = new Rect(244, 200 + 40 * i, 280, 236 + 40 * i);rectMinusi = new
33、 Rect(280, 200 + 40 * i, 316, 236 + 40 * i);rectSound = new Rect(135, 370, 185, 420);rectStart = new Rect(205, 425, 295, 475);rectQuit = new Rect(25, 425, 115, 475);rectGallery = new Rect(10, 10, 310, 110);Overridepublic boolean onTouchEvent(MotionEvent event) / 重写onTouchEvent方法if (event.getAction() = MotionEvent.ACTION_UP) / 判断事件类型int x = (int) event.getX(); / 获得点击处的X坐标int y = (int) event.getY(); / 获得点击处的Y坐标if (current = welcome) / 如果当前界面是欢迎界面if (rectGallery.contains(x, y) / 用户点击的是Gallery