【发布时间】:2023-04-09 05:35:01
【问题描述】:
我正在构建一个游戏模拟器,它有数百个微步骤,如下所示。它们各自执行一项独特的任务,但为了简洁起见,我省略了实现细节。
public class Sim {
static void phase() {
phaseIn();
phaseOut();
}
static void untap() {
}
static void upkeep() {
}
static void draw() {
}
...
}
Turn 通常涉及顺序执行步骤,但有时特殊效果可能会导致顺序发生变化。例如,我可能需要重复一个步骤两次、跳过一个步骤或重新排列步骤的顺序。这些动作都是特殊情况,因为转弯通常只是从开始到结束的顺序发生。
例如,下面的一系列事件代表我的正常轮到。
... > upkeep() > draw() > preCombatMain() > ...
现在,我玩的东西需要我重复抽牌步骤。我需要变成这样:
... > upkeep() > draw() > draw() > preCombatMain() > ...
一个回合的步骤是方法,我不知道如何使方法入队或出队。我知道 Java 8 有方法引用,但该功能相对较新。我无法将existing tutorials 应用于我想要完成的工作。我到了Sim::untap,但我不知道如何分配、调用它等。如何在 Java 8 中对方法进行排队,或者按照运行时确定的顺序调用方法- 时间取决于玩家做出的选择?
注意:我意识到我无法理解可能是由于基本的设计缺陷。我从未上过游戏设计课程,我完全愿意接受批评,如果设计有缺陷,我会改变我的设计。也就是说,这个问题不应被误解为“请推荐一种设计模式”。我考虑过另一种设计,我在大量 switch 语句中为每个步骤“编号”,排队“编号”,并在队列的前面反复切换,但这似乎是一个糟糕的计划(在我看来)。
【问题讨论】:
-
您为什么要使用 Java 8 开发游戏?如果您打算分发它,则需要一段时间才能被市场采用。 Java 7 是多年前发布的,但仍然不是标准。如果您使用 Java 8 的特定功能,您可能会错过部分市场。
-
@DeadChex 这甚至不是可分发的产品。如果我这样做,我将违反版权法。我编写游戏是为了好玩,并提高我对规则的理解,这些规则相当全面。如果我碰巧完成了它,那么我和我的朋友们就可以免费练习了。
-
@DeadChex 最坏的情况是你还是捆绑了 JRE。
-
如果只是排队方法调用的问题,你可以只使用
Queue<Runnable>并将每个步骤实现为实现Runnable的类。但我怀疑一个简单的基于队列的设计不够灵活,无法处理游戏中可能发生的所有事情,而且隐含的“真实”问题,即如何在 Java 中实现 M:TG 可能对StackOverflow 问题。 -
@TomG JRE8 可以在当今大多数平台上运行吗?