写国际象棋游戏,麻烦从另一个获得一个方形对象

时间:2015-01-08 00:14:00

标签: java

我正在写一个国际象棋游戏。我的基本设计是有一个由方形物体组成的二维阵列(8 x 8)。 Squares有许多字段,包括file(char)和rank(int)。

我的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是不允许的。

知道这里有什么问题吗?

2 个答案:

答案 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是否在某个特定的等级或文件上。从长远来看,这种方法更简单,更易读。在这里添加和减去字符和整数似乎是不必要的。

一维数组也会表现得更好,但这在项目的这一点上是无关紧要的。