如何使用JAVA查找当前位置的可能国际象棋(骑士)位置?

时间:2017-03-17 10:38:40

标签: java chess

我试图解决这个问题。它应该采用两个坐标参数并显示与输入的位置坐标相关的可能的下一个位置。目前我能够获得进入位置的棋盘,但如何计算骑士国际象棋棋子的下一个可能位置?感谢任何线索/建议。 我的主要档案:

package lt.chess;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Board board = new Board();
        Scanner scanner = new Scanner(System.in);
        System.out.println("");
        System.out.print("Enter board number: ");
        String digit = scanner.next();

        System.out.print("Enter board letter: ");
        String letter = scanner.next();

        Knight knight = new Knight("Knight");
        board.setFigure(knight, digit, letter);
        board.showFigures();
    }
}

董事会成员:

package lt.chess;

public class Board {
    private String letters = "ABCDEFGH";
    private String digits = "12345678";

    private Figure[][] arrayFigure = null;

    public Board() {
        arrayFigure = new Figure[letters.length()][digits.length()];
        createBoard();
    }

    private void createBoard() {
        for (int row = digits.length() - 1; row >= 0; row--) {
            System.out.print(digits.charAt(row));

            for (int x = 0; x < letters.length(); x++) {
                System.out.print("  ");
                if (arrayFigure[row][x] != null)
                    System.out.print("X");
            }

            System.out.println("");
            if (row == 0) {
                System.out.print("   ");

                for (int col = 0; col < letters.length(); col++) {
                    System.out.print(letters.charAt(col) + " ");
                }
            }
        }
    }

    public void setFigure(Knight knight,
                          String digit,
                          String letter) {
        int y = digits.indexOf(digit);
        int x = letters.indexOf(letter);
        arrayFigure[y][x] = knight;
    }

    public void showFigures() {
        createBoard();
    }

}

图类:

package lt.chess;

public class Figure {
    private String[] figureColor = {"Black", "White"};
    private String figureName;

    Figure(String figureName) {
        this.figureName = figureName;
    }

    public String getName() {
        return this.figureName;
    }

}

骑士班:

package lt.chess;

public class Knight extends Figure {

    Knight(String name) {
        super(name);
    }

}

2 个答案:

答案 0 :(得分:0)

您可以创建两个这样的数组

int[] x = {-2, -1, 1, 2, 2, 1, -1, -2};
int[] y = {1, 2, 2, 1, -1, -2, -2, -1};

这有助于您根据当前位置计算骑士基地的最多8个不同位置。 在那之后,每当你需要计算可能的骑士跳跃时,只需在它上面循环

for(int i = 0; i < 8; i++) {
        System.out.println(String.format("Possible knight location: %d, %d", current_x + x[i], current_y + y[i]);
}

注意:您应该考虑电路板边缘以及位置已经有其他数字。

答案 1 :(得分:0)

要将板边和使用过的字段的控件添加到Minh的答案,我会提供一种方法来创建下一个可能的位置(点)

 private LinkedList<Point> getNextPositions(int x, int y){
    int[] xOffsets = {-2, -1, 1, 2, 2, 1, -1, -2};
    int[] yOffsets = {1, 2, 2, 1, -1, -2, -2, -1};
    Point nextPosition;
    LinkedList<Point>  = new LinkedList<Point>();
    for(int i = 0; i < xOffsets.length; i++) {
        nextPosition = new Point(x+xOffsets(i),y+yOffsets(i));
        if (isWithinBoardAndFree(nextPosition))
        {
            erg.add(nextPosition);
        }
    }
}

为了检查这些点,我使用了第二种方法:

private boolean isWithinBoardAndFree(Point point, Figure[][] board){
    if (point.x >= 0 && point.x >= 0)
    {
    if (board[point.x][point.y] == null)
        {
            return true;    
        }
    }
        return false;
}

我不确定你的运动,但你可以考虑释放骑士来自的场地。