我的getNewSquare方法采用起始方块并返回其上方的方形[垂直]方块和右侧的[水平]方格。负参数只是反方向。如果参数将我们从板上移开,则该方法应返回null。
public static Square getNewSquare (Square start, int vertical, int horizontal) {
int squareNumber = start.getNumberFromSquare();
//see if too far right or left
if ((int) (start.file - 'a') + horizontal >= 8 || (int) (start.file - 'a') + horizontal < 0) {
return null;
//see if too far up or down
} else if ( start.rank + vertical >= 8 || start.rank + vertical < 0) {
return null;
//otherwise
} else {
squareNumber += (8 * vertical + horizontal);
return getSquareFromNumber(squareNumber);
}
}
我有两个辅助函数,getNumberFromSquare和getSquareFromNumber。基本上每个方形对象都有一个数字。左上角是0,右下角是63.你从左到右,从上到下递增。
public int getNumberFromSquare() {
return (int) (this.file - 'a') + (8 - this.rank) * 8;
}
public static Square getSquareFromNumber(int candidate) {
char myFile = (char) (candidate % 8 + 'a');
int myRank = 8 - (candidate / 8);
return new Square(myFile, myRank);
}
当我运行此代码时:
Square south = Square.getNewSquare(start, -1, 0);
System.out.println("starting south square is " + south.getFile() + south.getRank());
我得到&#34;从南方广场开始是a9&#34;,这不应该作为排名&gt; 8是不允许的。
知道这里有什么问题吗?
答案 0 :(得分:0)
你的测试似乎在0到8之间运行;当然它们应该是0到7.但是你应该把它放在带有一些测试调用的调试器中并进行调试,没有这样做,试图找出错误是没有意义的。
答案 1 :(得分:0)
这不是您问题的直接答案,而是改善计划的建议。我在github(BlackWidow)上写了一个完整的国际象棋引擎+ ai + gui,你可以参考。
为什么没有一个简单的1-d Square
数组,而不是一个2d数组(8x8),只需编号为0->63
。如果你想要解决方块的等级或文件,只需要一个具有全局静态布尔数组的实用程序类
boolean [] FIRST_ROW = new boolean[64];
FIRST_ROW[0] = true;
FIRST_ROW[1] = true;
....
然后您可以简单地说:FIRST_ROW[Square.getCoordinate()]
来回答给定的Square
是否在某个特定的等级或文件上。从长远来看,这种方法更简单,更易读。在这里添加和减去字符和整数似乎是不必要的。
一维数组也会表现得更好,但这在项目的这一点上是无关紧要的。