记录卡片交易游戏的游戏状态

我正在开发一款卡牌游戏,类似于《魔法风云会》、《炉石传说》等游戏。

我现在要解决的问题是如何设计“光环”,以及每张卡牌受到多少伤害。

现在我有一副牌,将卡牌数据存储如下。我编造了一些卡牌类型的名称,以便表示将要存在的各种卡牌。

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,然后立即过期,以便它永远不再激活。

然后,在每个新回合中,我循环遍历所有的光环,在战斗开始之前确保它们仍然有效?

只是想知道,在架构上,跟踪角色受到的伤害和激活给予角色特殊能力的法术的最佳方式是什么。

点赞
用户828255
用户828255

为什么不将卡牌的实例化更改为不可变的引用卡牌,在游戏过程中不会被更改,并与实例的父级进行比较?您可以使用一些简单的 面向对象编程 来实现。

或者,如果您不喜欢这种方法,您可以为每个卡牌赋予最大或基础的生命值字段。

table.insert(M.card, {
    name = "Wizard",
    hp = 10,
    basehp = 10,
    dmg = 5
})

至于卡牌上的时限效果,您可以在卡牌本身上进行跟踪。

M.card[1].effects = { { dmgboost = 2, expires = 3 } }

为基础卡牌提供一个函数,以便基于效果来计算卡牌的统计信息。

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

这些只是处理此问题的众多方法之一。但我相信这足以激发您目前的一些想法。

2013-11-23 02:41:41
用户869951
用户869951

为了让一张牌的存在暂时影响另一张牌的属性,使用观察者或回调模式。当你“抽出”特殊牌(给所有其他友方牌+1伤害的牌)时,假设你有一个函数findAllOtherFriendlyCards(yourSpecialCard,allCards)来找它们。然后在这个函数中,对于你找到的每一张友方牌,你通过调用specialCard:registerDiscard(yourFriendlyCard)来“注册”友方牌与特殊牌相对应。然后当特殊牌被丢弃时,即通过调用specialCard:discard(),此方法会查看所有已注册的卡并重新调整特殊卡影响的属性。

事实上,你不需要单独的注册方法,你可以只有一个specialCard:startEffect(friendlyCard):这个方法调整一些友好卡牌的属性并将其保留在一个列表中,你还有一个specialCard:endEffect(friendlyCard),它完成相反的操作,即在相反的方向上调整属性(如果它开始时是-1,则为+1等),并从受影响卡牌的列表中移除它。

如果友方卡牌可以在特殊卡牌被丢弃之前被丢弃,那么你可以使用类似的技巧:友好卡牌必须跟踪调整它的每个特殊卡,并在被丢弃时通知特殊卡,以便特殊卡可以从其列表中删除它。

2013-11-23 05:11:26