基于 Android 的“捕鱼达人游戏”的开发

2015-05-30 13:59李湘一
智能计算机与应用 2015年6期
关键词:算法

李湘一

摘 要:本文通过分析实际运行效果,阐述了捕鱼达人游戏开发的体系结构,确定了游戏开发中需要创建哪些类,如何创建这些类。并对各实体类实现的功能进行了具体的描述。用线程实现了鱼的游行,子弹的发射。最后给出了三种关键算法的描述,大炮旋转角度的计算、子弹的运行轨迹的计算、判断子弹是否击中鱼的算法描述。

关键词: Android;捕鱼达人;算法

中图分类号:TP391 文献标识号:A 文章编号:2095-2163(2015)06-

Abstract: Through the analysis of the actual operating results, this paper expounds the system structure of the game development of fishing up game, and determines what kind of game development need to create, and how to create these classes. After that, the function of each entity class is described in detail. The paper also uses threads to achieve the fish's parade, bullets fired. Three key algorithms are described,which respectively are the calculation of the rotation angle of the barrel, the calculation of the trajectory of the bullet, and judging whether the bullet hit the fish.

Keywords: Android; Fishing Talent; Algorithm

0引 言

近几年来,Android凭借其开放性和灵活性成为时下热门的移动终端操作系统之一。在Android平台上进行游戏的开发,即已成为一个挥洒才智并极具魅力潜质的创意领域[1]。其中,手机游戏是Android平台上众多类型应用程序的一种,覆盖面积大,传播速度快。本文选取大众较为熟知的捕鱼达人游戏来进行详细阐述该游戏开发的思路和具体步骤。

1捕鱼达人游戏开发的体系结构

首先在eclipse中新建一个android项目名称为fish,在src文件夹下新建com.tarena.fish包,捕鱼达人游戏中用到的图片素材全部拷贝到drawable目录中。游戏最终显示效果如图1所示。

该游戏开发的体系结构如图2所示。

2各实体类的功能实现描述

该游戏中有多条鱼在池塘中游动,大炮将发射子弹进行击中鱼的作用过程,同时一并显示击中鱼所得的分数。分析该游戏运行效果,则需要研发如下几种主要实体类:

池塘类Pool、鱼类Fish、大炮类Barrel、子弹类Bullet。

相对应地,研究中即在src文件夹下创建以上实体类Pool.java、Fish.java、Barrel.java、Bullet.java。其后,则给出各类重点实体的功能实现描述与阐析。

(1) Fish类实现的功能

确定鱼的大小、鱼的位置、鱼的步伐、鱼的十个动作,在鱼的构造方法中,通过Random()函数来随机产生鱼每次游出的位置。鱼类继承了Thread類,如果鱼被子弹击中,让鱼重新游进来。如果鱼重新游进来,鱼的位置和步伐都随之发生了改变;如果鱼没有被子弹击中,就直线向前游,并在游的过程中通过循环语句依次完成自身的十个动作。十个动作完成后又将重新开始循环。如果鱼已经游出了池塘,则让鱼再重新游进来。

(2) Barrel类实现的功能

确定Barrel的位置,Barrel的大小,在Barrel的构造方法中初始化这些参数值。

(3)Bullet类实现的功能

定义子弹的坐标、大小、子弹的角度、子弹的出发点,子弹运行轨迹的横纵坐标,子弹是否存活(true表示子弹正常移动,false表示子弹已经击中fish)。具体地,move()方法实现子弹移动的行为,hint()方法实现子弹击中鱼的方法。

(4)Pool类实现的功能

在Pool类中分别定义上述对象,并定义弹夹,用来存放子弹,定义捕鱼的条数,创建fishes数组用来存放11条鱼,使用循环向fishes数组中放入11条鱼,并启动鱼的线程。

在onDraw()方法中将背景bg、所有的鱼、大炮、积分板、子弹都画出来。在onTouchEvent()方法中,鼠标弹起时,创建子弹,计算子弹的横纵坐标,并使子弹的中心点和大炮的中心点一致。将子弹放入弹夹中,启动子弹线程。

