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


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


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


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


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


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


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


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


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  1  .  .  3  .  .  .  2     Ход: 8
2  .  .  .  .  .  .  .  .  .  .  @     Кошек: 2
3  .  .  .  @  .  .  .  .  .  .  .     Мышей: 3
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  D  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  D  .  .  .  
У мышки mouse1 ближайший враг cat2, y:3, x:4. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:1, x:5.
У мышки mouse2 ближайший враг cat1, y:2, x:11. Дойдет за 1 шага. Убегаем от кошки. Я, mouse2, хожу y:1, x:10.
У мышки mouse3 ближайший враг cat2, y:3, x:4. Дойдет за 3 шага. Убегаем от кошки. Я, mouse3, хожу y:1, x:8.
Кошка cat1 спит. Пропускает ход
Кошка cat2 спит. Пропускает ход
Я, dog1, хожу y:11, x:10.
Я, dog2, хожу y:9, x:3.


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


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  1  3  .  2  K  .     Ход: 10
2  .  .  .  .  K  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 3
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  D  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  D  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 ближайший враг cat2, y:2, x:5. Дойдет за 1 шага. Убегаем от кошки. Я, mouse1, хожу y:2, x:6.
У мышки mouse2 ближайший враг cat1, y:1, x:10. Дойдет за 1 шага. Убегаем от кошки. Я, mouse2, хожу y:1, x:8.
У мышки mouse3 ближайший враг cat2, y:2, x:5. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:2, x:7.
У кошки cat1 ближайший враг mouse2, y:1, x:8. Дойдет за 2 шага. Убегаем от кошки. Я, cat1, хожу y:1, x:9.
У кошки cat2 ближайший враг mouse1, y:2, x:6. Дойдет за 1 шага. Убегаем от кошки. Мыши защищают друг друга. 
Я, cat2, хожу y:1, x:6.
Я, dog1, хожу y:11, x:10.
Я, dog2, хожу y:9, x:3.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  K  .  2  K  .  .     Ход: 11
2  .  .  .  .  .  1  3  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 3
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  D  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  .  .  D  .  
У мышки mouse1 ближайший враг cat2, y:1, x:6. Дойдет за 1 шага. Убегаем от кошки. Я, mouse1, хожу y:3, x:6.
У мышки mouse2 ближайший враг cat1, y:1, x:9. Дойдет за 1 шага. Убегаем от кошки. Я, mouse2, хожу y:1, x:7.
У мышки mouse3 ближайший враг cat2, y:1, x:6. Дойдет за 1 шага. Убегаем от кошки. Я, mouse3, хожу y:3, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:1, x:8.
У кошки cat2 ближайший враг mouse2, y:1, x:7. Дойдет за 1 шага. Убегаем от кошки. Мы съели мышку mouse2. Засыпаем.
Я, dog1, хожу y:11, x:8.
Я, dog2, хожу y:11, x:1.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  @  K  .  .  .     Ход: 12
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  1  3  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 D  .  .  .  .  .  .  D  .  .  .  
У мышки mouse1 врагов несколько. Убегаем от кошек. Я, mouse1, хожу y:4, x:6.
У мышки mouse3 врагов несколько. Убегаем от кошек. Я, mouse3, хожу y:4, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:2, x:7.
Кошка cat2 спит. Пропускает ход
Я, dog1, хожу y:9, x:8.
Я, dog2, хожу y:11, x:3.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  K  .  .  .  .     Ход: 13
2  .  .  .  .  .  .  K  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  1  3  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  D  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  D  .  .  .  .  .  .  .  .  
У мышки mouse1 ближайший враг cat1, y:2, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:5, x:6.
У мышки mouse3 ближайший враг cat1, y:2, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:5, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:3, x:7.
У кошки cat2 врагов несколько. Я, cat2, хожу y:2, x:7.
Я, dog1, хожу y:7, x:8.
Я, dog2, хожу y:9, x:5.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 14
2  .  .  .  .  .  .  K  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  K  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  1  3  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  D  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  D  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 ближайший враг cat1, y:3, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:6, x:6.
У мышки mouse3 ближайший враг cat1, y:3, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:6, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:4, x:7.
У кошки cat2 врагов несколько. Я, cat2, хожу y:3, x:7.
Я, dog1, хожу y:7, x:10.
Я, dog2, хожу y:9, x:7.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 15
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  K  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  K  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  1  3  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  D  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  D  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 ближайший враг cat1, y:4, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:7, x:6.
У мышки mouse3 ближайший враг cat1, y:4, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:7, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:5, x:7.
У кошки cat2 врагов несколько. Я, cat2, хожу y:4, x:7.
Я, dog1, хожу y:7, x:8.
Я, dog2, хожу y:11, x:7.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 16
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  K  .  .  .  .  
5  .  .  .  .  .  .  K  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  1  3  D  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  D  .  .  .  .  
У мышки mouse1 ближайший враг cat1, y:5, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:8, x:6.
У мышки mouse3 ближайший враг cat1, y:5, x:7. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:8, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:6, x:6.
У кошки cat2 врагов несколько. Я, cat2, хожу y:5, x:7.
Я, dog1, хожу y:9, x:10.
Я, dog2, хожу y:9, x:7.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 17
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  K  .  .  .  .  
6  .  .  .  .  .  @  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  1  3  .  .  .  .  
9  .  .  .  .  .  .  D  .  .  D  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  .  .  .  .  .  .  .  
У мышки mouse1 ближайший враг cat1, y:6, x:6. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:9, x:6.
У мышки mouse3 ближайший враг cat1, y:6, x:6. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:8, x:8.
Кошка cat1 спит. Пропускает ход
У кошки cat2 ближайший враг mouse3, y:8, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat2, хожу y:6, x:8.
Я, dog1, хожу y:11, x:10.
Я, dog2, хожу y:11, x:5.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 18
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  K  .  K  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  3  .  .  .  
9  .  .  .  .  .  1  .  .  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  D  .  .  .  .  D  .  
У мышки mouse1 врагов несколько. Убегаем от кошек. Я, mouse1, хожу y:10, x:6.
У мышки mouse3 врагов несколько. Убегаем от кошек. Я, mouse3, хожу y:9, x:8.
У кошки cat1 ближайший враг mouse3, y:9, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat1, хожу y:7, x:7.
У кошки cat2 ближайший враг mouse3, y:9, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat2, хожу y:7, x:8.
Я, dog1, хожу y:11, x:8.
Я, dog2, хожу y:9, x:7.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 19
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  K  K  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  D  3  .  .  .  
10 .  .  .  .  .  1  .  .  .  .  .  
11 .  .  .  .  .  .  .  D  .  .  .  
У мышки mouse1 врагов несколько. Убегаем от кошек. Я, mouse1, хожу y:11, x:6.
У мышки mouse3 врагов несколько. Убегаем от кошек. Я, mouse3, хожу y:10, x:8.
У кошки cat1 ближайший враг mouse3, y:10, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat1, хожу y:7, x:6.
У кошки cat2 ближайший враг mouse3, y:10, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat2, хожу y:8, x:9.
Я, dog1, хожу y:9, x:10.
Я, dog2, хожу y:7, x:7.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 20
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  K  D  .  .  .  .  
8  .  .  .  .  .  .  .  .  K  .  .  
9  .  .  .  .  .  .  .  .  .  D  .  
10 .  .  .  .  .  .  .  3  .  .  .  
11 .  .  .  .  .  1  .  .  .  .  .  
У мышки mouse1 ближайший враг cat2, y:8, x:9. Дойдет за 3 шага. Убегаем от кошки. Я, mouse1, хожу y:11, x:5.
У мышки mouse3 ближайший враг cat2, y:8, x:9. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:11, x:8.
У кошки cat1 врагов несколько. Я, cat1, хожу y:8, x:5.
У кошки cat2 ближайший враг mouse3, y:11, x:8. Дойдет за 3 шага. Убегаем от кошки. Я, cat2, хожу y:9, x:8.
Я, dog1, хожу y:7, x:10.
Я, dog2, хожу y:9, x:5.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 21
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  D  .  
8  .  .  .  .  K  .  .  .  .  .  .  
9  .  .  .  .  D  .  .  @  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  .  .  1  .  .  3  .  .  .  
У мышки mouse1 врагов несколько. Убегаем от кошек. Я, mouse1, хожу y:11, x:4.
У мышки mouse3 ближайший враг cat2, y:9, x:8. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:11, x:7.
У кошки cat1 врагов несколько. Я, cat1, хожу y:7, x:4.
Кошка cat2 спит. Пропускает ход
Я, dog1, хожу y:9, x:10.
Я, dog2, хожу y:11, x:3.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 22
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  K  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  K  .  D  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  D  1  .  .  3  .  .  .  .  
У мышки mouse1 врагов несколько. Убегаем от кошек. Я, mouse1, хожу y:10, x:4.
У мышки mouse3 ближайший враг cat2, y:9, x:8. Дойдет за 2 шага. Убегаем от кошки. Я, mouse3, хожу y:11, x:8.
У кошки cat1 ближайший враг mouse1, y:10, x:4. Дойдет за 3 шага. Убегаем от кошки. Я, cat1, хожу y:8, x:4.
У кошки cat2 ближайший враг mouse3, y:11, x:8. Дойдет за 2 шага. Убегаем от кошки. Я, cat2, хожу y:10, x:8.
Я, dog1, хожу y:7, x:10.
Я, dog2, хожу y:11, x:1.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 23
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 2
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  D  .  
8  .  .  .  K  .  .  .  .  .  .  .  
9  .  .  .  .  .  .  .  .  .  .  .  
10 .  .  .  1  .  .  .  K  .  .  .  
11 D  .  .  .  .  .  .  3  .  .  .  
У мышки mouse1 ближайший враг cat1, y:8, x:4. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:11, x:4.
У мышки mouse3 ближайший враг cat2, y:10, x:8. Дойдет за 1 шага. Убегаем от кошки. Я, mouse3, хожу y:11, x:9.
У кошки cat1 ближайший враг mouse1, y:11, x:4. Дойдет за 3 шага. Убегаем от кошки. Я, cat1, хожу y:9, x:4.
У кошки cat2 ближайший враг mouse3, y:11, x:9. Дойдет за 1 шага. Убегаем от кошки. Мы съели мышку mouse3. Засыпаем.
Я, dog1, хожу y:9, x:8.
Я, dog2, хожу y:11, x:3.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 24
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 1
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  .  K  .  .  .  D  .  .  .  
10 .  .  .  .  .  .  .  .  .  .  .  
11 .  .  D  1  .  .  .  .  @  .  .  
У мышки mouse1 ближайший враг cat1, y:9, x:4. Дойдет за 2 шага. Убегаем от кошки. Я, mouse1, хожу y:11, x:5.
У кошки cat1 ближайший враг mouse1, y:11, x:5. Дойдет за 2 шага. Убегаем от кошки. Я, cat1, хожу y:10, x:5.
Кошка cat2 спит. Пропускает ход
Я, dog1, хожу y:11, x:6.
Я, dog2, хожу y:9, x:3.


   1  2  3  4  5  6  7  8  9  10 11 
1  .  .  .  .  .  .  .  .  .  .  .     Ход: 25
2  .  .  .  .  .  .  .  .  .  .  .     Кошек: 2
3  .  .  .  .  .  .  .  .  .  .  .     Мышей: 1
4  .  .  .  .  .  .  .  .  .  .  .  
5  .  .  .  .  .  .  .  .  .  .  .  
6  .  .  .  .  .  .  .  .  .  .  .  
7  .  .  .  .  .  .  .  .  .  .  .  
8  .  .  .  .  .  .  .  .  .  .  .  
9  .  .  D  .  .  .  .  .  .  .  .  
10 .  .  .  .  K  .  .  .  .  .  .  
11 .  .  .  .  1  D  .  .  K  .  .  
У мышки mouse1 ближайший враг cat1, y:10, x:5. Дойдет за 1 шага. Убегаем от кошки. Я, mouse1, хожу y:11, x:4.
У кошки cat1 ближайший враг mouse1, y:11, x:4. Дойдет за 1 шага. Убегаем от кошки. Мы съели мышку mouse1. Засыпаем.
Конец игры!