如何实现交易卡游戏的“特殊效果卡”?


16

我正在尝试在这里编写一种交易卡游戏,以某种方式类似于Magic The GatheringYu-Gi-Oh!纸牌游戏。

对于那些不熟悉它的人,基本上,在游戏中,有一种特殊的卡(咒语卡/陷阱卡/等),它们具有可以改变游戏规则的特殊效果。我完全不知道的是,如何实现这些卡的逻辑。我有一些想法,用一些标志来存储卡的数据,这些标志可以发出信号来表明它具有什么样的能力,但是这样做的能力是非常有限的(也许只是一些简单的统计数据修改)。

为了让您大致了解这些牌的效果,以下是Yu-Gi-Oh中存在的咒语牌效果的一些示例纸牌游戏:

  • 恢复被摧毁的生物
  • 控制对手的生物
  • 根据某些条件(例如具有被破坏的某些名称的生物数量)修改生物的统计信息
  • 如果满足某些条件,则特殊召唤某些生物。
  • 将两个或多个生物融合成一个更强大的生物。
  • 不受某些特殊卡的影响。

Konami已经制作了数款游戏电子游戏,其中包括AI和数千种卡片。我认为实际上不可能对整个数据库进行硬编码,对吗?

现在,我当然想做的事没有这些游戏那么复杂,但是我很好奇,他们如何实现这些?

Answers:


17

有几个具有这种性质的开源项目,使用不同的方法来执行规则。这是来自较著名的MtG实现之一CardForge的创建者的博客文章。它可能不是一个完整的列表,但是包含几个开源项目,您可以在其中简单地浏览代码,或访问论坛中的特定问题。

作为一个实际的答案:最好的选择是建立一个强大的框架,即严格采用面向对象的编程。每个动作,每个触发器,每个能力都是一个对象。不用说,像手,图书馆这样的区域也是对象。在“规则”引擎中,切勿传递诸如字符串或整数之类的哑对象来描述游戏对象,而只能传递您的对象。

每个动作都会在堆栈上放置多个触发器,每个其他功能都可以检查它们是否关心该特定触发器,如果​​确实如此,则它们会触发自己的动作,并可能创建新的触发器,依此类推。

然后您根据游戏规则对这些堆栈进行处理,直到堆栈为空,此时可以采取新的操作,等等。

理想情况下,如果您完美地实现了游戏规则,则您的规则代码将不包含单个硬编码卡。硬编码卡可以创建方便的快捷方式,但是从长远来看,这将使您的代码肿并产生潜在的陷阱,例如发行新卡以新颖方式与这些卡进行交互时。在MtG之类的游戏中,有超过12,000张独特的纸牌,而且看不到尽头,其中有许多这样的互动。


1
好答案。从函数式编程世界来看,我希望每张卡都是游戏环境的封闭部分,变得更加荒谬。例如,通过将卡片列表添加到区域列表中,卡片可以可接受地创建新的“区域”。具体来说:僵尸怪物混乱: 所有失败的生物都会在没有特殊能力的情况下在新的“公墓”中复活,并根据掷骰子随机攻击玩家。
brice 2012年

附加链接:github.com/Fluorohydride/ygopro-core,用于著名的开源YGO实现,因为在该问题中还提到了YGO。
SK19

2

尝试仅将所有这些与开关和变量合并在一起是一项徒劳的任务。您将不得不对功能进行硬编码,或者更有可能需要在运行时解释脚本。您将向脚本公开必要的功能以检查木板,甲板和墓地的状态以及执行操作的功能,等等。然后,脚本只是一个简单的字符串,可以与该卡关联的其他变量一起存储。


或像hackworth建议的那样,将某种通用块组合在一起以获得所需的行为。我认为,除了他的建议外,还需要一些逻辑块。拥有共同的行为块可以使筛选具有某种共同品质的卡片变得更加容易。
托尼2012年

1

我还计划使用带有mysql db的网络语言进行纸牌游戏。我目前正在准备一个非常通用的设置,因此它对于新的独特卡非常灵活。例如代替:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

它很可能是:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

对所有操作应用此概念将简化类,只需在cards表中添加一行即可创建新的card。

所有选项和功能都将在该行的db中定义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.