羊了个羊系统开发技术实现原理

简介: 最基础的牌堆就是一个x*y*z的三维数组,我们可以使用一切方法构造想要的排队形状:柱形、条形、甚至金字塔形。这都不会影响后面程序的实现

  游戏的整体很简单,但其中有几个实现的重点需要注意:

  牌堆数据结构的实现

  如何检测和更新可拾取的牌

  先做个小定义,一个牌堆中可被拾取的牌以下将简称其为:“窗口牌”。

  牌堆的结构及其数据结构

  最初,我还真被这复杂的牌堆结构蒙住了,但仔细研究一番发现,无论多么复杂的牌堆,其实都是由如下三种牌堆模式组合拼凑而成的。

  蓝圈圈出的牌堆模式A:上面1张牌只挡住下面1张牌;同时下面的牌仅被上面1张牌挡住。只要上面的1张牌被取走,下面的牌就成为窗口牌;

  红圈圈出的牌堆模式C:上面1张牌可以挡住下面4张牌;同时下面的牌可能被上面4张牌挡住,一张牌只有它上面的4张牌都被取走,它自己才成为窗口牌。

  虽然上图中体现不是很明显,但不难猜想出,第三种牌堆模式B的存在,那就是:

  上面1张牌可以挡住下面2张牌;同时下面的牌可能被上面2张牌挡住,一张牌只有它上面的2张牌都被取走,它自己才成为窗口牌。

  对于牌堆模式A,有些朋友会迫不及待地用“队列”或“栈”实现它,这样做有两个缺点:

  逻辑上牌堆模式A的窗口牌也可能是2维的,如果用队列实现就限制了它的灵活性;

  牌堆模式B和C都不好用队列实现,所以想追求数据结构的统一,还要另求他法。

  实际上无论牌堆模式A、B还是C,都不过是3维数组结构,上图中模式A看起来特殊,无非是它的x,y维度都为1罢了。而三种牌堆的区别也无非就是当一张窗口牌被取走,检查牌堆是否出现新的窗口牌的方法罢了。

  牌堆模式A

  牌堆模式B

  牌堆模式C

  牌堆的数据结构

  我将其定义为MContainerBase基类

  #MContainerBase extends Node2D class_name MContainerBase

  func _ready:add_to_group(name)add_to_group("game")varMask=FileReader.read(mask_file,null)box.resize(size_x)fori inrange(size_x):box<i>=[]box<i>.resize(size_y)forj inrange(size_y):box<i>[j]=[]box<i>[j].resize(size_z)fork inrange(size_z):ifMask==nullor Mask<i>[j]==1:box<i>j=add_tile(i,j,k,get_parent.distribute_face)else:box<i>j=nullforx inrange(size_x):fory inrange(size_y):forz inrange(size_z):check_is_on_top(x,y,z)

  最基础的牌堆就是一个xyz的三维数组,我们可以使用一切方法构造想要的排队形状:柱形、条形、甚至金字塔形。这都不会影响后面程序的实现。

  项目中为了增加这个“大方块”的多样性,我还给它设置了如下的“遮罩”,这就是游戏中文字的由来。当然我们还可以通过“遮罩”来自由定义窗口牌,这部分就请大家自由发挥了。

  #S形遮罩[[0,0,0,0,0],[0,0,0,0,0],[1,1,1,0,1],[1,0,1,0,1],[1,0,1,1,1],]

  如何检测和更新可拾取的牌

  三种牌堆模式分别派生自MContainerBase,并对应着如下三种检测方式:

  牌堆模式A

  仅检测自己正上方是否有牌

  #1Cover1extends MContainerBase

  funccheck_is_on_top(x,y,z):ifhas_tile(x,y,z):ifnot has_tile(x,y,z+1):(boxx[z]asMTile).set_is_on_top(true)

  牌堆模式B

  检测自己上方两方位是否有牌

  #1 Cover 2extends MContainerBase

  func check_is_on_top(x,y,z):ifhas_tile(x,y,z):ifz%2==0:ifnothas_tile(x,y,z+1)andnothas_tile(x-1,y,z+1):(boxx[z]asMTile).set_is_on_top(true)else:ifnothas_tile(x,y,z+1)andnothas_tile(x+1,y,z+1):(boxx[z]asMTile).set_is_on_top(true)

  牌堆模式C

  检测自己上方四方位是否有牌

  #1 Cover 4extends MContainerBase

  func check_is_on_top(x,y,z):ifhas_tile(x,y,z):ifz%2==0:ifnothas_tile(x,y,z+1)andnothas_tile(x-1,y,z+1)andnothas_tile(x,y-1,z+1)andnothas_tile(x-1,y-1,z+1):(boxx[z]asMTile).set_is_on_top(true)else:ifnothas_tile(x,y,z+1)andnothas_tile(x+1,y,z+1)andnothas_tile(x,y+1,z+1)andnothas_tile(x+1,y+1,z+1):(boxx[z]asMTile).set_is_on_top(true)

  在Godot中,这三种牌堆模式还可以通过场景节点制作成预制体,这样关卡设计师就可以轻松地制作出美观的关卡了。

相关文章
|
7月前
|
新零售 人工智能 大数据
二二复制新零售商城系统开发(成熟案例)
形成“线上+线下+物流”三位一体的运营模式,重新将人、货、场有效组合
|
7月前
|
运维 供应链 监控
奶茶上云,原生的更好喝
奶茶上云,原生的更好喝
144 1
|
8天前
|
运维 供应链 监控
【云故事探索】NO.12:茶百道——奶茶上云,原生的更好喝
茶百道自2008年成立,从100家门店扩展至7000多家,年销量达8亿杯。2018年起,茶百道开启全国加盟,通过数字化转型,实现供应链、运营及营销的全面升级。借助阿里云技术,优化从前端到后端的业务流程,提升用户体验,降低运营成本,显著增强了市场竞争力。
|
区块链
Jogger/Stepn跑鞋零撸项目系统开发实现技术案例/逻辑方案/案例介绍/源码运营版
 区块链的可追溯性来源于区块链数据结构的特殊性。在区块链系统中,它的链式结构是从创世区块开始的,其后系统产生的所有区块都通过父区块的哈希值前后相连,并最终能追溯到创世区块。
|
7月前
|
人工智能 供应链 安全
瓴羊朋新宇:消费产品做得越来越简单,企服行业也应由繁至简
瓴羊朋新宇:消费产品做得越来越简单,企服行业也应由繁至简
|
7月前
|
Cloud Native 安全 数据安全/隐私保护
瓴羊朋新宇:与伙伴共同奔跑,瓴羊宣布开放六大数智底座能力及三大核心服务
瓴羊朋新宇:与伙伴共同奔跑,瓴羊宣布开放六大数智底座能力及三大核心服务
从开发角度看羊了个羊
从开发角度看羊了个羊
123 0
|
人工智能 运维 供应链
案例酷 | 老板电器:43年进阶路,从手握老虎钳到数字化烹饪链
编者按: 43年专注厨电,对于中国市场始终保持高度的敏捷性与适应性,使得老板电器的中国制造新模式引起越来越多的外界关注。以用户为中心,积极拥抱科技创新与技术变革,用数字驱动业务逐步代替传统制造,一张纵横交错,以“数智化”转型为底座的发展蓝图已经铺陈展开。 全文约5389字,建议阅读时间15分钟。
1216 0
|
前端开发 JavaScript 定位技术
纯前端实现「羊了个羊」小游戏🐏
纯前端实现「羊了个羊」小游戏🐏
2271 5
|
小程序 安全 开发者
从产品角度分析羊了个羊为何能爆火
从产品角度分析羊了个羊为何能爆火
241 0
从产品角度分析羊了个羊为何能爆火