【问题标题】:Is there any other more efficient approach for getting the possible moves in a Matrix and for iterating over them?有没有其他更有效的方法来获取矩阵中可能的移动并对其进行迭代?
【发布时间】:2021-04-18 09:40:45
【问题描述】:

我正在用 Java 创建一个算法来玩隔离游戏 (1vs1) 棋盘游戏:https://en.wikipedia.org/wiki/Isolation_(board_game) 基本上我的问题涉及遵循几个规则(稍后指定)移动棋子。我创建了这个解决方案(它有效)获取棋子的移动(仅可能的移动)并迭代它们以创建问题的新闻状态和我想知道是否有更有效的方法来解决这个问题。基本上,动作的作用是:

  1. 棋子可以在 8 个可能的方向上移动(上、下、左、右、对角线)。
  2. 棋子每步只能走1步。
  3. 如果有其他 pawn,或者该图块已降价,则该 pawn 无法移动到该图块。
  4. 每次移动后,玩家可以在棋盘上标记一块棋子(一个没有棋子,一个还没有标记)。

这是我的解决方案:

获取可能的动作

    public List<Integer> moves(int f, int c) {
    List<Integer> moves= new ArrayList<Integer>();
    int nuevaX,nuevaY;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            if (!(i == 1 && j == 1)) {
                nuevaX = f + (i - 1);
                nuevaY = c + (j - 1);
                if (disponible(nuevaX,nuevaY) && !ocupada(nuevaX, nuevaY)) {
                    moves.add(nuevaX);
                    moves.add(nuevaY);
                }
            }
        }
    }
    return moves;

迭代

List<Integer> moves = moves(f, c);
    for (int i = 0; i < moves.size(); i+=2) { 
        x = moves.get(i);
        y = moves.get(i+1);
        //Do some stuff
        }

【问题讨论】:

    标签: java


    【解决方案1】:

    你展示的代码已经非常快了。

    它执行恒定(不随板的大小而变化)和非常少量 (8) 的操作。

    您也许可以优化 disponible()ocupada() 方法,但尽管您没有展示这些方法,但我怀疑它们也很简单,因此已经很快。


    作为风格说明,我建议不要将xy 推入List&lt;Integer&gt;,而是创建一个Move 类(或record,如果您使用的是Java 15),具有 xy 字段,并创建一个 List&lt;Move&gt; 列表,这将使您的代码更易于阅读和理解。

    【讨论】:

      【解决方案2】:

      我唯一能想到的就是不要在每次玩家移动时创建一个新的 ArrayList,而是存储一个保留所有 8 个可能方向的位置状态(空、占用、移除、越界)的对象的运动。然后你只需更新附加到玩家位置的状态。

      可能有一种方法可以使用按位运算符/掩码一次性获得此状态,因为游戏总共只有 48 个方格,从技术上讲,我们关心的唯一状态(除了保持统计等)是 CAN 和 CANNOT 移动到。

      您可以用一个字节 (N,E,S,W,NE,NW,SE,SW) 屏蔽棋盘方位以仅获取相关的位。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-07
        相关资源
        最近更新 更多