Тестирование действительных координат - PullRequest
0 голосов
/ 16 февраля 2020

Я использую java, чтобы проверить, является ли намеченный ход для типа настольной игры действительным. Пользователь вводит предложенный ход, скажем, B1 (начальная позиция) и C3 (пункт назначения), и этот код проверяет, действительно ли он действителен. validCoordinates здесь проверяет, действительно ли данные координаты действительно живут на доске dim * dim. Лучший способ, которым я могу думать / знать о проверке каждого параметра, который должен быть истинным, чтобы составить правильное движение, - это создать отдельно все подходящие параметры, а затем сделать один последний оператор if, который проверяет истинность для всех из них. Я не уверен в том, как go создать каждый отдельный тест таким образом, чтобы у него было «имя», на которое я могу сослаться. Я попытался написать что-то вроде следующего для одного из моих параметров, чтобы координаты были действительными, он проверяет, присутствует ли намеченное место назначения перемещения в строке в массиве, и возвращает false, если так. Я оставил в своем предыдущем параметре, который я знал, как сделать, поскольку не было необходимости в циклах, поэтому теперь я могу просто ссылаться на это как validCoordinates, но не уверен, как это сделать сейчас, когда мне нужны циклы для некоторых других моих параметров. В конце я хотел бы написать что-то вроде

if (validCoordinates, destinationOccupied...) {
  return true;
}

Это не логика c, в которой указаны мои необходимые параметры, с которыми мне нужна помощь, это возможность вызывать функцию, подобную приведенной выше. при проверке, чтобы увидеть, возвращают ли 'validCoordinates' и 'destinationOccupied' значение true. validCoordinates должен работать, но не уверен, как go о destinationOccupied, поскольку он использует al oop, и IntelliJ не похоже на способ, которым я пытался сделать destinationOccupied

    // tests if origin and destination coordinates are valid
    Boolean validCoordinates = Integer.parseInt(numerical[0]) >= dim -(dim-1)
                               && Integer.parseInt(numerical[1]) <= dim
                               && Integer.parseInt(numerical[2]) >= dim - (dim-1)
                               && Integer.parseInt(numerical[3]) <= dim;

    // tests if destination is already occupied
   public Boolean destinationOccupied(players, destination) {
           // a loop here to test if the proposed destination isnt for an already 
           filled position
    }

Мои координаты находятся на доске форма координат, то есть A1, B3 и т. д. c, поэтому числовое значение в предыдущем просто преобразует это в числовые значения, чтобы мне было проще: ie 1,1,2,3

1 Ответ

0 голосов
/ 16 февраля 2020

Похоже, numerical - это массив, созданный из вашей системы координат. Я бы реорганизовал ваш код, чтобы ваши координаты не конвертировались в список целых чисел. Мне пришлось потратить около 5 минут, чтобы посмотреть, как вы создали этот список из ваших координат. Вместо этого создайте класс, который создает пару. Вот возможное решение для этого. Затем, если вам нужно, создайте список пар.

Далее, я хотел бы сделать несколько упрощений здесь. Ваше логическое значение для validCoordinates, вероятно, выполняет больше работы, чем необходимо. Вы проверяете, действительны ли ваша текущая координата и ваша новая координата. Однако почему бы не проверить только правильность вашей новой координаты? Ваша новая координата, которую вы уже подтвердили, что она действительна, станет вашей currentCoordinate, и вы уже знаете, как она действительна, поэтому вам не нужно постоянно проверять, что ваша currentCoordinate действительна.

Я делаю сочтите странным, что вы проверяете правильные размеры, начиная с индекса 1 вместо 0 (потому что dim - (dim - 1) = 1 и что вы говорите <= dim для другого конца. Поскольку вы начинаете с 1, я бы предположил, что вы скажете < dim Итак, дважды проверьте вашу логику c там.

Для моего решения я собираюсь предположить, что мы начинаем с индекса 0, что означает, что допустимый диапазон будет 0 <= x < dim. Пожалуйста, отрегулируйте соответствующим образом, если я ошибаюсь .

Я начну с создания двумерного массива на основе dim и инициализации их всех равным 0.

0 означает, что он не занят, а 1 означает, что он занят.

int[][] grid = new int[dim][dim];

for (int row = 0; row < dim; row ++)
    for (int col = 0; col < dim; col++)
        grid[row][col] = 0;

.
.
.

public boolean canMove(Pair newCoordinates) {
        //Verify is valid newCoordinates
        if (newCoordinates.getFirst() < 0 || newCoordinates.getSecond() >= dim)
                return false;
        //Verify newCoordinates aren't already occupied. (1 means occupied, 0 means free)
        //If we get to this point in the code, we know we are in a valid range
        //and won't get an OutOfBoundsException when accessing our 2D array.
        return grid[newCoordinates.getFirst()][newCoordinates.getSecond()] == 0
}
...