2013-11-23 92 views
2

我在制作纸牌游戏。我们假设它类似于万智牌,炉石等。跟踪卡牌交易游戏的游戏状态

我想弄清楚的问题是如何构建“光环”以及每张卡受到多少伤害。

现在我有一个卡组,我存储卡数据如下。我已经组成了将存在的卡片类型的名称。

M.card = {} 
-- Minion cards have health and damage 
M.card[1].name = "Minion" 
M.card[1].hp = 1 
M.deck[1].dmg = 1 

-- Super Minions have more health and damage 
M.card[2].name = "Super Minion" 
M.card[2].hp = 4 
M.card[2].dmg = 4 

-- Spell cards have no health and damage. Instead they affect the health and damage of other cards. 
M.card[3].name = "Heal" 
M.card[3].details = "This card heals any character for +2 health" 
M.card[3].healthboost = 2 

M.card[4].name = "Damage Boost" 
M.card[4].details = "This card gives + 1 damage to any other card for 1 turn" 
M.card[4].dmgboost = 1 

-- Super damage boost gives more damage boost to other cards 
M.card[5].name = "Super Damage Boost" 
M.card[5].details = "This card gives +3 damage to any other card permanently" 
M.card[5].dmgboost = 3 

所以当一张卡攻击另一张卡时,我需要跟踪两张卡所受的伤害。我不想更改每张卡片的基本统计数据,因此我需要跟踪调整情况。

我可以做这样的事情

-- Super Minion takes 3 damage 
M.card[2].newHp = 1 
-- or 
M.card[2].adjHp = -3 
-- Not sure which is better. 

在战斗中我需要跟踪它的光环播放。例如,如果损害提升卡被播放。我只需要在一回合就给予另一张卡+1伤害。

比方说,我跟踪每回合数从1开始

我应该做这样的事情

M.aura[1] = 4 -- (aura 1 is card # 4) 
M.aura[1].target = 2 -- (this aura is applied to card 2) 
M.aura[1].expires = 5 -- (this aura expires on turn 5) 

M.aura[2] = 3 -- (second active aura is heal, card #3) 
M.aura[2].target = 2 
M.aura[2].expires = 0 -- this is a one time aura. So I need to apply it to card #2 and then immediately expire it so it never activates again. 

然后在每一个新的转折我遍历所有的光环,并确保在战斗开始前他们仍然活跃?

从建筑学角度来说,追踪角色所受伤害的最好方法是什么,而且正在给角色特殊能力的活跃魔法。

回答

1

为什么不制作在游戏过程中永远不会改变的不可变参考卡的卡片实例,并与实例的父亲进行比较?你可以用一些简单的object orienting来做到这一点。

另外,如果这不适合你,你可以给每张卡片一个最大或基本的HP场。

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 

这些只是你可以处理这个问题的很多方法中的几个例子。不过,我相信这足以给你一些现在的想法。

+0

我喜欢这种方法。但是我该如何处理其他卡片给予的效果,以及在其他卡片被破坏时效果会消失的效果。假设卡牌1对所有其他友方卡牌造成+1点伤害。我不希望对所有卡片增加1点伤害效果,并且与原卡片的死亡有关。相反,将效果绑定到提供效果的卡片上可能更有意义,因此当卡片死亡时,效果会自动从所有卡片中移除。但是,你会如何编程? –

+1

@fun_programming你可以给这个效果指定一个指向给予它们效果的卡片的字段,例如'dependsOn',然后当你处理效果以移除或者处理它们时,检查从属卡片是否仍然在播放,如果不是,则删除效果。 –

0

为了使卡的存在暂时影响另一张卡的品质,请使用观察者或回调模式。当你“吸取”(从甲板或手中拿出)对所有其他友军卡片造成+1伤害的特殊卡牌时,你可能会有一个功能findAllOtherFriendlyCards(yourSpecialCard, allCards)这样做。然后在此功能中,对于您找到的每张友方卡片,您都可以拨打specialCard:registerDiscard(yourFriendlyCard),将其注册为特殊卡片。然后,当特殊卡被丢弃时(这大概是通过调用specialCard:discard()发生的),该方法查看所有已注册卡并重新调整特殊卡受影响的属性。

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

如果在特殊卡牌被丢弃之前可以丢弃友方卡牌,则使用类似技术:友方卡牌必须跟踪调整它的每张特殊卡牌,并在特殊卡牌被丢弃时通知该特殊卡牌,可以从列表中删除它。