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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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