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

简介: 最基础的牌堆就是一个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中,这三种牌堆模式还可以通过场景节点制作成预制体,这样关卡设计师就可以轻松地制作出美观的关卡了。

相关文章
|
2月前
|
小程序 前端开发 JavaScript
【电商新机遇】支付宝小程序如何助你打造爆款电商解决方案?揭秘背后的技术奥秘!
【8月更文挑战第27天】本文详细介绍如何利用支付宝小程序构建电商应用,覆盖从项目初始化、页面设计、功能开发到数据分析的全流程。首先,需注册开发者账号并安装相关工具;随后创建项目,并按示例配置基本页面结构;接着设计商品列表等界面布局;再实现商品展示等功能;最后运用支付宝提供的工具进行数据分析,以优化用户体验及营销策略。跟随本教程,您将能打造出一款完整的电商小程序。
72 1
从开发角度看羊了个羊
从开发角度看羊了个羊
109 0
|
区块链 vr&ar 图形学
元宇宙链游系统开发技术及源码实现
元宇宙是一个新兴的技术领域,其中涉及到的技术和架构比较复杂。下面我提供一些基本的思路,但需要说明的是,元宇宙链游的开发需要根据具体的需求和技术栈进行设计和实现,因此具体的源码实现可能会有所不同。
|
小程序 安全 开发者
从产品角度分析羊了个羊为何能爆火
从产品角度分析羊了个羊为何能爆火
232 0
从产品角度分析羊了个羊为何能爆火
|
程序员
羊了个羊【程序员翻身经典案例】
羊了个羊【程序员翻身经典案例】
158 0
羊了个羊【程序员翻身经典案例】
|
存储 安全 算法
羊了个羊DAPP游戏链游系统开发(详情及源码)
元宇宙本体论的“共享”可以通过标准化的形式表现,标准是在科学研究和理论实践的基础上,在一定范围内经过协商一致获得的最佳秩序。元宇宙的标准可分为基础类、技术和平台类、数据和协议类、内容和资产类、应用和服务类、治理和监管类等五大类。基础类标准为其他标准建立共同的语言环境,包括术语、本体和分类、代码和标识、参考架构等内容。技术和平台类标准主要规范技术系统的分布式网络、智能计算、数据流动、信息安全和隐私保护等;数据和协议类标准主要规范数据格式、数据共享和流动、人机交互、系统兼容和互操作、跨平台身份互认等。
羊了个羊DAPP游戏链游系统开发(详情及源码)
|
Web App开发 数据安全/隐私保护
羊了个羊NFT版系统开发链游技术
游戏赋予了NFT的价值的第三层也是最重要的一层来实现它的固有价值:实用性。我们已经生活在虚拟世界的元宇宙中,并作为游戏者频繁地使用了虚拟物品。
羊了个羊NFT版系统开发链游技术
|
区块链
羊了个羊区块链闯关游戏系统开发模式代码实现技术介绍
羊了个羊区块链闯关游戏系统开发模式代码实现技术介绍
羊了个羊区块链闯关游戏系统开发模式代码实现技术介绍
|
移动开发 小程序 开发者
《羊了个羊》“火”出圈丨羊了个羊游戏系统开发(现成源码)
近期,网络上的顶流非“羊了个羊”莫属。作为一款合成消除类游戏,它已经吸引了6000多万网友参与其中,成为新的社交时尚【180-系统3831-开发9724】。
|
存储 新零售 云安全
完美日记:一文详解新零售电商定制化安全法则
阿里云作为完美日记选择的安全合作伙伴,从原生数据、场景防护策略到业务风控,为其提供定制化整体安全方案。
1641 0
完美日记:一文详解新零售电商定制化安全法则