如果对象无法在二维数组中移动,则返回true

时间:2014-10-09 15:40:07

标签: java

有很多课程,所以我只是简化问题。基本上我有一个不同对象的2D数组:

物件:

 '*' - Blockcade
 '.' - Dot
 ' ' - Empty
 'A' - Player
 'B' - Player 

***************
**** * * ******
****   **** * *
*..A*      *B**
***************

我定义了一个方法getObject(x, y),它在xy坐标指定的位置返回对象。

播放器具有以下方法:getX()getY(),它们返回播放器对象的xy坐标。

我尝试做的是创建一个方法,如果两个玩家的周围图块都是'*'对象或'.'对象,则返回true。因此,例如,如果玩家的右侧,左侧,顶部和底部磁贴被'*''.'对象包围,则该方法应返回true。

***************
**** * * ******
****   **** * * = True
*..A*      *B**
***************

***************
**** * * ******
****   ****   *
*..A        B**  = False
***************

我尝试过的以及我想这样做的方式如下:

public Boolean cantMove() {
    return (((game.getObject(player1.getX(), player1.getY() + 1) instanceof Blockcade) || (game
            .getObject(player1.getX(), player1.getY() + 1) instanceof Dot))
            && ((game.getObject(player1.getX(), player1.getY() - 1) instanceof Blockcade) || (game
                    .getObject(player1.getX(), player1.getY() - 1) instanceof Dot))
            && ((game.getObject(player1.getX() + 1, player1.getY()) instanceof Blockcade) || (game
                    .getObject(player1.getX() + 1, player1.getY()) instanceof Dot))
            && ((game.getObject(player1.getX() - 1, player1.getY()) instanceof Blockcade) || (game
                    .getObject(player1.getX() - 1, player1.getY()) instanceof Dot))
            && ((game.getObject(player2.getX(), player2.getY() + 1) instanceof Blockcade) || (game
                    .getObject(player2.getX(), player2.getY() + 1) instanceof Dot))
            && ((game.getObject(player2.getX(), player2.getY() - 1) instanceof Blockcade) || (game
                    .getObject(player2.getX(), player2.getY() - 1) instanceof Dot))
            && ((game.getObject(player2.getX() + 1, player2.getY()) instanceof Blockcade) || (game
                    .getObject(player2.getX() + 1, player2.getY()) instanceof Dot)) && ((game
            .getObject(player2.getX() - 1, player2.getY()) instanceof Blockcade) || (game
            .getObject(player2.getX() - 1, player2.getY()) instanceof Dot)));
}

这看起来非常混乱,我觉得好像有更好的方法来做到这一点并使代码更好。我不太确定除此之外是否有任何其他方式所以我希望有人可以帮助我。根据我现在所拥有的,如果我要添加另一个播放器,例如C'那么代码会变得更大,看起来它是代码的重用。我想知道是否有人知道更好的方法来处理这种情况或知道一种方法来简化这种方法。感谢有帮助的人:)

2 个答案:

答案 0 :(得分:3)

您可以拥有Player数组并分别在每个播放器上运行cantMove(),以根据当前坐标检查它们是否被包围(使用getX()getY())。现在你在每个玩家手动调用你的方法,这可以压缩成一个普通的情况。

    Player[] players;

    //Players added to array here

    public boolean someMethod() {
        for (Player p : players)
            if (!p.cantMove())
                return false;
        return true;
    }

此外:

假设您的世界以某种数组表示,因为您可以使用坐标检索对象,您可以尝试检查某个位置的对象是否为空,而不是检查它可能是什么。

答案 1 :(得分:1)

您可以尝试检查是否存在单个空格,而不是检查空间是否存在(如果有意义的话)。