夺宝奇兵
开发
文档
《夺宝奇兵》开发文档
本游戏为连连看类型游戏,老少皆宜,连连看类型游戏有广泛的群众基础。
游戏中一改往常选关模式,设计成关卡挑战模式,玩家总共需要经历6座城市最终到达目的地并获取宝物,玩法方面能够更加的引人入胜。寻找大量宝石做为基本素材,绘制了6类共35种精美宝石图块,游戏界面整体风格美观且统一。
游戏基本结构:
游戏整体为模式化设计,主要由四个类块组成,程序整体结构图如下:
_游戏道具类
_用户时间分数类
_关卡处理类
_连连看类
关卡处理类: 负责整个游戏的关卡跟流程处理;
连连看类: 游戏核心算法处理,同时负责游戏图块跟画面的生成跟屏幕输出;
游戏道具类: 处理游戏道具跟数量信息〔功能扩充辅助〕
用户时间分数类: 处理用户名/事件/分数〔功能扩充辅助〕
游戏核心算法详解:
注:由于算法是我自己研究出来的,研究过程中没有参考任何相关资料,可能还有很多不完善的地方,还请谅解!本处主要以图解为主,如果您对算法还有不明白的地方,请直接参考<<夺宝奇兵>>源代码中的连连看类〔具体算法部分在 寻路() 函数中〕
目标:检测A1是否可以链接到B1
算法讲解图片
步骤:
检测A1到A2是否一路都为空数据
真
假
检测B1到B2是否一路都为空数据
真
假
真
假
可以连通
不能连通
从上往下检测A1的Y〔纵向〕坐标跟B1的相同的Y坐标处是否一路为空(本处A1跟B1的Y坐标都等于2时是可以连通的-即A2到B2是可以连通的)
继续检测下一个Y坐标的值
检测Y坐标是否为最大值
真
假
附加说明:通过上面的步骤图解,我们很容易可以理解两个横向图块的连结检测的原理
那么我们如何实现纵向图块的连结呢?其实很简单,请看下图:
对了,算法步骤跟上面的一样,只是横纵向的位置变了。
同理,以下几种情况都可以通过这种方式来处理:
如何横纵向都可以判断呢?思考思考!
呵呵,你想出来了吗?就是先检测横向,如果没有可以连通的图块,则检测纵向,如果都没有,则表示连通失败!
代码参考:
注:本处寻路函数代码段,只为程序的部分代码,并不能直接编译,还有较详细的注释,可直接贴到易语言中做为算法理解的参考
>--------------------------------------------- 代码段开始 ----------------------------------------------<
.版本 2
.子程序 寻路, 逻辑型, 公开
.参数 上次坐标, 坐标
.参数 当前坐标, 坐标
.参数 顺序路径坐标, 坐标, 参考 可空 数组, 存放路过的路径信息
.局部变量 循环变量, 整数型
.局部变量 纵向循环, 整数型, , "2"
.局部变量 横向循环, 整数型, , "2"
.局部变量 临时纵向循环, 整数型
.局部变量 临时横向循环, 整数型
.局部变量 连通成功, 逻辑型
.局部变量 临时整数变量, 整数型
.局部变量 临时坐标变量, 坐标
.局部变量 连接路径, 坐标, , "0"
.局部变量 最优位置, 整数型
.如果真 (上次坐标.纵向坐标 ≤ 0 或 上次坐标.横向坐标 ≤ 0 或 当前坐标.纵向坐标 ≤ 0 或 当前坐标.横向坐标 ≤ 0 或 上次坐标.纵向坐标 ≥ _纵向块数 + 2 或 上次坐标.横向坐标 > _横向块数 + 2 或 当前坐标.纵向坐标 > _纵向块数 + 2 或 当前坐标.横向坐标 > _横向块数 + 2)
返回 (假)
.如果真结束
.如果真 (_数据数组 [上次坐标.纵向坐标] [上次坐标.横向坐标].数据内容 ≠ _数据数组 [当前坐标.纵向坐标] [当前坐标.横向坐标].数据内容)
返回 (假)
.如果真结束
.如果真 (_数据数组 [上次坐标.纵向坐标] [上次坐标.横向坐标].数据内容 = 0 或 _数据数组 [当前坐标.纵向坐标] [当前坐标.横向坐标].数据内容 = 0)
返回 (假)
.如果真结束
重定义数组 (连接路径, 假, 0)
' << 纵向路径连通性检测 >>
最优位置 = 0
.计次循环首 (_纵向块数 + 2, 循环变量)
' 先假定路径可以连通
连通成功 = 真
' << 测试路径连通性 >>
' 判断上次坐标的纵向坐标到[循环变量]是否能够连通
' 即判断 坐标(上次坐标.横向坐标,上次坐标.纵向坐标) 与 坐标(上次坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (循环变量, 上次坐标.纵向坐标, 选择 (循环变量 > 上次坐标.纵向坐标, -1, 1), 纵向循环 [1])
.如果真 (_数据数组 [纵向循环 [1]] [上次坐标.横向坐标].数据内容 ≠ 0 且 纵向循环 [1] ≠ 上次坐标.纵向坐标)
连通成功 = 假
跳出循环 ()
.如果真结束
.变量循环尾 ()
' 判断当前坐标的纵向坐标到[循环变量]是否能够连通
' 即判断 坐标(当前坐标.横向坐标,当前坐标.纵向坐标) 与 坐标(当前坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (循环变量, 当前坐标.纵向坐标, 选择 (循环变量 > 当前坐标.纵向坐标, -1, 1), 纵向循环 [2])
.如果真 (_数据数组 [纵向循环 [2]] [当前坐标.横向坐标].数据内容 ≠ 0 且 纵向循环 [2] ≠ 当前坐标.纵向坐标)
连通成功 = 假
跳出循环 ()
.如果真结束
.变量循环尾 ()
' 判断两个坐标的横向坐标与纵向坐标为[循环变量]两点是否能够连通
' 即判断 坐标(上次坐标.横向坐标,[循环变量]) 与 坐标(当前坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (上次坐标.横向坐标, 当前坐标.横向坐标, 选择 (上次坐标.横向坐标 > 当前坐标.横向坐标, -1, 1), 临时横向循环)
.如果真 (_数据数组 [循环变量] [临时横向循环].数据内容 ≠ 0 且 临时横向循环 ≠ 上次坐标.横向坐标 且 临时横向循环 ≠ 当前坐标.横向坐标)
连通成功 = 假
跳出循环 ()
.如果真结束
.变量循环尾 ()
.如果真 (连通成功)
.如果 (最优位置 = 0)
最优位置 = 循环变量
.否则
最优位置 = 选择 (取绝对值 (上次坐标.纵向坐标 - 循环变量) + 取绝对值 (当前坐标.纵向坐标 - 循环变量) < 取绝对值 (上次坐标.纵向坐标 - 最优位置) + 取绝对值 (当前坐标.纵向坐标 - 最优位置), 循环变量, 最优位置)
.如果结束
.如果真结束
.计次循环尾 ()
.如果真 (最优位置 > 0)
' << 组织正确顺序的路径信息 >>
' 先加入初始节点坐标
加入成员 (连接路径, 上次坐标)
.如果真 (上次坐标.横向坐标 ≠ 当前坐标.横向坐标)
' 判断第二个节点坐标
.如果真 (取绝对值 (最优位置 - 上次坐标.纵向坐标) ≠ 0)
临时坐标变量.横向坐标 = 上次坐标.横向坐标
临时坐标变量.纵向坐标 = 最优位置
加入成员 (连接路径, 临时坐标变量)
.如果真结束
' 判断第三个节点坐标
.如果真 (取绝对值 (最优位置 - 当前坐标.纵向坐标) ≠ 0)
临时坐标变量.横向坐标 = 当前坐标.横向坐标
临时坐标变量.纵向坐标 = 最优位置
加入成员 (连接路径, 临时坐标变量)
.如果真结束
.如果真结束
' 最后加入结尾点坐标
加入成员 (连接路径, 当前坐标)
顺序路径坐标 = 连接路径
返回 (真)
.如果真结束
' << 横向路径连通性检测 >>
最优位置 = 0
.计次循环首 (_横向块数 + 2, 循环变量)
' 先假定路径可以连通
连通成功 = 真
' << 测试路径连通性 >>
' 判断上次坐标的纵向坐标到[循环变量]是否能够连通
' 即判断 坐标(上次坐标.横向坐标,上次坐标.纵向坐标) 与 坐标(上次坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (循环变量, 上次坐标.横向坐标, 选择 (循环变量 > 上次坐标.横向坐标, -1, 1), 横向循环 [1])
.如果真 (_数据数组 [上次坐标.纵向坐标] [横向循环 [1]].数据内容 ≠ 0 且 横向循环 [1] ≠ 上次坐标.横向坐标)
连通成功 = 假
.如果真结束
.变量循环尾 ()
' 判断当前坐标的纵向坐标到[循环变量]是否能够连通
' 即判断 坐标(当前坐标.横向坐标,当前坐标.纵向坐标) 与 坐标(当前坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (循环变量, 当前坐标.横向坐标, 选择 (循环变量 > 当前坐标.横向坐标, -1, 1), 横向循环 [2])
.如果真 (_数据数组 [当前坐标.纵向坐标] [横向循环 [2]].数据内容 ≠ 0 且 横向循环 [2] ≠ 当前坐标.横向坐标)
连通成功 = 假
.如果真结束
.变量循环尾 ()
' 判断两个坐标的横向坐标与纵向坐标为[循环变量]两点是否能够连通
' 即判断 坐标(上次坐标.横向坐标,[循环变量]) 与 坐标(当前坐标.横向坐标,[循环变量]) 是否能够连通
.变量循环首 (上次坐标.纵向坐标, 当前坐标.纵向坐标, 选择 (上次坐标.纵向坐标 > 当前坐标.纵向坐标, -1, 1), 临时纵向循环)
.如果真 (_数据数组 [临时纵向循环] [循环变量].数据内容 ≠ 0 且 临时纵向循环 ≠ 上次坐标.纵向坐标 且 临时纵向循环 ≠ 当前坐标.纵向坐标)
连通成功 = 假
.如果真结束
.变量循环尾 ()
' 检测失败便执行下次循环
.如果真 (连通成功 = 假)
到循环尾 ()
.如果真结束
.如果真 (连通成功)
.如果 (最优位置 = 0)
最优位置 = 循环变量
.否则
最优位置 = 选择 (取绝对值 (上次坐标.横向坐标 - 循环变量) + 取绝对值 (当前坐标.横向坐标 - 循环变量) < 取绝对值 (上次坐标.横向坐标 - 最优位置) + 取绝对值 (当前坐标.横向坐标 - 最优位置), 循环变量, 最优位置)
.如果结束
.如果真结束
.计次循环尾 ()
.如果真 (最优位置 > 0)
' << 组织正确顺序的路径信息 >>
' 先加入初始节点坐标
加入成员 (连接路径, 上次坐标)
.如果真 (上次坐标.纵向坐标 ≠ 当前坐标.纵向坐标)
' 判断第二个节点坐标
.如果真 (取绝对值 (最优位置 - 上次坐标.横向坐标) ≠ 0)
临时坐标变量.纵向坐标 = 上次坐标.纵向坐标
临时坐标变量.横向坐标 = 最优位置
加入成员 (连接路径, 临时坐标变量)
.如果真结束
' 判断第三个节点坐标
.如果真 (取绝对值 (最优位置 - 当前坐标.横向坐标) ≠ 0)
临时坐标变量.纵向坐标 = 当前坐标.纵向坐标
临时坐标变量.横向坐标 = 最优位置
加入成员 (连接路径, 临时坐标变量)
.如果真结束
.如果真结束
' 最后加入结尾点坐标
加入成员 (连接路径, 当前坐标)
顺序路径坐标 = 连接路径
返回 (真)
.如果真结束
返回 (假)
>------------------------------------------------ 代码段结束 -------------------------------------------------<
游戏调用素材:
宝石图块合成背景
宝石类型图块
自定义数据类型字典:
坐标
作用:(存储)图块的横纵项位置信息或者图象中点的位置
分数排行
作用:(存储)用户的分数信息
用户信息
作用:(存储)用户(玩家)的所有相关信息
时间信息
作用:(存储)时间的位置跟范围信息
游戏道具
作用:(存储)游戏调用的道具信息
主关卡信息
作用:(存储)主关卡(到达一个具体大的城市附带的关卡总信息,游戏总共包含7个主关)
关卡信息
作用:(存储)游戏的常规关卡信息(游戏总共包含30个普通关)
连连看数据块
作用:(存储)连连看图块数据信息