Cell.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. void clearTable_();
  66. void clearCell_();
  67. void recalcAttackable_();
  68. void recalcMoveable_();
  69. /*
  70. * BFS Moveable Cells And Find Unmoveable Cells
  71. */
  72. void updateMoveableCells_(std::queue<Cell *> &Q);
  73. /*
  74. * BFS UnMoveable Cells
  75. */
  76. void updateUnMovealeCells_(std::queue<Cell *> &Q);
  77. public:
  78. explicit Cell(Unit * character);
  79. /*
  80. * Геттеры и сеттеры соседних клеток и персонажа
  81. */
  82. Cell* getleftUp();
  83. void setleftUp(Cell*);
  84. Cell* getleft();
  85. void setleft(Cell*);
  86. Cell* getleftDown();
  87. void setleftDown(Cell*);
  88. Cell* getrightUp();
  89. void setrightUp(Cell*);
  90. Cell* getright();
  91. void setright(Cell*);
  92. Cell* getrightDown();
  93. void setrightDown(Cell *);
  94. Unit* getCharacter();
  95. void setCharacter(Unit *);
  96. /*
  97. * Ещё геттеры и сеттеры
  98. */
  99. int getdistance_barrier();
  100. void setdistance_barrier(int);
  101. int getdistance_through();
  102. void setdistance_through(int);
  103. /*
  104. * Нужно больше геттеров и сеттеров
  105. */
  106. bool getisMoveAble();
  107. void setisMoveAble(bool);
  108. bool getisMeleeAttackAble();
  109. void setisMeleeAttackAble(bool);
  110. bool getisRangeAttackAble();
  111. void setisRangeAttackAble(bool);
  112. /*
  113. * Содержит ли текущая клетка unit
  114. */
  115. bool isEmpty();
  116. /*
  117. * Методы для работы с эффектами
  118. */
  119. void recalculateAllEffectsList();
  120. void add(EffectsForCell*);
  121. void remove(std::vector<EffectsForCell*>::iterator);
  122. void remove(EffectsForCell*);
  123. std::vector<EffectsForCell*>::iterator beginIteratorEffectsList();
  124. std::vector<EffectsForCell*>::iterator endIteratorEffectsList();
  125. /*
  126. * Пересчитывает ВСЁ поле, делая текущую клетку - точкой пересчета
  127. */
  128. void RecalculateTableWithCenterThisPoint();
  129. /*
  130. * Работает корректно только в случае, если текущая - точка пересчета
  131. * Возвращает список всех клеток от параметра до точки пересчета
  132. * Включает в себя и начало, и конец
  133. * При этом список составлен в порядке прохода, начиная с последнего
  134. * Если пути нету, то вернется пустой список
  135. */
  136. std::vector <Cell*> actualPath(Cell*);
  137. };