2014-10-09 47 views
1

有很多类,因此我只是要简化问题。基本上我有不同的物体的2D阵列:如果对象无法在二维数组中移动,则返回true

对象:

'*' - 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',那么代码会变得更大,并且看起来像是代码的重用。我想知道是否有人知道更好的方法来处理这种情况,或知道一种简化这种方法的方法。谢谢你对那些谁帮助:)

回答

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

那么你可以尝试检查是否存在单个空间,而不是检查空间是否存在,如果有意义的话。

相关问题