Cell.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #pragma once
  2. #include <queue>
  3. #include <vector>
  4. /*
  5. * Решили, что метод canAttackForDistance(int) имеет шаблон, который обозначает тип атаки
  6. * Melee - без учёта препятствий
  7. * Range - с учётом препятствий
  8. * Шаблон - строка. При такой реализации можно добавить новый вид атаки
  9. * Необходимо в Unit добавить метод bool isCharacter() - является ли данный юнит персонажем
  10. */
  11. class Unit;
  12. /*
  13. * Этот класс Игоря ждёт своей реализации
  14. * (Название неточное)
  15. * Необходимо добавить методы:
  16. * OperateOnCell(Cell*)
  17. * OperateOnUnit(Unit*)
  18. */
  19. class EffectsForCell;
  20. class Cell {
  21. private:
  22. /*
  23. * Соседние клетки к текущей
  24. * nullptr, если ее не существует
  25. */
  26. Cell* leftUp_;
  27. Cell* left_;
  28. Cell* leftDown_;
  29. Cell* rightUp_;
  30. Cell* right_;
  31. Cell* rightDown_;
  32. /*
  33. * Ссылка на любую дичь, который находится на клетке
  34. * nullptr, клетка пустая
  35. */
  36. Unit* character_;
  37. /*
  38. * Список всех эффектов, применённых к этой клетке
  39. * Работа с этим списком в методах ниже
  40. * Добавление, удаление, указатель на начало и конец
  41. */
  42. std::vector<EffectsForCell*> effects_list_;
  43. /*
  44. * isMoveAble - Можно ли попасть в данную клетку из точки пересчета
  45. * переходя только по клеткам без юнитов
  46. * isMeleeAttackAble - Можно ли атаковать данную клетку
  47. * isRangeAttackAble_;
  48. */
  49. bool isMoveAble_;
  50. bool isMeleeAttackAble_;
  51. bool isRangeAttackAble_;
  52. /*
  53. * Расстояние от точки пересчёта до текущей точки
  54. * distance_barrier - расстояние с учетом других препятствий
  55. * distance_through - расстояние без учета препятствий
  56. * -1, если недостижимо
  57. */
  58. int distance_barrier_;
  59. int distance_through_;
  60. private:
  61. /*
  62. * Локальные методы и переменные
  63. */
  64. bool AddedToQuery_;
  65. int col_, row_;
  66. void clearTable_();
  67. void clearCell_();
  68. void recalcAttackable_(Cell*, bool);
  69. void recalcMoveable_(Cell*, bool);
  70. /*
  71. * BFS Moveable Cells And Find Unmoveable Cells
  72. */
  73. void updateMoveableCells_(std::queue<Cell *> &Q);
  74. /*
  75. * BFS UnMoveable Cells
  76. */
  77. void updateUnMovealeCells_(std::queue<Cell *> &Q);
  78. public:
  79. explicit Cell(Unit * character);
  80. /*
  81. * Геттеры и сеттеры соседних клеток и персонажа
  82. */
  83. Cell* getleftUp();
  84. void setleftUp(Cell*);
  85. Cell* getleft();
  86. void setleft(Cell*);
  87. Cell* getleftDown();
  88. void setleftDown(Cell*);
  89. Cell* getrightUp();
  90. void setrightUp(Cell*);
  91. Cell* getright();
  92. void setright(Cell*);
  93. Cell* getrightDown();
  94. void setrightDown(Cell *);
  95. Unit* getCharacter();
  96. void setCharacter(Unit *);
  97. /*
  98. * Ещё геттеры и сеттеры
  99. */
  100. int getdistance_barrier();
  101. void setdistance_barrier(int);
  102. int getdistance_through();
  103. void setdistance_through(int);
  104. /*
  105. * Нужно больше геттеров и сеттеров
  106. */
  107. bool getisMoveAble();
  108. void setisMoveAble(bool);
  109. bool getisMeleeAttackAble();
  110. void setisMeleeAttackAble(bool);
  111. bool getisRangeAttackAble();
  112. void setisRangeAttackAble(bool);
  113. /*
  114. * Содержит ли текущая клетка unit
  115. */
  116. bool isEmpty();
  117. /*
  118. * Методы для работы с эффектами
  119. */
  120. void recalculateAllEffectsList();
  121. void add(EffectsForCell*);
  122. void remove(std::vector<EffectsForCell*>::iterator);
  123. void remove(EffectsForCell*);
  124. std::vector<EffectsForCell*>::iterator beginIteratorEffectsList();
  125. std::vector<EffectsForCell*>::iterator endIteratorEffectsList();
  126. /*
  127. * Пересчитывает ВСЁ поле, делая текущую клетку - точкой пересчета
  128. */
  129. void RecalculateTableWithCenterThisPoint();
  130. /*
  131. * Работает корректно только в случае, если текущая - точка пересчета
  132. * Возвращает список всех клеток от параметра до точки пересчета
  133. * Включает в себя и начало, и конец
  134. * При этом список составлен в порядке прохода, начиная с последнего
  135. * Если пути нету, то вернется пустой список
  136. */
  137. std::vector <Cell*> actualPath(Cell*);
  138. /*
  139. * Отвечает за запрос, куда попадет шар, если ее направить в клетку-параметр
  140. * Выполнится только с лучае, если эта следующая клетка существует
  141. */
  142. Cell* getRealShootTarget(Cell*);
  143. void print();
  144. };