Java 写国际象棋,从一个正方形物体到另一个正方形物体的麻烦

Java 写国际象棋,从一个正方形物体到另一个正方形物体的麻烦,java,Java,我在写一盘棋。我的基本设计是拥有一个由正方形对象组成的8x8二维阵列。正方形有许多字段,包括file和rank 我的getNewSquare方法获取一个起始正方形,并返回它上面的正方形[垂直]正方形和它右边的[水平]正方形。负的参数正好相反。如果参数使我们离开了电路板,那么该方法应该返回null public static Square getNewSquare (Square start, int vertical, int horizontal) { int squareNumber

我在写一盘棋。我的基本设计是拥有一个由正方形对象组成的8x8二维阵列。正方形有许多字段,包括file和rank

我的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);
    }   
}
当我运行此代码时:

Square south = Square.getNewSquare(start, -1, 0);
System.out.println("starting south square is " + south.getFile() + south.getRank());
我从南边的广场开始是a9,这应该是不可能的,因为排名>8是不允许的


你知道这里出了什么问题吗?

你的测试似乎运行在0到8之间(包括0到8);当然应该是0比7。但是你应该把它放在一个带有测试调用的调试器中,并对它进行调试,如果不这样做,试图找出错误的地方是没有意义的。

这不是对你问题的直接回答,而是关于改进程序的建议。我已经在github上编写了一个完整的chess engine+ai+gui,您可以参考

与其使用二维阵列8x8,不如使用简单编号为0->63的一维正方形阵列。如果您想要解析正方形的秩或文件,只需使用一个具有全局静态布尔数组的实用程序类

boolean [] FIRST_ROW = new boolean[64];
FIRST_ROW[0] = true;
FIRST_ROW[1] = true;
....
然后您可以简单地说:第一行[Square.getCoordinate],以回答给定的正方形是否位于特定的等级或文件上。从长远来看,这种方法更简单,可读性更强。加减字符和整数在这里似乎是不必要的


一维数组的性能也会更好,但在您的项目中,这一点并不重要。

国际象棋不是基于零的。同意,但我代表棋盘的基本二维数组是start的值是多少?它会影响getNewSquare的运行方式我怀疑start.rank是7或8。start的值是左上角的正方形我意识到这并不能回答您的问题,但从设计角度来看,我建议创建一个Board类,其职责是管理正方形对象。我还可以让每个正方形对象知道它在电路板上的位置,即行和列作为整数。然后你问Board对象一个特定坐标处的正方形,或者相对于另一个正方形的正方形。我说的是实际的数值。我看到这种中断的方式是,如果候选者/8==-1。在我脑海中,似乎每次调用getSquareFromNumber时,都会创建一个新的方形对象。所以如果你在2,3有一个正方形,向东走一个正方形,你在3,3创建一个新的正方形;如果你把你的新正方形向西移动一个正方形,你将为2,3创建一个新的正方形,它将是一个独立于你开始使用的正方形的对象。我预见到了这方面的问题。如果你有多个相同坐标的正方形,你把一块放在哪个上面?我认为杰森在正确的轨道上。
boolean [] FIRST_ROW = new boolean[64];
FIRST_ROW[0] = true;
FIRST_ROW[1] = true;
....