gpt4 book ai didi

java - Java 8 的队列方法

转载 作者:行者123 更新时间:2023-12-03 16:21:31 24 4
gpt4 key购买 nike

我正在构建一个具有数百个微步骤的游戏模拟器,如下所示。它们各自执行一项独特的任务,但为了简洁起见,我省略了实现细节。

public class Sim {

static void phase() {
phaseIn();
phaseOut();
}

static void untap() {
}

static void upkeep() {
}

static void draw() {
}

...
}

Turn 通常涉及按顺序执行步骤,但有时特殊效果可能会导致顺序发生变化。例如,我可能需要重复一个步骤两次、跳过一个步骤或重新排列步骤的顺序。这些 Action 都是特殊情况,因为转弯通常只是按从开始到结束的顺序发生。

例如,下面的一系列事件代表我的正常回合。

... > upkeep() > draw() > preCombatMain() > ...

现在,我要玩一些需要我重复抓牌步骤的东西。我需要轮到我看起来像这样:

... > upkeep() > draw() > draw() > preCombatMain() > ...

一个回合的步骤都是方法,不知道入队出队的方法。我知道 Java 8 有方法引用,但是这个特性比较新。我一直无法申请existing tutorials到我想要完成的事情。我得到了 Sim::untap,但我不知道如何分配它、调用它等。我如何在 Java 8 中对方法进行排队,或以其他方式按照玩家做出的选择在运行时确定的顺序调用方法?

注意:我意识到我无法理解可能是由于基本的设计缺陷。我从来没有上过游戏设计类(class),我完全接受批评,如果有缺陷我会改变我的设计。也就是说,这个问题不应被误解为“请推荐一种设计模式”。我考虑了另一种设计,我在大量 switch 语句中对每个步骤进行“编号”,对“编号”进行排队,并在队列的前面重复切换,但这似乎是一个糟糕的计划(在我看来)。

最佳答案

如果你只是想让它们顺序运行,你当然可以一个接一个地调用它们。如果顺序可以改变,另一种方法是使用方法引用队列:

LinkedList<Runnable> queue = new LinkedList<>();
queue.add(Sim::upkeep);
queue.add(Sim::draw);
queue.add(Sim::preCombatMain);
queue.forEach(Runnable::run);

我能够使用 LinkedList<Runnable>因为你的方法的签名是 void m() .对于其他签名,您可以使用其他类型,例如:

  • void m()使用 Runnable
  • T m()使用 Supplier<T>
  • void m(T o)使用 Consumer<T>
  • R m(T o)使用 Function<T, R>

关于java - Java 8 的队列方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com