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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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