(请注意:了解集换式卡牌游戏《万智牌:聚会》将是一个优势。抱歉,我不知道如何更容易地表达它。)
我使用时遇到了一个问题Java,我将描述如下...我有一个名为 Card 的基本类,具有以下所有属性:
public class Card{
String Name;
String RulesText;
String FlavorText;
String Cost;
int ConvertedCost;
String Rarity;
int Number;
}
永久物类别扩展了卡牌,并依次由生物、鹏洛客、神器、土地和结界类别扩展。到目前为止,其中只有前两个拥有自己的领域:
public class Creature extends Permanent{
int Power;
int Toughness;
}
public class Planeswalker extends Permanent{
int Loyalty;
}
问题:
- 一些永久对象可能会受到影响其子类对象的方法的影响,例如,作为人工制品和生物,或者作为人工制品和土地。我知道我可以使用接口来扩展行为,但是除非我使用抽象类,否则我不能这样做来扩展状态,并且在某些情况下我需要一个具有以下状态的对象both文物和生物。
- 给定子类的大多数永久对象不能受到影响通过针对 a 对象的方法不同的子类。 (即,仅针对附魔对象的方法不能影响生物对象。)
我认为你遇到的问题比你知道的还要多。卡牌和永久物之间有区别,卡牌执行效果,例如召唤生物,而召唤产生的永久物是场上的生物。为了方便起见,游戏中使用卡片来表示这两种事物,但在编程过程中您会想要区分它们。
MTG 在某些情况下,永久物与卡牌不直接相关(像蜂巢这样的卡牌生成仅由令牌表示的生物,它们没有卡牌表示),因此您的继承层次结构不适用于这种情况。虽然您需要保持卡牌与其召唤的生物之间的联系(这样您就知道何时将卡牌发送回弃牌堆),但我认为您所制定的具体继承关系不会是有用。您可能需要一种卡牌层次结构和另一种不同的永久物层次结构。不要忽视层次结构的可能性(因为有许多继承关系可以有效地利用),只是要小心地将单独的事物分开。
我建议阅读 Steve Yegge 的博客文章通用设计模式 http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html,他在其中谈到了在他的游戏中使用属性模式(看起来与 MTG 一样灵活)。显然,游戏中事物的许多特征都是可变的(包括什么是生物,什么不是,因为有些卡牌可以将土地更改为生物),并且处理属性及其更改(包括过期的临时更改)的系统是将是必不可少的。类层次结构本身不够灵活,无法适应 MTG 中的各种效果。
MTG 的有趣之处在于,你拥有这个表面上的主题领域(由生物、法术、神器、土地等组成),看起来可以理解且可靠,但规则允许这些事物以不可预测的方式发生变化(特别是因为随时可以推出新卡)。主题域是通过游戏域(操纵主题域的规则集)来实现的。如果您将主题域硬编码到您的实现中(通过扩展超类或实现接口来表示 Lands 或 Artifacts 之类的事情),那么您总是会遇到无法做到的事情,并且解决这些问题可能很困难或不可能。阅读规则,注意引入的技术术语(卡牌、永久物、令牌、效果等),因为这是您需要实现的真正领域。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)