Advertisement
madopew

Untitled

May 11th, 2020
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.38 KB | None | 0 0
  1. //обновление дистанций с использованием алгоритма кратчайшего
  2.     //пути breadth first search alghorithm
  3.     private void updateDistances() {
  4.         //очищаем все предыдущие дистанции
  5.         clearDistances();
  6.         //инициализируем очередь
  7.         Queue<Cell> q = new LinkedList<>();
  8.         //наименьшую дистанцию ставим на фишке с человеком
  9.         gameBoard[human.getRow()][human.getCol()].setDistance(0);
  10.         //добавляем в очередь фишку с игроком
  11.         q.add(gameBoard[human.getRow()][human.getCol()]);
  12.         while(!q.isEmpty()) {
  13.             //достаем из очереди клетку
  14.             Cell curr = q.peek();
  15.             q.remove();
  16.             //все клетки вокруг этой фишки имеют дистанцию на одну больше
  17.             for(int i = -1; i <= 1; i++) {
  18.                 for(int j = -1; j <= 1; j++) {
  19.                     //если в эту клетку можно зайти то
  20.                     if(isValidCell(curr, i, j)) {
  21.                         //обновляем дистанцию
  22.                         gameBoard[curr.getX() + i][curr.getY() + j].setDistance(curr.getDistance() + 1);
  23.                         //добавляем в очередь клетку на рассмотрении
  24.                         //в следующем прохождении цикла
  25.                         q.add(gameBoard[curr.getX() + i][curr.getY() + j]);
  26.                     }
  27.                 }
  28.             }
  29.         }
  30.     }
  31.     //очистка расстояний
  32.     private void clearDistances() {
  33.         for(int i = 0; i < BOARD_SIZE; i++)
  34.             for(int j = 0; j < BOARD_SIZE; j++)
  35.                 gameBoard[i][j].clearDistance();
  36.     }
  37.     //проверка на валидность рассмотрения клетки
  38.     //как места для хождения демона
  39.     private boolean isValidCell(Cell curr, int dx, int dy) {
  40.         //провряем:
  41.         // 1) клетка в пределах поля
  42.         // 2) на нее можно ходить (в том числе и на самого игрока, т.к. демон может "ходить" на него
  43.         // 3) дистанция не установлена
  44.         boolean isValid = (curr.getX() + dx > 0 && curr.getX() + dx < BOARD_SIZE-1
  45.                 && curr.getY() + dy > 0 && curr.getY() + dy < BOARD_SIZE-1
  46.                 && gameBoard[curr.getX() + dx][curr.getY() + dy].isMoveable()
  47.                 && gameBoard[curr.getX() + dx][curr.getY() + dy].getDistance() == -1);
  48.         return isValid;
  49.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement