1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android水果连连看 代码逻辑 AndroidGame--水果连连看的设计(原理篇)

android水果连连看 代码逻辑 AndroidGame--水果连连看的设计(原理篇)

时间:2022-04-11 19:50:13

相关推荐

android水果连连看 代码逻辑 AndroidGame--水果连连看的设计(原理篇)

扎扎实实学基础,开开心心拆游戏。

作为android小菜鸟,qiaoidea在这里记录自己从零开始学游戏的开发旅程,欢迎关注和批评指正。

游戏综述:

这是首次做游戏,先简单说下个人对于游戏模块代码实现的划分:(大致分为3个模块)

1.activty(程序UI):

负责用户界面的显示,即玩家进入打开游戏程序之后看到的画面及操作按键和显示信息等,是游戏的前端。

2.游戏视图(显示游戏的布局)

该部分是展示游戏基本内容的区域,游戏图片,任务等内容会在这里显示,提供基本的游戏功能和接口。

3游戏控制器(控制游戏逻辑)

对于游戏内容逻辑的控制实现,根据用户动作来更新游戏布局内容,控制消除/生成/得分/死亡等等逻辑功能,是游戏核心部分。

把游戏视图与逻辑划分开来,好处是显而易见的:首先结构比较清晰,以后扩展维护起来也比较方便。比如更改或美化游戏界面,只需更改视图部分;需要更改游戏规则,只需要修改控制部分,只要保证这两部分的耦合逻辑不变即可。

下边进入今天的第一个游戏,水果连连看。

水果连连看

传送门:

水果连连看的设计(原理篇)

水果连连看的设计(实现篇)

在百度移动应用上搜索连连看,排行第一的便是水果连连看,其下载量达到100W+

现在我们尝试下实现这款游戏:

下载该apk安装文件,解压,获取其图片资源以及音效等多媒体文件。

(一)原理篇

1.activity(UI)

游戏分为三个界面: 进入菜单menu界面,游戏界面 和 游戏完成(过关或失败)。

所以,理论上应该为3个activity来分别显示,不过menu界面从图示上看是一个简单的点击进入游戏界面,我个人觉得可以直接把所有界面放在一个布局,根据当前状态来显示UI。具体实现过程是:

用户进入程序,显示menu界面,此时游戏布局处于隐藏状态,即menu界面在可见,GameView界面不可见;

用户点击啊开始游戏按钮,menu界面隐藏,显示游戏界面GmaeView,游戏开始;

当游戏完成结束,利用一个类似于愤怒的小鸟过关那样的Dialog显示在最前端,提供下一关/再来一次和退出三个选项。

实现效果如图:

menu界面:

完成界面:

2.视图部分

该部分负责绘制整个游戏视图GameView。首先是加载水果图片资源文件,然后是定义一个二维数组来记录该视图上第i行第j列的水果,其次是在iew上绘制出来。

另外,内部有定义坐标转换函数,将位置坐标转换成屏幕位置或者逆转。还有提供绘制连线函数,当两个选中水果图片相同时,可以连线并消除。

水果资源图片:

2.控制部分 当用户选中水果图片,则在视图部分绘制时候将其放大表示被选中;

当选中两个水果图片之后,先判断是否可连通,若可以则在视图绘制时绘制折线将其连通并消除,否则继续;

另外,游戏提供3次重新布局游戏和帮助消除功能,用户单击刷新时,若还有刷新次数,则重新给水果布局;用户单击灯泡帮助时,若有可帮助次数时,自动消除一对水果;

刷新和帮助按键:

核心算法说明

这里重点阐述下水果布局和是否可连通的算法实现:

(1)布局数字化

对于每一个位置上的水果棋子,我们用int整数来表示,0表示为空,即已经消除,然后0~19表示19种水果。

这里假设棋盘大小为4×4,棋子有4种。

我们的水果连连看其连线时可以延伸到外边的,所以要给棋盘周围留位置来绘制连线,所以在定义二维数组时候要定义(行数+2)*(列数+2)的二维数组,以便留足空位给连线通过,并且这些连线时不能安排棋子的。

为了保证水果是可完全消除的,所以每种水果的个数必须是偶数。综合这些因素,我们的棋子初始化大概就是这个样子:

000000

012210

031420

042340

041330

000000

如何保证偶数个棋子且随机呢,我们可以先按顺序生成偶数个水果编号,

000000

011220

033440

011220

033440

000000

然后随机交换除边界以外的其他棋子,即可达到上述效果。

(1)

判断棋子连通性

判断两个相同棋子能否连通,有两个先决条件,首先是两者线路中间没有其他棋子,其次是转折点数小于等于2. 所以,两个棋子间大体有三种连接类型:

a.直连型:

两个棋子在同一行或者同一列,中间无棋子。例如:

0000

00

0000

00

0000

00

010100

0000

00

000000

判断过程:当该点p1.x == p2.x 或者 p1.y == p2.y时,如果从p1到p2中间的所有棋子均为0时,可直连,返回true,否则false;

b.一次转折:

两个棋子经过一个转折点相连:(#表示转折点)

0

000

00

010#00

0000

00

0001

00

0000

00

0000

00

判断过程:当.

p1.x 1= p2.x 且 p1.y 1= p2.y 时,判断转折点 p3(p1.x , p2.y) 和p4(p2.x , p1.y)中是否有转折点满足该点到p1,p2均可直连,若有返回true,否则false

c.二次转折:

两棋子经过两个转折点相连:(x表示其他棋子)

0000

00

010#

00

00x0

00

0xx#

10

000x

00

0000

00

0000

00

010#

00

00x0

00

0xx0

x0

001#

00

00

00

00

判断过程:首先找两个棋子可水平延伸的部分,然后判断在延伸的同列上可否直连,若可以直连,返回true,否则false。(+表可延伸)

0000

00

+1++

x0

00x0

00

0xx0

x0

0x

1+

++

000000

(在其可延伸部分有公共列可直连,所以返回true)

d.布局无解

在初始化或者消除之后,应对当前布局进行判断,看是否存在两棋子可连通,如果遍历无解,则重新布局。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。