(5)MainActivity类实现的功能

在该类中创建一个池塘Pool对象,设置显示的布局窗口,创建开始刷新界面的线程,定义一个内部类,通过调用onDraw()方法以实现不停地刷新Pool池塘中的内容变化。

3捕鱼达人关键算法设计

3.1大炮旋转角度的算法描述

大炮旋转角度如图3所示。

从图3中,大炮中心点的坐标为(x,y),大炮左上角点的坐标为(barrel.x,barrel.y),鼠标点击屏幕点的坐标为(mouseX,mouseY)。

大炮中心点的坐标计算如下:

int x=barrel.x+barrel.width/2;

int y=barrel.y+barrel.height/2;

其中,barrel.width和barrel.height分别表示大炮的宽度和高度。

double xx=(double)mouseY-y;//计算出的结果为负数

double yy=(double)mouseX-X;

用反余切来求出大炮的旋转角度,f就是最后的角度。

f=Math.round(Math.toDegrees(-Math.atan(yy/xx)));

3.2子弹移动轨迹的算法描述

子弹运行轨迹如图4所示。

图4中,圆心坐标为(a,b),圆上任意一点的横坐标x=a+Math.sin(弧度)*半径,纵坐标y=b+Math.cos(弧度)*半径。

具体算法如下:

int distance = p.y - y;// 求的半径 ,其中p表示子彈的出发点

int x = Math.round((float) Math.sin(Math.toRadians(roate)) * distance);

xx = p.x + x;// 子弹运行轨迹的x坐标

int y = Math.round((float) Math.cos(Math.toRadians(roate)) * distance);

yy = p.y - Math.abs(yy);// 子弹运行轨迹的y坐标

}

}

3.3子弹击中鱼的算法描述

鱼在池塘中游动,子弹发射的时候如何判断鱼被子弹击中:如果子弹击中了鱼以后,弹夹中就会删除这颗子弹,判断鱼是否存活的变量值则变为false。捕到鱼的变量num加1。下面给出判断鱼是否被击中的伪代码。

for (int i = 0; i < 池塘中鱼的数量; i++) {

if (子弹的横坐标 >= 鱼的左上角的顶点横坐标 &&

子弹的横坐标 < 鱼左上角顶点 横坐标+ 鱼的宽度 &&

子弹的纵坐标 >=鱼的左上角的顶点纵坐标&&

子弹的纵坐标 <= 鱼的左上角顶点的纵坐标 + 鱼的高度)

{

鱼被击中;

删除弹夹中的这颗子弹;

isLive=false;

pool.num++;

} }

4结束语

本文介绍了基于Android系统捕鱼达人游戏设计的总体流程,并详细介绍了各个实体类实现的功能,在设计开发的同时,对游戏中用到的关键算法进行了详细的阐述。但该游戏的模块相对来说较为简单,子弹击中鱼的范围不够精确等,有待在后期进行模块的拓展和功能的完善。

参考文献:

[1] 奚洋,郭健.基于Android的连连看游戏的算法研究[J].无线互联科技, 2012(9):122.

[2] 刘毅.Android游戏开发课程教学改革与实践[J].现代企业教育,2014,(16):379.

[3] 曲蕴慧. Android系统下手机游戏的设计与开发[J].电子科技,2013(6):94-95.

[4] 李嘉诚. Android应用程序开发研究与应用[J].软件导刊,2014(13):64-67.

[5] 陈淮.基于Android游戏开发常用类库的设计与研究[D].西安电子科技大学,2010.

[6] 李兴华.Android开发实战经典[M].北京:清华大学出版社, 2012.

猜你喜欢
算法
基于MapReduce的改进Eclat算法
Travellng thg World Full—time for Rree
进位加法的两种算法
算法初步两点追踪
基于增强随机搜索的OECI-ELM算法
一种改进的整周模糊度去相关算法