记录卡片交易游戏的游戏状态
我正在开发一款卡牌游戏,类似于《魔法风云会》、《炉石传说》等游戏。
我现在要解决的问题是如何设计“光环”,以及每张卡牌受到多少伤害。
现在我有一副牌,将卡牌数据存储如下。我编造了一些卡牌类型的名称,以便表示将要存在的各种卡牌。
M.card = {}
-- 小兵卡牌有生命和伤害值
M.card[1].name = "小兵"
M.card[1].hp = 1
M.deck[1].dmg = 1
-- 超级小兵具有更多的生命和伤害值
M.card[2].name = "超级小兵"
M.card[2].hp = 4
M.card[2].dmg = 4
-- 法术卡牌没有生命和伤害值。相反,它们影响其他卡牌的生命和伤害值。
M.card[3].name = "治疗"
M.card[3].details = "这张卡牌可以使任何角色回复 +2 点生命值"
M.card[3].healthboost = 2
M.card[4].name = "伤害提升"
M.card[4].details = "这张纸牌使任何其他纸牌在 1 回合内增加 + 1 伤害值"
M.card[4].dmgboost = 1
-- 超级伤害提升使其他卡牌获得更多的伤害提升效果
M.card[5].name = "超级伤害提升"
M.card[5].details = "这张纸牌会使任何其他纸牌永久增加 +3 点伤害值"
M.card[5].dmgboost = 3
因此,当一张卡牌攻击另一张卡牌时,我需要跟踪两张卡牌所受到的伤害。我不想更改每张卡牌的基本属性,因此我需要跟踪调整。
我可以这样做
-- 超级小兵会受到 3 点的伤害
M.card[2].newHp = 1
-- 或者
M.card[2].adjHp = -3
-- 不确定哪种方法更好。
在战斗期间,我需要跟踪哪些光环是播放的。因此,例如如果播放了“伤害提升”纸牌,我需要为另一张卡牌提供 +1 伤害,仅持续一回合。
假设我以从 1 开始的每回合号码记录每一个回合。
我应该这样做
M.aura[1] = 4 --(光环 1 是纸牌 #4)
M.aura[1].target = 2 --(这个光环应用于卡牌 2)
M.aura[1].expires = 5 --(这个光环在回合 5 到期)
M.aura[2] = 3 --(第二个活动光环是治疗,纸牌 #3)
M.aura[2].target = 2
M.aura[2].expires = 0 --这是一次性光环。因此,我需要将其应用于纸牌 2,然后立即过期,以便它永远不再激活。
然后,在每个新回合中,我循环遍历所有的光环,在战斗开始之前确保它们仍然有效?
只是想知道,在架构上,跟踪角色受到的伤害和激活给予角色特殊能力的法术的最佳方式是什么。
为了让一张牌的存在暂时影响另一张牌的属性,使用观察者或回调模式。当你“抽出”特殊牌(给所有其他友方牌+1伤害的牌)时,假设你有一个函数findAllOtherFriendlyCards(yourSpecialCard,allCards)来找它们。然后在这个函数中,对于你找到的每一张友方牌,你通过调用specialCard:registerDiscard(yourFriendlyCard)来“注册”友方牌与特殊牌相对应。然后当特殊牌被丢弃时,即通过调用specialCard:discard(),此方法会查看所有已注册的卡并重新调整特殊卡影响的属性。
事实上,你不需要单独的注册方法,你可以只有一个specialCard:startEffect(friendlyCard):这个方法调整一些友好卡牌的属性并将其保留在一个列表中,你还有一个specialCard:endEffect(friendlyCard),它完成相反的操作,即在相反的方向上调整属性(如果它开始时是-1,则为+1等),并从受影响卡牌的列表中移除它。
如果友方卡牌可以在特殊卡牌被丢弃之前被丢弃,那么你可以使用类似的技巧:友好卡牌必须跟踪调整它的每个特殊卡,并在被丢弃时通知特殊卡,以便特殊卡可以从其列表中删除它。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
为什么不将卡牌的实例化更改为不可变的引用卡牌,在游戏过程中不会被更改,并与实例的父级进行比较?您可以使用一些简单的 面向对象编程 来实现。
或者,如果您不喜欢这种方法,您可以为每个卡牌赋予最大或基础的生命值字段。
table.insert(M.card, { name = "Wizard", hp = 10, basehp = 10, dmg = 5 })至于卡牌上的时限效果,您可以在卡牌本身上进行跟踪。
为基础卡牌提供一个函数,以便基于效果来计算卡牌的统计信息。
function Card:damage() local d = self.dmg for _, v in ipairs(self.effects) do if v.dmgboost then d = d + v.dmgboost end end return d end function Card:processEffects() for i = #self.effects, 1, -1 do if turn >= self.effects[i].expires then table.remove(self.effects, i) end end end这些只是处理此问题的众多方法之一。但我相信这足以激发您目前的一些想法。