gpt4 book ai didi

java - 正确的 Java 继承结构

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:31 27 4
gpt4 key购买 nike

我正在用 Java 编写一个 2048 游戏和自解算器。我最重要的类(class)是 Board ,其中包含主要的游戏功能。出于效率原因,游戏的许多方面都编码在数组中,例如向左或向右移动时每个可能行的转换。在 static初始化 block ,我调用 static void generateTables() ,它会创建一次表。

具有求解能力的板extend Boardimplement Solver , 一个包含高级方法的接口(interface) getDirection()getWorstLocation()接口(interface)类使用它们来运行求解器并获取提示。我感兴趣的主要求解器类型记录所有可能行的启发式值列表,然后使用这些值运行 expectiminimax 搜索。所以我有课:

public class HeuristicBoard extends Board implements Solver {

private static int[] heuristic; // Lookup table

/* ... methods omitted ... */

private int heuristic() {...}
// Calculates a heuristic value for the entire board based
// on calls to the following method
// This method's code could change depending on algorithm implementation.
private static int heuristic(short row) {...}
// Checks the lookup table for the row provided
private static void generateHeuristicTable() {...}
// Generates the lookup table based on calls to the following method
private static int heuristic(byte[] row) {...}
// Calculates the heuristic value for a single row.
// This method's code could change depending on algorithm implementation.
}

现在,我想测试多个不同的启发式方法,但使用相同的 expectiminimax 算法。因此, int heuristic() 的实现和 static int heuristic(byte[] row)会改变,而其他人将保持不变。抽象 HeuristicBoard 功能的最佳方法是什么?类,以便有多个实现 int heuristic() 的子(?)类和 static int heuristic(byte[] row) ?最好他们有一个共同的祖先,这样我就可以拥有:
ClassOrInterface firstSolver = new EmptySpaceHeuristicBoard();
ClassOrInterface secondSolver = new MonotonicityHeuristicBoard();

我在各种 StackOverflow 答案中所想到和看到的建议:
  • 制作 HeuristicBoard abstract并制作两种方法abstract .但是由于某种原因(是的,我已经阅读了原因)您不能拥有 static abstract方法。如果我制作 static int heuristic(byte[] row)非静态的,我无法在 static void generateHeuristicTable() 中使用它方法,应该在 HeuristicBoard 中实现类,而不是在子类中(我必须在每个子类中重新实现它,每次只更改一次性的 new SubclassOfHeuristicBoard().heuristic(currentRow)。如果我也将此方法设为非静态方法,忽略上面展示的不便,那么我就不会能够在 generateHeuristicTable() 初始化 block 中调用 static,这样就可以使用类的每个新实例生成(大)表。
  • 制作 HeuristicSolver包含静态方法的接口(interface),则有HeuristicBoard implement HeuristicSolver ,然后是子类 HeuristicBoard .但是,这迫使我提供静态方法的默认实现,我认为这没有意义。只有子类应该被实例化,因为只有它们应该提供启发式实现。此外,类中的其他静态方法仅在 Board 中找到静态变量。类(class)。
  • 还有其他的可能性,但是在制作 HeuristicBoard 之后它们真的会变得更糟。非抽象的。

  • 在我看来,唯一正确的方法是制作 HeuristicBoard abstract ,但我不知道如何处理 static方法。

    编辑:有人指出,这两种方法都可以更改为 non-static .这样就解决了上面的问题,但是现在我又遇到了一个问题:在非静态AI方法中,为了递归的目的,我复制了板子: HeuristicBoard option = new HeuristicBoard(board) .但是,如果类是抽象的,我就不能这样做。我应该如何创建当前类的实例? (即在 EmptySpaceHeuristicBoard 类中,当这个方法被继承和执行时,它应该创建一个 new EmptySpaceHeuristicBoard()

    最佳答案

    几点观察:

  • 静态方法始终可以实现为不使用任何实例变量的实例方法,因此应该可以解决您无法覆盖静态方法的问题。
  • 我不明白为什么启发式板正在扩展板。我认为拥有像 scoreBoard() 这样的方法的 Solver 类更有意义那需要一 block 板子。
  • 2048 不是 minimax 游戏,因为“对手”没有选择“min”选项,而是随机选项。因此要使用的优化器是expectimax。
  • 关于java - 正确的 Java 继承结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850855/

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