fork(1) download
  1. <?php
  2.  
  3. abstract class Animal
  4. {
  5. public $symbol; //символ на карте
  6. public $x; //координата
  7. public $y; //координата
  8. public $name; //имя животного
  9. public $field; //карта класса FIeld
  10. public $vision; //дальность обзора
  11.  
  12. abstract protected function tryToMove();
  13.  
  14. //Называем животное
  15. public function __construct($name)
  16. {
  17. $this->name = $name;
  18. }
  19.  
  20. //Метод возвращения символа для вывода на карте
  21. public function getSymbol()
  22. {
  23. return $this->symbol;
  24. }
  25.  
  26. //Метод передвижения в определенную координату
  27. protected function moveTo($x, $y)
  28. {
  29. echo "Я, {$this->name}, хожу x:{$x}, y:{$y}.\n";
  30. $this->x = $x;
  31. $this->y = $y;
  32. }
  33.  
  34. //Метод случайного хода без обдумывания побега или охоты
  35. protected function freeMove($possibleMoves)
  36. {
  37. //Выбираем случайный ход из возможных
  38. $randomTurn = $possibleMoves[mt_rand(0, count($possibleMoves) - 1)];
  39. //Ходим
  40. $this->moveTo($randomTurn['x'], $randomTurn['y']);
  41. }
  42. }
  43.  
  44. class Mouse extends Animal
  45. {
  46. public $symbol; //символ на карте
  47. public $x; //координата
  48. public $y; //координата
  49. public $name; //имя животного
  50. public $field; //карта класса Field
  51. public $vision = 4; //дальность обзора
  52.  
  53. //Метод хода
  54. public function tryToMove()
  55. {
  56. //Ищем животное в дальности обзора
  57. $foundAnimals = $this->field->searchForAnimals($this->x, $this->y, $this->vision);
  58. //Ищем возможные ходы
  59. $possibleMoves = $this->searchPossibleMoves();
  60. //Если нельзя сдвинуться - стоим
  61. if (count($possibleMoves) == 0) {
  62. echo "Стою на месте.\n";
  63. //Если нашли кошку - убегаем
  64. } elseif ($foundAnimals["cats"] != NULL) {
  65. echo "У мышки {$this->name} рядом кошка. ";
  66. $bestMove = $this->searchBestMove($foundAnimals, $possibleMoves);
  67. $this->moveTo($bestMove['x'], $bestMove['y']);
  68. } else {
  69. echo "Кошек рядом нет. ";
  70. $this->freeMove($possibleMoves);
  71. }
  72. }
  73.  
  74. //Метод поиска возможных ходов
  75. public function searchPossibleMoves()
  76. {
  77. //Возможые ходы для мышки (4 стороны)
  78. $possibleMoves = array();
  79. $arrows["up"] = array('x' => $this->x, 'y' => $this->y - 1);
  80. $arrows["right"] = array('x' => $this->x + 1, 'y' => $this->y);
  81. $arrows["down"] = array('x' => $this->x, 'y' => $this->y + 1);
  82. $arrows["left"] = array('x' => $this->x - 1, 'y' => $this->y);
  83. foreach ($arrows as $arrow) {
  84. //Отсеиваем невозможные ходы (ход за карту, ход на собрата мыша или панибрата собаку)
  85. if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
  86. $possibleMoves[] = $arrow;
  87. }
  88. }
  89. //Возвращаем результат
  90. return $possibleMoves;
  91. }
  92.  
  93. //Метод поиска лучшего хода
  94. private function searchBestMove($foundAnimals, $possibleMoves)
  95. {
  96. $bestMove = array();
  97. //Очки за лучшиий за ход мыши. -1 из-за случаев когда лучший ход приносит 0 баллов
  98. $pointsMax = -1;
  99. foreach ($possibleMoves as $move)
  100. {
  101. $points = $this->countPoints($foundAnimals, $move);
  102. if ($points > $pointsMax) {
  103. $pointsMax = $points;
  104. $bestMove = $move;
  105. }
  106. }
  107. //Возвращаем лучший ход
  108. return $bestMove;
  109. }
  110.  
  111. //Метод подсчета очков за ход
  112. private function countPoints ($foundAnimals, $move)
  113. {
  114. /**
  115.   * Оценка каждого хода.
  116.   * Приоритет 1: Количество клеток до врага. Их должно быть как можно больше. Коэффициент 100
  117.   * Приоритет 2: Количество клеток до ближайшего угла. Как можно больше, чтобы не забиться в угол. Коэфициент 10
  118.   * Приоритет 3: Количество клеток до собаки. Может стать приоритетом 2 в ситуации когда только собака может спасти от съедения кошкой
  119.   */
  120. //Ищем ближайшего врага и считаем шаги до него
  121. $nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
  122. $stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
  123. //Не даем очки, если один шаг чтобы этот ход был максимально плохим вариантом
  124. if ($stepsToEnemy == 1) {
  125. $pointsForEnemy = 0;
  126. } else {
  127. $pointsForEnemy = $stepsToEnemy * 100;
  128. }
  129. //Если есть рядом собаки - используем их в плане побега
  130. if ($foundAnimals["dogs"] != NULL) {
  131. //Ищем ближайшую собаку и считаем ходы до нее
  132. $nearbyDog = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
  133. $stepsToDog = $this->field->countSteps($move['x'], $move['y'], $nearbyDog->x, $nearbyDog->y);
  134. //Тот случай когда собака становится приоритетом 2, потому что может спасти мышку
  135. if ($stepsToDog == 1 && $stepsToEnemy == 1) {
  136. $pointsForDog = 90;
  137. //В остальных случаях это наименьший по очкам приоритет
  138. } else{
  139. $pointsForDog = $this->field->getWidth() - $stepsToDog;
  140. }
  141. //Если собак нету - не даем очков
  142. } else {
  143. $pointsForDog = 0;
  144. }
  145. //Считаем очки за степень приближения к ближайшему краю, стараемся быть дальше от него
  146. $pointsForCorner = $this->field->searchNearCorner($move['x'], $move['y']) * 10;
  147. //Считаем общее число очков за ход
  148. $points = $pointsForEnemy + $pointsForDog + $pointsForCorner;
  149. //Если этот ход обогнал лучший результат - он становится лучшим ходом
  150. return $points;
  151. }
  152. }
  153.  
  154. class Cat extends Animal
  155. {
  156. public $symbol = "K"; //символ на карте(для кошки еще состояние активности)
  157. public $x; //координата
  158. public $y; //координата
  159. public $name; //имя животного
  160. public $field; //карта класса Field
  161. public $vision; //дальность обзора
  162. public $movesInARow = 0; //кол-во ходов подряд
  163. private $turnWhenCatSleep = 8; //правило "на каком ходу подряд кошка засыпает"
  164.  
  165. //Метод хода
  166. public function tryToMove()
  167. {
  168. //Если кошка спит
  169. if ($this->symbol == "@") {
  170. //Она просыпается
  171. $this->symbol = "K";
  172. //Cчетчик ходов обнуляется
  173. $this->movesInARow = 0;
  174. echo "Кошка спит :3\n";
  175. //Следующий ход
  176. return;
  177. //Если ходили n-ое кол-во ходов подряд - спим
  178. } elseif($this->movesInARow == $this->turnWhenCatSleep) {
  179. $this->symbol = "@";
  180. }
  181. //Ищем животное в дальности обзора
  182. $foundAnimals = $this->field->searchForAnimals($this->x, $this->y, $this->vision);
  183. //Присваиваем полям найденные результаты
  184. //Ищем возможные ходы
  185. $possibleMoves = $this->searchPossibleMoves($foundAnimals);
  186. //Если нельзя сдвинуться - стоим
  187. if (count($possibleMoves) == 0) {
  188. echo "Стою на месте.\n";
  189. } else {
  190. //Ищем лучший ход
  191. $bestMove = $this->searchBestMove($foundAnimals, $possibleMoves);
  192. //Если можно съесть мышь по данным координатам - едим
  193. if ($this->canIEatIt($bestMove['x'], $bestMove['y'], $foundAnimals)) {
  194. $this->eatIt($bestMove['x'], $bestMove['y']);
  195. //В остальных случаях - ходим туда
  196. } else {
  197. $this->moveTo($bestMove['x'], $bestMove['y']);
  198. }
  199. //Прибавляем счетчик ходов подряд
  200. $this->movesInARow++;
  201. }
  202. }
  203.  
  204. //Метод поиска возможных ходов
  205. public function searchPossibleMoves($foundAnimals)
  206. {
  207. $possibleMoves = array();
  208. //Возможые ходы для кошки (8 сторон);
  209. $arrows["up"] = array('x' => $this->x, 'y' => $this->y - 1);
  210. $arrows["up-right"] = array('x' => $this->x + 1, 'y' => $this->y - 1);
  211. $arrows["right"] = array('x' => $this->x + 1, 'y' => $this->y);
  212. $arrows["right-down"] = array('x' => $this->x + 1, 'y' => $this->y + 1);
  213. $arrows["down"] = array('x' => $this->x, 'y' => $this->y + 1);
  214. $arrows["down-left"] = array('x' => $this->x - 1, 'y' => $this->y + 1);
  215. $arrows["left"] = array('x' => $this->x - 1, 'y' => $this->y);
  216. $arrows["left-up"] = array('x' => $this->x - 1, 'y' => $this->y - 1);
  217. foreach ($arrows as $arrow) {
  218. //Если на этой клетке собака - сразу отбрасываем этот ход
  219. if (!$this->field->areChosenAnimalsNearTheCage($arrow['x'], $arrow['y'], $foundAnimals["dogs"])) {
  220. //Если там можно съесть мышь или походить - это возможных ход
  221. if ($this->canIEatIt($arrow['x'], $arrow['y'], $foundAnimals)) {
  222. $possibleMoves[] = $arrow;
  223. } elseif ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
  224. $possibleMoves[] = $arrow;
  225. }
  226. }
  227. }
  228. //Возвращаем результат
  229. return $possibleMoves;
  230. }
  231.  
  232. //Метод поиска лучшего хода
  233. private function searchBestMove($foundAnimals, $possibleMoves)
  234. {
  235. $bestMove = array();
  236. //Очки за лучшиий за ход мыши. -1 из-за случаев когда лучший ход приносит 0 баллов
  237. $pointsMax = -1;
  238. foreach ($possibleMoves as $move) {
  239. $points = $this->countPoints($foundAnimals, $move);
  240. if ($points > $pointsMax) {
  241. $pointsMax = $points;
  242. $bestMove = $move;
  243. }
  244. }
  245. //Возвращаем результат
  246. return $bestMove;
  247. }
  248. //Метод подсчета очков за ход
  249. private function countPoints($foundAnimals, $move)
  250. {
  251. /**
  252.   * Приоритет 1: Мышку можно съесть. 9999 очков
  253.   * Приоритет 2: Количество клеток до врага. Их должно быть как можно меньше. Коэффициент 100.
  254.   * Приоритет 3: Количество клеток до одной линии с мышью, удобная позиция для зажатия в угол.
  255.   */
  256. //Ищем ближайшего врага и считаем шаги до него
  257. $nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["mice"]);
  258. $stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
  259. //Если можно съесть мышь по указанным координатам - это однозначно лучший ход
  260. if ($this->canIEatIt($move['x'], $move['y'], $foundAnimals)) {
  261. $pointsForEnemy = 9999;
  262. } else {
  263. $pointsForEnemy = ($this->field->getWidth() - $stepsToEnemy) * 100;
  264. }
  265. //Если кошка на одной линии с мышкой
  266. if ($move['x'] == $nearbyEnemy->x || $move['y'] == $nearbyEnemy->y) {
  267. $pointsForOneLine = 99;
  268. //Если нет
  269. } else {
  270. $pointsForOneLine = $this->field->getWidth() - abs(min($move['x'] - $nearbyEnemy->x, $move['y'] - $nearbyEnemy->y));
  271. }
  272. //Считаем общее очков за ход
  273. $points = $pointsForEnemy + $pointsForOneLine;
  274. //Если этот ход обогнал лучший результат - он становится лучшим ходом
  275. return $points;
  276. }
  277.  
  278. //Метод возможности съедения мышки по данным координатам
  279. private function canIEatIt($x, $y, $foundAnimals)
  280. {
  281. //Если там мышка - очевидно возомжно, но еще не можно
  282. if ($this->field->getAnimal($x, $y) instanceof Mouse) {
  283. //Обнажили зубки
  284. echo "Пытаюсь съесть {$this->field->getAnimal($x, $y)->name}. ";
  285. //В переменной oneLine считаем количество мышей которые рядом с друг другом
  286. $oneLine = 0;
  287. foreach ($foundAnimals["mice"] as $mouse) {
  288. if ($this->field->areChosenAnimalsNearTheCage($mouse->x, $mouse->y, $foundAnimals["mice"])) {
  289. $oneLine++;
  290. }
  291. }
  292. //Если их меньше трех - омномном
  293. if ($oneLine < 3) {
  294. return TRUE;
  295. //Если больше - мы грустим
  296. } else {
  297. echo "Мыши защищают друг друга. ";
  298. return FALSE;
  299. }
  300. //Если там мышки нет - не можем
  301. } else {
  302. return FALSE;
  303. }
  304. }
  305.  
  306. //Метод поедения несчастного объекта
  307. private function eatIt ($x, $y)
  308. {
  309. //Удаление элемента массива по значению
  310. if(($key = array_search($this->field->getAnimal($x, $y), $this->field->animals)) !== FALSE){
  311. unset($this->field->animals[$key]);
  312. }
  313. //Ход на освободившуюся клетку
  314. $this->moveTo($x, $y);
  315. //Переход в спящий режим
  316. $this->symbol = "@";
  317. }
  318.  
  319. }
  320.  
  321. class Dog extends Animal {
  322. public $symbol = "D"; //символ на карте(для кошки еще состояние активности)
  323. public $x; //координата
  324. public $y; //координата
  325. public $name; //имя животного
  326. public $field; //карта класса Field
  327.  
  328. //Метод хода
  329. public function tryToMove()
  330. {
  331. //Ищем возможные ходы
  332. $possibleMoves = $this->searchPossibleMoves();
  333. //Если нельзя сдвинуться - стоим
  334. if (count($possibleMoves) == 0) {
  335. echo "Ходить $this->name некуда.\n";
  336. //Если можно сдвинуться - ходим, как ни странно
  337. } else {
  338. $this->freeMove($possibleMoves);
  339. }
  340. }
  341.  
  342. //Метод поиска возможных ходов
  343. public function searchPossibleMoves()
  344. {
  345. $possibleMoves = array();
  346. //Возможые ходы для собаки (8 сторон)
  347. $arrows["up"] = array('x' => $this->x, 'y' => $this->y-2);
  348. $arrows["up-right"] = array('x' => $this->x+2, 'y' => $this->y-2);
  349. $arrows["right"] = array('x' => $this->x+2, 'y' => $this->y);
  350. $arrows["right-down"] = array('x' => $this->x+2, 'y' => $this->y+2);
  351. $arrows["down"] = array('x' => $this->x, 'y' => $this->y+2);
  352. $arrows["down-left"] = array('x' => $this->x-2, 'y' => $this->y+2);
  353. $arrows["left"] = array('x' => $this->x-2, 'y' => $this->y);
  354. $arrows["left-up"] = array('x' => $this->x-2, 'y' => $this->y-2);
  355. foreach ($arrows as $arrow) {
  356. //Отсеиваем невозможные ходы (ход за карту, ход на собрата собаку или противного мыша)
  357. if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
  358. $possibleMoves[] = $arrow;
  359. }
  360. }
  361. //Возвращаем результат
  362. return $possibleMoves;
  363. }
  364.  
  365.  
  366. }
  367.  
  368. class Field {
  369. private $width; //ширина
  370. private $height; //высота
  371. private $numberOfTurns = 30; //количество ходов
  372. public $animals = array(); //массив животных
  373.  
  374. //Задаем ширину, высоту
  375. public function __construct($width, $height)
  376. {
  377. $this->width = $width;
  378. $this->height = $height;
  379. }
  380.  
  381. //Метод размещения животного на карте
  382. public function addAnimal(Field $field, Animal $animal)
  383. {
  384. //Добавляем животное в список
  385. $this->animals[] = $animal;
  386. //Счетчик для различия мышей на карте
  387. static $i = 1;
  388. //Передаем карту в поле животного как советовал мудрый ОП
  389. $animal->field = $field;
  390. //Если животное - кошка, делаем ей максимальную дальность обзора
  391. if ($animal instanceof Cat) {
  392. $animal->vision = $this->width;
  393. }
  394. //Координаты могут быть заняты, если мы вручную их забиваем
  395. if ($animal->x == NULL && $animal->y == NULL) {
  396. //Рандомим пока не найдем пустую клетку
  397. do {
  398. $x = mt_rand(1, $this->width);
  399. $y = mt_rand(1, $this->height);
  400. } while ($this->isCageClose($x, $y));
  401. //Инициализурем удачные координаты
  402. $animal->x = $x;
  403. $animal->y = $y;
  404. //Увеличиваем счетчик для символа на карте
  405. if ($animal instanceof Mouse) {
  406. $animal->symbol = $i++;
  407. }
  408. }
  409. }
  410.  
  411. //Метод определения возможности животного походить по указанным координатам
  412. public function canIMoveTo($x, $y)
  413. {
  414. //Если хочет сбежать за пределы карты или клетка занята - нет
  415. if ($x < 1 ||
  416. $y < 1 ||
  417. $x > $this->width ||
  418. $y > $this->height ||
  419. $this->isCageClose($x, $y)) {
  420. return FALSE;
  421. } else {
  422. return TRUE;
  423. }
  424. }
  425.  
  426. //Метод поиска ближайшего угла
  427. public function searchNearCorner($x, $y)
  428. {
  429. //Находимся ли мы слева от центра или справа, вверху или внизу
  430. $stepsToCornerX = ($x < $this->width/2) ? $x - 1 : $this->width - $x;
  431. $stepsToCornerY = ($y < $this->height/2) ? $y - 1 : $this->height - $y;
  432. return min($stepsToCornerX, $stepsToCornerY);
  433. }
  434.  
  435.  
  436. //Метод определяющий занятость клетки
  437. private function isCageClose($x, $y)
  438. {
  439. foreach ($this->animals as $animal)
  440. {
  441. if ($x == $animal->x && $y == $animal->y) {
  442. return True;
  443. }
  444. }
  445. return False;
  446. }
  447.  
  448. //Метод получения объекта по координатам из массива животных
  449. public function getAnimal ($x, $y)
  450. {
  451. foreach ($this->animals as $animal)
  452. {
  453. if ($x == $animal->x && $y == $animal->y) {
  454. return $animal;
  455. }
  456. }
  457. }
  458.  
  459. //Метод вывода карты
  460. private function showField($turn)
  461. {
  462. //Номер координаты на оси Y
  463. $line = 0;
  464. //Номер координаты на оси X
  465. $top = 1;
  466. //Выводим ось X
  467. //Если первая строка
  468. if ($line == 0) {
  469. //Три пробела
  470. echo " ";
  471. while ($top <= $this->width) {
  472. //А потом печатаем цифры и пробелы
  473. if ($top < 10) {
  474. //Два для двухзначных чисел
  475. echo $top++ . " ";
  476. //Один для однозначных
  477. } else {
  478. echo $top++ . " ";
  479. }
  480. }
  481. //Следующая строка
  482. $line++;
  483. echo "\n";
  484. }
  485. //Выводим ось Y
  486. for ($i = 1; $i <= $this->height; $i++) {
  487. //Если число однозачное - два пробела
  488. if ($line < 10) {
  489. echo "$line ";
  490. //Если число двухзначное - один пробел
  491. } else {
  492. echo "$line ";
  493. }
  494. //Выводим карту
  495. for($j = 1; $j <= $this->width; $j++) {
  496. //Если клетка ззанята - выводим символ животного
  497. if ($this->isCageClose($j, $i)) {
  498. echo "{$this->getAnimal($j, $i)->getSymbol()} ";
  499. //Если клетка пустая - выводим ее в форме точки
  500. } else {
  501. echo ". ";
  502. }
  503. }
  504. //Выводи дополнительные данные рядом с определенной строкой
  505. if ($line == 1) echo " Ход: {$turn}";
  506. if ($line == 2) echo " Мышек: {$this->countAnimals('Mouse')}";
  507. if ($line == 3) echo " Кошек: {$this->countAnimals('Cat')}";
  508. if ($line == 4) echo " Собак: {$this->countAnimals('Dog')}";
  509. //Следующая строка
  510. $line++;
  511. echo "\n";
  512. }
  513. }
  514.  
  515. //Метод игры
  516. public function startGame(Field $field)
  517. {
  518. //Делаем заданное заранее количество ходов
  519. for ($turn = 0; $turn <= ($this->numberOfTurns); $turn++) {
  520. //Выводим поле
  521. $this->showfield($turn);
  522. //Каждое животное делает ход
  523. foreach ($this->animals as &$animal) {
  524. //Так как в цикле foreach копия массива надо проверять данные с изменениями
  525. //Животное делает ход
  526. $animal->tryToMove();
  527. //Если всех мышей съели - конец игры
  528. if ($this->countAnimals("Mouse") == 0) {
  529. die("Конец игры.");
  530. }
  531. }
  532. echo "\n";
  533. }
  534. }
  535.  
  536. //Метод поиска животных в определенном обзоре
  537. public function searchForAnimals($x, $y, $vision)
  538. {
  539. $foundAnimals = array("mice" => NULL, "cats" => NULL, "dogs" => NULL);
  540. //Обзор не должен выходить за пределы карты, в этом случае крайней точкой обзора будет край карты
  541. for ($i = max($y - $vision, 1), $k = min($y + $vision, $this->height); $i <= $k; $i++) {
  542. //Проходим во вложенном цикле по воображаемому квадрату обзора, животное в центре
  543. for ($j = max($x - $vision, 1), $l = min($x + $vision, $this->width); $j <= $l; $j++) {
  544. //Если мы увидели свои координаты - не добавляем их в результат
  545. if ($i == $y && $j == $x) {
  546. continue;
  547. //В остальных случаев записываем увиденных животных в массив
  548. } elseif ($this->getAnimal($j, $i) instanceof Mouse) {
  549. $foundAnimals["mice"][] = $this->getAnimal($j, $i);
  550. } elseif ($this->getAnimal($j, $i) instanceof Cat) {
  551. $foundAnimals["cats"][] = $this->getAnimal($j, $i);
  552. } elseif ($this->getAnimal($j, $i) instanceof Dog) {
  553. $foundAnimals["dogs"][] = $this->getAnimal($j, $i);
  554. }
  555. }
  556. }
  557. //Возвращаем результат
  558. return $foundAnimals;
  559. }
  560.  
  561. //Метод подсчета животных. Считает определенных животных
  562. private function countAnimals($nameOfTheAnimal)
  563. {
  564. $counter = 0;
  565. //Если нужное животное есть в массиве - прибавляем счетчик
  566. foreach ($this->animals as $animal) {
  567. if ($animal instanceof $nameOfTheAnimal) {
  568. $counter++;
  569. }
  570. }
  571. return $counter;
  572. }
  573.  
  574. //Возвращаем private поле с длинной карты
  575. public function getWidth()
  576. {
  577. return $this->width;
  578. }
  579.  
  580. //Возвращаем private поле с высотой карты
  581. public function getHeight()
  582. {
  583. return $this->height;
  584. }
  585.  
  586. //Метод определяющий наличие опреденного вида животных с данными координатами
  587. public function areChosenAnimalsNearTheCage($x, $y, array $animals)
  588. {
  589. foreach ($animals as $animal)
  590. {
  591. //Наши координаты не влияют на ответ на поставленный вопрос
  592. if ($animal->x == $x && $animal->y == $y) {
  593. continue;
  594. }
  595. //Если количество шагов до животного равно одному, ответ - да
  596. if($this->countSteps($x, $y, $animal->x, $animal->y) == 1) {
  597. return TRUE;
  598. }
  599. }
  600. //В остальных случаях ответ - нет
  601. return FALSE;
  602. }
  603.  
  604. //Метод подсчета шагов между двумя точками
  605. public function countSteps($point1X, $point1Y, $point2X, $point2Y)
  606. {
  607. //Подсчет шагов по оси X
  608. $countStepsX = abs($point1X - $point2X);
  609. //ПОдсчет шагов по оси Y
  610. $countStepsY = abs($point1Y - $point2Y);
  611. //Возвращаем наибольшее
  612. return max($countStepsX, $countStepsY);
  613. }
  614.  
  615. //Метод нахождения ближайшего животного из определенного массива
  616. public function searchNearbyAnimal($x, $y, array $animals)
  617. {
  618. //Лучший результат по умолчанию
  619. $stepsNearestAnimal = 1000;
  620. foreach ($animals as $animal) {
  621. //Считаем шаги между животным и координатами
  622. $countSteps = $this->countSteps($x, $y, $animal->x, $animal->y);
  623. //Если меньше лучшего результата - это лучший результат
  624. if ($countSteps < $stepsNearestAnimal) {
  625. $nearbyAnimal = $animal;
  626. $stepsNearestAnimal = $countSteps;
  627. //Если на одном расстоянии с результатом - продалжаем поиск
  628. } elseif ($countSteps == $stepsNearestAnimal) {
  629. continue;
  630. }
  631. }
  632. //Возвращаем ближайшее животное
  633. return $nearbyAnimal;
  634. }
  635. }
  636.  
  637. //Создаем карту
  638. $field = new Field(10,10);
  639. //Создаем и именум зверье
  640. $mouse1 = new Mouse("mouse1");
  641. $field->addAnimal($field, $mouse1);
  642. $mouse2 = new Mouse("mouse2");
  643. $field->addAnimal($field, $mouse2);
  644. $mouse3 = new Mouse("mouse3");
  645. $field->addAnimal($field, $mouse3);
  646. $cat1 = new Cat("cat1");
  647. $field->addAnimal($field, $cat1);
  648. $cat2 = new Cat("cat2");
  649. $field->addAnimal($field, $cat2);
  650. $dog1 = new Dog("dog1");
  651. $field->addAnimal($field, $dog1);
  652. $dog2 = new Dog("dog2");
  653. $field->addAnimal($field, $dog2);
  654. //Начинаем игру
  655. $field->startGame($field);
  656.  
  657.  
  658. //Тест на два огня
  659. /**
  660. $field = new Field(5, 6);
  661. $mouse1 = new Mouse("mouse1");
  662. $mouse1->x = 3;
  663. $mouse1->y = 3;
  664. $mouse1->symbol = 1;
  665. $field->addAnimal($field, $mouse1);
  666. $cat1 = new Cat("cat1");
  667. $cat1->x = 1;
  668. $cat1->y = 3;
  669. $field->addAnimal($field, $cat1);
  670. $cat2 = new Cat("cat2");
  671. $cat2->x = 5;
  672. $cat2->y = 3;
  673. $field->addAnimal($field, $cat2);
  674. $dog1 = new Dog("dog1");
  675. $dog1->x = 5;
  676. $dog1->y = 6;
  677. $field->addAnimal($field, $dog1);
  678. $field->startGame($field);
  679. */
  680.  
  681. //Тест на мышинную оборону
  682. /**
  683. $field = new Field(10, 10);
  684. $mouse1 = new Mouse("mouse1");
  685. $mouse1->x = 1;
  686. $mouse1->y = 1;
  687. $mouse1->symbol = 1;
  688. $field->addAnimal($field, $mouse1);
  689. $mouse2 = new Mouse("mouse2");
  690. $mouse2->x = 2;
  691. $mouse2->y = 2;
  692. $mouse2->symbol = 2;
  693. $field->addAnimal($field, $mouse2);
  694. $mouse3 = new Mouse("mouse3");
  695. $mouse3->x = 3;
  696. $mouse3->y = 3;
  697. $mouse3->symbol = 3;
  698. $field->addAnimal($field, $mouse3);
  699. $cat1 = new Cat("cat1");
  700. $cat1->x = 2;
  701. $cat1->y = 1;
  702. $field->addAnimal($field, $cat1);
  703. $dog1 = new Dog("dog1");
  704. $dog1->x = 5;
  705. $dog1->y = 5;
  706. $field->addAnimal($field, $dog1);
  707. $field->startGame($field);
  708. */
  709.  
  710. //Тест на пирамиду котов
  711. /**
  712. $field = new Field(7, 7);
  713. $mouse1 = new Mouse("mouse1");
  714. $mouse1->x = 3;
  715. $mouse1->y = 4;
  716. $mouse1->symbol = 1;
  717. $field->addAnimal($field, $mouse1);
  718. $cat1 = new Cat("cat1");
  719. $cat1->x = 1;
  720. $cat1->y = 3;
  721. $field->addAnimal($field, $cat1);
  722. $cat2 = new Cat("cat2");
  723. $cat2->x = 2;
  724. $cat2->y = 2;
  725. $field->addAnimal($field, $cat2);
  726. $cat3 = new Cat("cat3");
  727. $cat3->x = 3;
  728. $cat3->y = 1;
  729. $field->addAnimal($field, $cat3);
  730. $cat4 = new Cat("cat4");
  731. $cat4->x = 4;
  732. $cat4->y = 2;
  733. $field->addAnimal($field, $cat4);
  734. $cat5 = new Cat("cat5");
  735. $cat5->x = 5;
  736. $cat5->y = 3;
  737. $field->addAnimal($field, $cat5);
  738. $dog1 = new Dog("dog1");
  739. $dog1->x = 7;
  740. $dog1->y = 7;
  741. $field->addAnimal($field, $dog1);
  742. $field->startGame($field);
  743. */
  744.  
  745. //Тест на два огня #2
  746. /**
  747. $field = new Field(8, 8);
  748. $mouse1 = new Mouse("mouse1");
  749. $mouse1->x = 3;
  750. $mouse1->y = 4;
  751. $mouse1->symbol = 1;
  752. $field->addAnimal($field, $mouse1);
  753. $cat1 = new Cat("cat1");
  754. $cat1->x = 1;
  755. $cat1->y = 3;
  756. $field->addAnimal($field, $cat1);
  757. $cat2 = new Cat("cat2");
  758. $cat2->x = 5;
  759. $cat2->y = 5;
  760. $field->addAnimal($field, $cat2);
  761. $dog1 = new Dog("dog1");
  762. $dog1->x = 8;
  763. $dog1->y = 8;
  764. $field->addAnimal($field, $dog1);
  765. $field->startGame($field);
  766.  */
  767.  
Success #stdin #stdout 0.07s 52472KB
stdin
Standard input is empty
stdout
   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  K  .  .  .  .  1     Ход: 0
2  .  .  .  .  .  .  .  .  D  .     Мышек: 3
3  .  2  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  K  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  3  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  D  .  .  .  .  .  .  .  .  
У мышки mouse1 рядом кошка. Я, mouse1, хожу x:9, y:1.
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:3.
Кошек рядом нет. Я, mouse3, хожу x:4, y:8.
Я, cat1, хожу x:6, y:1.
Я, cat2, хожу x:9, y:4.
Я, dog1, хожу x:7, y:2.
Я, dog2, хожу x:2, y:8.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  K  .  .  1  .     Ход: 1
2  .  .  .  .  .  .  D  .  .  .     Мышек: 3
3  2  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  K  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  D  .  3  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 рядом кошка. Я, mouse1, хожу x:10, y:1.
Кошек рядом нет. Я, mouse2, хожу x:2, y:3.
Кошек рядом нет. Я, mouse3, хожу x:3, y:8.
Я, cat1, хожу x:5, y:2.
Я, cat2, хожу x:10, y:3.
Я, dog1, хожу x:9, y:4.
Я, dog2, хожу x:2, y:10.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  1     Ход: 2
2  .  .  .  .  K  .  .  .  .  .     Мышек: 3
3  .  2  .  .  .  .  .  .  .  K     Кошек: 2
4  .  .  .  .  .  .  .  .  D  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  3  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  D  .  .  .  .  .  .  .  .  
У мышки mouse1 рядом кошка. Я, mouse1, хожу x:9, y:1.
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:3.
Кошек рядом нет. Я, mouse3, хожу x:3, y:7.
Я, cat1, хожу x:6, y:1.
Я, cat2, хожу x:9, y:2.
Я, dog1, хожу x:7, y:2.
Я, dog2, хожу x:2, y:8.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  K  .  .  1  .     Ход: 3
2  .  .  .  .  .  .  D  .  K  .     Мышек: 3
3  2  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  3  .  .  .  .  .  .  .  
8  .  D  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 рядом кошка. Я, mouse1, хожу x:10, y:1.
Кошек рядом нет. Я, mouse2, хожу x:1, y:4.
Кошек рядом нет. Я, mouse3, хожу x:3, y:6.
Я, cat1, хожу x:5, y:2.
Пытаюсь съесть mouse1. Пытаюсь съесть mouse1. Пытаюсь съесть mouse1. Я, cat2, хожу x:10, y:1.
Я, dog1, хожу x:9, y:2.
Я, dog2, хожу x:2, y:10.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  @     Ход: 4
2  .  .  .  .  K  .  .  .  D  .     Мышек: 2
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  2  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  3  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  D  .  .  .  .  .  .  .  .  
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:3.
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:3, y:7.
Я, cat1, хожу x:4, y:3.
Кошка спит :3
Я, dog1, хожу x:7, y:2.
Я, dog2, хожу x:4, y:8.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  K     Ход: 5
2  .  .  .  .  .  .  D  .  .  .     Мышек: 2
3  2  .  .  K  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  3  .  .  .  .  .  .  .  
8  .  .  .  D  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:2.
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:3, y:8.
Я, cat1, хожу x:3, y:2.
Я, cat2, хожу x:9, y:2.
Я, dog1, хожу x:5, y:2.
Я, dog2, хожу x:6, y:6.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 6
2  2  .  K  .  D  .  .  .  K  .     Мышек: 2
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  D  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  3  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:1.
Кошек рядом нет. Я, mouse3, хожу x:3, y:9.
Я, cat1, хожу x:2, y:1.
Я, cat2, хожу x:9, y:3.
Я, dog1, хожу x:3, y:4.
Я, dog2, хожу x:6, y:4.

   1  2  3  4  5  6  7  8  9  10 
1  2  K  .  .  .  .  .  .  .  .     Ход: 7
2  .  .  .  .  .  .  .  .  .  .     Мышек: 2
3  .  .  .  .  .  .  .  .  K  .     Кошек: 2
4  .  .  D  .  .  D  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  
9  .  .  3  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse2 рядом кошка. Я, mouse2, хожу x:1, y:2.
Кошек рядом нет. Я, mouse3, хожу x:4, y:9.
Пытаюсь съесть mouse2. Пытаюсь съесть mouse2. Пытаюсь съесть mouse2. Я, cat1, хожу x:1, y:2.
Я, cat2, хожу x:9, y:4.
Я, dog1, хожу x:1, y:6.
Я, dog2, хожу x:6, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 8
2  @  .  .  .  .  D  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  K  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  D  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  3  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
Кошек рядом нет. Я, mouse3, хожу x:4, y:8.
Кошка спит :3
Я, cat2, хожу x:8, y:5.
Я, dog1, хожу x:3, y:4.
Я, dog2, хожу x:8, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 9
2  K  .  .  .  .  .  .  D  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  D  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  K  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  3  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:3, y:8.
Я, cat1, хожу x:1, y:3.
Я, cat2, хожу x:7, y:6.
Я, dog1, хожу x:5, y:2.
Я, dog2, хожу x:10, y:4.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 10
2  .  .  .  .  D  .  .  .  .  .     Мышек: 1
3  K  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  D     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  K  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  3  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:2, y:8.
Я, cat1, хожу x:2, y:4.
Я, cat2, хожу x:6, y:7.
Я, dog1, хожу x:7, y:4.
Я, dog2, хожу x:10, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 11
2  .  .  .  .  .  .  .  .  .  D     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  K  .  .  .  .  D  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  K  .  .  .  .  
8  .  3  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:2, y:9.
Я, cat1, хожу x:2, y:5.
Я, cat2, хожу x:5, y:8.
Я, dog1, хожу x:5, y:6.
Я, dog2, хожу x:8, y:4.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 12
2  .  .  .  .  .  .  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  D  .  .     Собак: 2
5  .  K  .  .  .  .  .  .  .  .  
6  .  .  .  .  D  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  K  .  .  .  .  .  
9  .  3  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:1, y:9.
Я, cat1, хожу x:1, y:6.
Я, cat2, хожу x:4, y:9.
Я, dog1, хожу x:3, y:4.
Я, dog2, хожу x:6, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 13
2  .  .  .  .  .  D  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  D  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  K  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  
9  3  .  .  K  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:1, y:10.
Я, cat1, хожу x:1, y:7.
Я, cat2, хожу x:3, y:10.
Я, dog1, хожу x:3, y:6.
Я, dog2, хожу x:6, y:4.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 14
2  .  .  .  .  .  .  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  D  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  D  .  .  .  .  .  .  .  
7  K  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  
10 3  .  @  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:1, y:9.
Я, cat1, хожу x:1, y:8.
Кошка спит :3
Я, dog1, хожу x:3, y:8.
Я, dog2, хожу x:4, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 15
2  .  .  .  D  .  .  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  K  .  D  .  .  .  .  .  .  .  
9  3  .  .  .  .  .  .  .  .  .  
10 .  .  K  .  .  .  .  .  .  .  
У мышки mouse3 рядом кошка. Я, mouse3, хожу x:1, y:10.
Я, cat1, хожу x:1, y:9.
Я, cat2, хожу x:2, y:10.
Я, dog1, хожу x:5, y:8.
Я, dog2, хожу x:6, y:2.

   1  2  3  4  5  6  7  8  9  10 
1  .  .  .  .  .  .  .  .  .  .     Ход: 16
2  .  .  .  .  .  D  .  .  .  .     Мышек: 1
3  .  .  .  .  .  .  .  .  .  .     Кошек: 2
4  .  .  .  .  .  .  .  .  .  .     Собак: 2
5  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  D  .  .  .  .  .  
9  K  .  .  .  .  .  .  .  .  .  
10 3  K  .  .  .  .  .  .  .  .  
Стою на месте.
Пытаюсь съесть mouse3. Пытаюсь съесть mouse3. Пытаюсь съесть mouse3. Я, cat1, хожу x:1, y:10.
Конец игры.