Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //обновление дистанций с использованием алгоритма кратчайшего
- //пути breadth first search alghorithm
- private void updateDistances() {
- //очищаем все предыдущие дистанции
- clearDistances();
- //инициализируем очередь
- Queue<Cell> q = new LinkedList<>();
- //наименьшую дистанцию ставим на фишке с человеком
- gameBoard[human.getRow()][human.getCol()].setDistance(0);
- //добавляем в очередь фишку с игроком
- q.add(gameBoard[human.getRow()][human.getCol()]);
- while(!q.isEmpty()) {
- //достаем из очереди клетку
- Cell curr = q.peek();
- q.remove();
- //все клетки вокруг этой фишки имеют дистанцию на одну больше
- for(int i = -1; i <= 1; i++) {
- for(int j = -1; j <= 1; j++) {
- //если в эту клетку можно зайти то
- if(isValidCell(curr, i, j)) {
- //обновляем дистанцию
- gameBoard[curr.getX() + i][curr.getY() + j].setDistance(curr.getDistance() + 1);
- //добавляем в очередь клетку на рассмотрении
- //в следующем прохождении цикла
- q.add(gameBoard[curr.getX() + i][curr.getY() + j]);
- }
- }
- }
- }
- }
- //очистка расстояний
- private void clearDistances() {
- for(int i = 0; i < BOARD_SIZE; i++)
- for(int j = 0; j < BOARD_SIZE; j++)
- gameBoard[i][j].clearDistance();
- }
- //проверка на валидность рассмотрения клетки
- //как места для хождения демона
- private boolean isValidCell(Cell curr, int dx, int dy) {
- //провряем:
- // 1) клетка в пределах поля
- // 2) на нее можно ходить (в том числе и на самого игрока, т.к. демон может "ходить" на него
- // 3) дистанция не установлена
- boolean isValid = (curr.getX() + dx > 0 && curr.getX() + dx < BOARD_SIZE-1
- && curr.getY() + dy > 0 && curr.getY() + dy < BOARD_SIZE-1
- && gameBoard[curr.getX() + dx][curr.getY() + dy].isMoveable()
- && gameBoard[curr.getX() + dx][curr.getY() + dy].getDistance() == -1);
- return isValid;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement