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

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

相关文章
|
6月前
|
新零售 人工智能 大数据
二二复制新零售商城系统开发(成熟案例)
形成“线上+线下+物流”三位一体的运营模式,重新将人、货、场有效组合
|
2月前
|
机器学习/深度学习 Web App开发 测试技术
『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!
该文章介绍了八种常用的黑盒测试方法,包括等价类划分、边界值分析、错误推测法、因果图法、决策表测试、状态转换法、场景法以及随机测试,并提供了相应的案例说明。
|
6月前
|
新零售 供应链 小程序
未来生物商城新零售小程序开发|技术方案
未来零售的核心理念就是人和货的关系
|
6月前
|
Cloud Native 安全 数据安全/隐私保护
瓴羊朋新宇:与伙伴共同奔跑,瓴羊宣布开放六大数智底座能力及三大核心服务
瓴羊朋新宇:与伙伴共同奔跑,瓴羊宣布开放六大数智底座能力及三大核心服务
从开发角度看羊了个羊
从开发角度看羊了个羊
118 0
|
区块链 vr&ar 图形学
元宇宙链游系统开发技术及源码实现
元宇宙是一个新兴的技术领域,其中涉及到的技术和架构比较复杂。下面我提供一些基本的思路,但需要说明的是,元宇宙链游的开发需要根据具体的需求和技术栈进行设计和实现,因此具体的源码实现可能会有所不同。
|
小程序 安全 开发者
从产品角度分析羊了个羊为何能爆火
从产品角度分析羊了个羊为何能爆火
239 0
从产品角度分析羊了个羊为何能爆火
|
程序员
羊了个羊【程序员翻身经典案例】
羊了个羊【程序员翻身经典案例】
159 0
羊了个羊【程序员翻身经典案例】
|
存储 安全 算法
羊了个羊DAPP游戏链游系统开发(详情及源码)
元宇宙本体论的“共享”可以通过标准化的形式表现,标准是在科学研究和理论实践的基础上,在一定范围内经过协商一致获得的最佳秩序。元宇宙的标准可分为基础类、技术和平台类、数据和协议类、内容和资产类、应用和服务类、治理和监管类等五大类。基础类标准为其他标准建立共同的语言环境,包括术语、本体和分类、代码和标识、参考架构等内容。技术和平台类标准主要规范技术系统的分布式网络、智能计算、数据流动、信息安全和隐私保护等;数据和协议类标准主要规范数据格式、数据共享和流动、人机交互、系统兼容和互操作、跨平台身份互认等。
羊了个羊DAPP游戏链游系统开发(详情及源码)
下一篇
无影云桌面