我正在尝试使用eclipse和gridworld检查奥赛罗游戏中的移动是否合法。我对该位置做的第一件事是检查它是否有效,但为了检查有效位置,它不需要为空。问题是,它是一个合法行动的要求之一是它是空/空/空闲。我该如何避免这种情况?我已经指出错误应该在哪里。 (对不起,如果这让任何人感到困惑。)
public boolean isLegal(Location loc1)
{
boolean isLegal = false;
String currentColor = currentPlayer.getColor();
int row = loc1.getRow();
int col = loc1.getCol();
if(board.isValid(loc1))
{
if(board.get(loc1) == null)
{
for(Location tempLoc : board.getValidAdjacentLocations(loc1))
{
**if(!board.get(tempLoc).equals(currentColor))**
{
if((row != tempLoc.getRow()) && (col == tempLoc.getCol()))
{
//count up column
if(tempLoc.getRow() < row)
{
for(int i = row; i > 1;)
{
Location tempLoc2 = new Location(i-2, col);
if(!board.get(tempLoc2).equals(currentColor))
{
i--;
}
else
{
i=-1;
isLegal = true;
}
}
}
//count down column
else
{
for(int i = row; i < 6;)
{
Location tempLoc2 = new Location(i+2, col);
if(!board.get(tempLoc2).equals(currentColor))
{
i++;
}
else
{
i=9;
isLegal = true;
}
}
}
}
else if(col != tempLoc.getCol() && row == tempLoc.getRow())
{
//count right row
if(col > tempLoc.getCol())
{
for(int i = col; i > 1;)
{
Location tempLoc2 = new Location(row, i-2);
if(!board.get(tempLoc2).equals(currentColor))
{
i--;
}
else
{
i=-1;
isLegal = true;
}
}
}
//count left row
else
{
for(int i = col; i < 6;)
{
Location tempLoc2 = new Location(row, i+2);
if(!board.get(tempLoc2).equals(currentColor))
{
i++;
}
else
{
i=9;
isLegal = true;
}
}
}
}
else
{ //count up/right diag
if(row-1 == tempLoc.getRow() && col+1 == tempLoc.getCol())
{
int j = col;
for(int i = row; i > 1;)
{
Location tempLoc2 = new Location(i-1, j+1);
if(!board.get(tempLoc2).equals(currentColor))
{
i--;
j++;
}
else
{
i=-1;
isLegal = true;
}
}
}
//count down/left diag
else if(row+1 == tempLoc.getRow() && col-1 == tempLoc.getCol())
{
int i = row;
for(int j = col; j > 1;)
{
Location tempLoc2 = new Location(i+1, j-1);
if(!board.get(tempLoc2).equals(currentColor))
{
i++;
j--;
}
else
{
i=9;
isLegal = true;
}
}
}
//count up/left diag
else if(row-1 == tempLoc.getRow() && col-1 == tempLoc.getCol())
{
int j = col;
for(int i = row; i > 1;)
{
Location tempLoc2 = new Location(i-1, j-1);
if(!board.get(tempLoc2).equals(currentColor))
{
i--;
j--;
}
else
{
i=-1;
isLegal = true;
}
}
}
//count down/right diag
else
{
int j = col;
for(int i = row; i > 6;)
{
Location tempLoc2 = new Location(i+1, j+1);
if(!board.get(tempLoc2).equals(currentColor))
{
i++;
j++;
}
else
{
i=-1;
isLegal = true;
}
}
}
}
}
}
}
}
return isLegal;
}
答案 0 :(得分:3)
一种解决方案是更改您的设计,以便永远不会有null
的位置。
您似乎将null
等同于“空闲”或“空”。而是首先创建所有位置(在奥赛罗板上没有很多位置)并使用boolean occupied = false
或等效成员变量初始化它们。然后你就有了:
if ( !board.get(loc1).isOccupied() ) { /*stuff*/ }
而不是空检查。
这是更好的面向对象设计,因为空位置仍然是一个位置,应该是可操作的。
答案 1 :(得分:1)
您不应将null
用作逻辑的一部分
null
它不是一个州,它是符号,没有州。
您应该将null
从逻辑中移除,如果某个引用是null
,您就会知道确实发生了一些非常糟糕的事情,与您的模型无关。在Location
内,您可以创建一个方法isEmpty()
或类似方法,这样您就可以轻松避免与null
进行比较。
答案 2 :(得分:0)
使用值enum
,BLACK
和WHITE
而不是VACANT
的{{1}}来存储每个位置的颜色标记。从String
类中的enum
返回相同的getColor()
。