如何从多个类扩展状态

2024-04-12

(请注意:了解集换式卡牌游戏《万智牌:聚会》将是一个优势。抱歉,我不知道如何更容易地表达它。)

我使用时遇到了一个问题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(使用前将#替换为@)

如何从多个类扩展状态 的相关文章

  • 如何使用 Java 将 HTML 内容转换为 PDF 而不丢失格式?

    我有一些 HTML 内容 包括格式化标签 例如strong 图像等 在我的 Java 代码中 我想将此 HTML 内容转换为 PDF 文档 而不丢失 HTML 格式 有没有办法用 Java 来实现 使用 iText 或任何其他库 I use
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • Kerberos 缓存票证

    我使用的是 Windows 7 64 位 我创建了一个简单的应用程序来对实现 PrivilegedAction 的类的 run 方法中的文件进行计数 以下是我的 jaas conf 文件 CountFiles com sun securit
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • ViewPager 的 Android Viewholder

    您好 我正在使用 ViewPager 但我现在想保留状态 而不是重新生成单元格 我注意到 viewpager 与 listviews 的自定义适配器非常相似 它们的功能类似 listview 在单元格不再出现在屏幕上后重新生成单元格中的数据
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • Jenkins 管道和 java.nio.file.* 方法的问题

    我正在尝试使用 java nio file 中的方法在 Jenkins 管道中执行一些基本文件操作 无论代码存在于哪个节点块中 代码都在主节点上执行 在管道中 我已经验证了各个节点块都是正确的 它们唯一地标识了特定的节点 但是 pathEx
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri

随机推荐

  • 如何使用adb shell输入来输入&符号?

    adb shell input text 不起作用 也不行adb shell input keyevent KEYCODE AMPERSAND 相关问题 7789826 https stackoverflow com questions 7
  • Android约束布局水平划分

    我正在处理一个 Android 项目 我使用了ConstraintLayout 我想将布局设计为两个保持水平线的块 每个块将获得 50 的宽度 我怎样才能做到这一点ConstraintLayout 有两种方法可以做到这一点 使用链约束 使用
  • 如何在卡西欧 fx-991ES 计算器中计算 Mod b

    有谁知道如何在卡西欧 fx 991ES 计算器中计算 Mod b 谢谢 该计算器没有任何模函数 然而 有一种非常简单的方法可以使用显示模式来计算模数ab c 而不是传统的d c 如何切换显示模式ab c Go to settings Shi
  • 如何在 C# 中获取文件夹大小? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中获取目录大小 目录中的文件 https stackoverflow com questions 1118568 how do i get a directory size files i
  • Itext 7 - PdfReader 未使用所有者密码打开错误

    I am using This example https developers itextpdf com content itext 7 jump start tutorial examples chapter 5 for the lat
  • 迭代数组时应该使用 for-of 还是 forEach? [复制]

    这个问题在这里已经有答案了 另外 这是风格问题还是功能问题 这是一个偏好问题还是一个更好 我试图理解 for of 的目的 通常我使用 let iterable 10 20 30 iterable forEach val gt consol
  • 将 WAV 文件转换为频谱图

    嗨 我对这件事很陌生 所以请耐心等待 我正在尝试将 WAV 文件转换为频谱图 但不确定如何开始 我读到一些内容 说要读取 PCM 数据 我认为是我的 WAV 文件 并将其存储在 WavReader 类的数组中 然后再对其应用 FFT 并将其
  • django:gettext 并强制转换为 unicode

    我的 Django 应用程序中有以下代码 class Status object def init self id desc self id id self desc desc def unicode self return self de
  • 将所有选定的项目从 ListView 复制到 ListView 2

    如何将多个项目从 ListView 复制到另一个 现在我正在这样做 procedure TForm1 CopyToRightClick Sender TObject var selected TListItem addItems TList
  • 主动调整主窗口内小部件的大小

    I have a few widgets in a main window i want the user to be able to resize the widgets inside the window as they please
  • 替换 DataColumn 中的值

    循环行时如何替换列值 我的数据表有两列 我想替换每一行第一列的值 我无法获取或设置列值 到目前为止 我只能访问 DefaultValue 和 ColumnName 等 即使创建新的 DataColumn 我也无法设置其值 感觉我在这里缺少一
  • 如何使用批处理文件从系统配置中删除环境变量

    我需要从客户端工作站中删除系统变量 我有 500 多个客户端 所以我想提供批处理文件给用户自己运行以删除系统变量 You may want to make these two permanent with setx but obviousl
  • 如何在Linux shell脚本中插入新行? [复制]

    这个问题在这里已经有答案了 我想在多个 echo 语句之间插入一个新行 我努力了echo hello n 但它不起作用 正在打印 n 我想要这样的期望输出 Create the snapshots Snapshot created 在之间插
  • 如何在不闪烁的情况下更新 Shiny 中的值?

    我每秒都会更新一个闪亮的文本输出 该文本输出是从 SQL 数据库读取的 这只需要一些时间 在仪表板中 我只想看看输出如何变化而没有花哨的动画 闪烁 是否可以在等待更新时删除动画并仅显示文本 这是一些代码示例 您可以在其中看到更新的闪烁 ui
  • C++ 对象将模板化函数和参数保留为成员以便稍后调用

    我有课Door实现一个方法LockCheck 和一个类Stove用一种方法BurnerCheck 我想要上课House作为构造函数参数Door LockCheck or Stove BurnerCheck以及给定函数的一组未知参数 Hous
  • Xcode 7 - 如何删除 ld: warning: -read_only_relocs 不能与 x86_64 一起使用

    我最近更新到了 Xcode 7 现在在编译时收到以下警告 ld 警告 read only relocs 不能与 x86 64 一起使用 我认为我没有更改构建设置或代码中的任何内容来创建它 有谁知道导致此警告的原因以及如何删除它 我已经为感兴
  • 用于组合垂直/内联字段的 Bootstrap 复杂表单布局

    我对 Bootstrap 很陌生 但我的技能增长很快 也很欣赏它 我需要构建一个相当复杂的页面 其中包含大量表单元素 包括多个地址填写组件 我在这里附上了我想要的基本设计的图像 但似乎无法使用我可用的基本表单设计元素来实现它 我觉得我的方法
  • 获取WPF中控件的可见大小

    我有一个未完全显示的控件 通过减小窗口大小 但该控件的 ActualWidth 和 RenderSize DesiredSize 仍然显示其总大小 我编写了下一个代码 但它忽略了窗口的滚动条宽度 看起来很丑 也许有一种方法可以以更优雅的方式
  • 如何使用javascript浏览器端获取显卡驱动程序名称?

    我想得到一个像这样的字符串 英特尔开源技术中心 Mesa DRI 英特尔 R 高清显卡 520 Skylake GT2 仅在浏览器上使用 javascript 我知道有一个图书馆augur io https www augur io dev
  • 如何从多个类扩展状态

    请注意 了解集换式卡牌游戏 万智牌 聚会 将是一个优势 抱歉 我不知道如何更容易地表达它 我使用时遇到了一个问题Java 我将描述如下 我有一个名为 Card 的基本类 具有以下所有属性 public class Card String N