Advertisement
Alyks

Untitled

Dec 16th, 2020
823
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.63 KB | None | 0 0
  1. int getAllValidWays(Cell *cell, int humanTurn) {
  2.     if (cell == NULL) return 0; // Если указатель на ячейку NULL, то возвращаем 0
  3.  
  4.     int eat[4] = {0, 0, 0, 0}; // Данный массив показывает, по каким направлением возможно взятие фигуры противника
  5.     int mustEat = 0; // Должна ли фигура бить другую фигуру
  6.  
  7.     for (int i = 0; i < 4; i++) {
  8.         Cell **way = cell->ways[i]; // Получение текущего пути
  9.         int wayCount = countWay(way); // Количество ячеек в данном пути
  10.  
  11.         if (cell->figure != NONE && wayCount > 0) {
  12.             if (cell->figureType == NORMAL) { // Если фигура является обычной
  13.                 if (way[0]->figure == NONE) { // То происходит проверка на соседнюю пустую ячейку
  14.                     if ((humanTurn && i > 1) || (!humanTurn && i < 2)) clearWay(way); // Если проверяются задние пути для текущего игрока, то они очищаются
  15.                     else clearRange(way, 1, wayCount - 1); // Иначе очищается все, кроме найденной соседней ячейки
  16.                 } else if (wayCount > 1 && way[0]->figure != cell->figure && way[0]->figure != NONE &&
  17.                            way[1]->figure == NONE) { // Если имеется возможность побить вражескую фигуру
  18.                     removeHighlight(way, 0, 1); // То у такой фигуры удаляется подсветка, т. к. на занимаемую такой фигурой ячейку нельзя наступить
  19.  
  20.                     clearRange(way, 2, wayCount - 2); // Очищается путь
  21.                     eat[i] = 1; // На данном пути нужно есть
  22.                     mustEat = 1; // Данная ячейка должна есть
  23.                 } else {
  24.                     clearWay(way); // Если оба условия не сработали, то путь очищается
  25.                 }
  26.             } else if (cell->figureType == KING) { // Если фигура является дамкой
  27.                 int stop = 0; // Отвечает за выход из цикла
  28.                 int j = 0;
  29.                 int rangeCleared = 0; // Показывает, был ли очищен путь
  30.  
  31.                 while (!stop && j < 8) {
  32.                     if (way[j] != NULL) { // Если путь существует
  33.                         if (way[j]->figure == cell->figure) { // Если встречена своя фигура
  34.                             clearRange(way, j, wayCount - j); // То путь очищается до этой фигуры
  35.                             stop = 1; // И просиходит выход из цикла
  36.                         } else if (j + 1 < 8 && way[j + 1] != NULL && way[j]->figure != NONE &&
  37.                                    way[j + 1]->figure == NONE) { // Если есть возможность побить другие фигуры
  38.                             removeHighlight(way, j, 1); // То на данных фигурах удаляется подсветка
  39.                            
  40.                             if (!rangeCleared) { // Если путь не очищен
  41.                                 clearRange(way, 0, j); // То он очищается
  42.                                 rangeCleared = 1;
  43.                             }
  44.                            
  45.                             eat[i] = 1; // На данном пути нужно есть
  46.                             mustEat = 1; // Данная ячейка должна есть
  47.                         } else if (way[j]->figure != NONE) { // Если встречена любая другая фигура
  48.                             clearRange(way, j, wayCount - j); // То часть пути очищается
  49.                             stop = 1; // И происходит выход из цикла
  50.                         }
  51.                     }
  52.                    
  53.                     j++;
  54.                 }
  55.             }
  56.         }
  57.  
  58.         if (mustEat) { // Если ячейка должна есть
  59.             for (int j = 0; j <= i; j++) {
  60.                 if (!eat[j]) clearWay(cell->ways[j]); // То очищаются все пути, где можно было не есть
  61.             }
  62.         }
  63.     }
  64.  
  65.     return mustEat; // Возврат значения
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement