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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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