Использование ASCII для координат платы в Java - PullRequest
1 голос
/ 15 февраля 2020

Я довольно новичок в Java и учусь этому как хобби, в основном после школы, чтобы продуктивно убивать свое свободное время. Я нахожу это действительно интересным и подбираю его относительно безболезненно, однако я немного застрял, пытаясь реализовать базовую шахматную программу c, которую можно играть через командную строку. В идеале, я хотел бы сначала распечатать доску с двумя королями и королевами с обеих сторон и заставить их двигаться вперед, назад и по диагонали. (Как только я это понял, я бы попытался добавить все остальные части, но сначала я бы хотел начать как можно проще). Для простоты я буду использовать стандартную 8x8 игровую доску.

Я уже создал основную игру l oop, которая использует ввод командной строки 1 для переключения игроков и 2 для выхода из игры, но я застрял, когда дело доходит до распечатывания позиций и их изменения во время игры. Во-первых, я хотел бы распечатать начальные позиции как королей, так и королев в виде строки (например, ["D1", "E1", "D8", "E8"]) для просмотра игроком. Я полагаю, что лучший способ сделать это - использовать индекс ASCII, но я не совсем уверен, где go из этого, я попробовал код ниже, я знаю, что это не правильно, и я не знаю, что изменить .. .

    int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
    String start_Pos =null;
    for(int i = 4; i < 6; i++){
        start_Pos[i] = (Character.toString((char)i) + "1");
    }

    int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
    String start_Pos =null;
    for(int i = 4; i < 6; i++){
        start_Pos1[i] = (Character.toString((char)i) + "8");
    }
        System.out.println(start_Pos + start_Pos1);

Я также пытался закодировать настройку игрового поля, но это буквально просто распечатывает начальные позиции фигур и поэтому не изменится, когда игрок делает ход - в идеале это должно быть. В качестве примера можно привести начальные позиции, показанные на доске следующим образом:

Фото (PS Я знаю, что QK следует поменять местами с одной стороны, чтобы они не были напротив друг друга, мой плохой!

Photo (PS I know QK should be swapped on one side so they're not opposite each other, my bad!)

Но после ввода «D1 D3» (первые координаты указывают, какая фигура, а вторая указывает на конечную позицию) от игрока 1, доска меняется, чтобы отразить это. возможно без необходимости перекомпилировать весь код после каждого хода? (Может быть, глупый вопрос ...).

Любая помощь будет принята с благодарностью. Я нахожу обучение, делая маленькие игры, подобные этим, более интересными и полезными поэтому, если кто-нибудь сможет мне помочь в реализации этого, я буду очень благодарен.

1 Ответ

1 голос
/ 15 февраля 2020

Java - это объектно-ориентированный язык, поэтому лучше всего использовать классы и экземпляры объектов.

Конечно, на шахматной доске вам все равно захочется выполнять вычисления по координатам x, y. , Компьютеры просто лучше с числами, у них проблемы с интерпретацией вещей. Шахматная нотация в основном полезна для нас, людей.

Итак, вот класс, который можно использовать для анализа и интерпретации шахматных позиций. Обратите внимание, что вы должны оставить этот класс неизменным и просто использовать новый экземпляр объекта, а не изменять поле x или y.

public final class ChessPosition {
    // use constants so you understand what the 8 is in your code
    private static final int BOARD_SIZE = 8;

    // zero based indices, to be used in a 2D array
    private final int x;
    private final int y;

    public ChessPosition(int x, int y) {
        // guards checks, so that the object doesn't enter an invalid state
        if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {
            throw new IllegalArgumentException("Invalid position");
        }

        this.x = x;
        this.y = y;
    }

    public ChessPosition(String chessNotation) {
        // accept upper and lowercase, but output only uppercase
        String chessNotationUpper = chessNotation.toUpperCase();
        // use a regular expression for this guard
        if (!chessNotationUpper.matches("[A-H][0-7]")) {
            throw new IllegalArgumentException("Invalid position");
        }

        // can be done in one statement, but we're not in a hurry
        char xc = chessNotationUpper.charAt(0);
        // chars are also numbers, so we can just use subtraction with another char
        x = xc - 'A';

        char yc = chessNotation.charAt(1);
        // note that before calculation, they are converted to int by Java
        y = yc - '1';
    }


    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public String getChessNotation() {
        // perform the reverse and create a string out of it
        // using StringBuilder#append(char c) is another option, but this is easier
        return new String(new char[] {
            // Java converts 'A' to int first (value 0x00000041)
            (char) (x + 'A'),
            (char) (y + '1')
        });
    }

    // this will be helpfully displayed in your debugger, so implement toString()!
    @Override
    public String toString() {
        return getChessNotation();
    }
}

Теперь, вероятно, вы также хотите создать Board класс с резервным 2D-массивом ChessPiece[][] и выполнение board.set(WHITE_KING, new ChessPosition("E1")) или что-то подобное.

...