<?php

error_reporting(-1);
abstract class Animal {

    abstract protected function tryToMove($field, $game);
    public function __construct($name)
    {
        $this->name = $name; //Имя животного - мурзик, барсик etc.
    }

    protected function nearbyAnimal($animals) //Метод будет искать ближайшего врага, иногда их будет несколько
    {
        $stepsNearestAnimal = 1000;
        foreach ($animals as $animal) {
            $point1 = array('x' => $this->x, 'y' => $this->y);
            $countAllSteps = $this->countSteps($point1, $animal);
            if ($countAllSteps < $stepsNearestAnimal) { //Если один из врагов оказался ближе...
                $nearbyAnimal    = array();
                $nearbyAnimal[0] = $animal;             //...он становится ближайшим врагом
                $nearbyAnimal[0]['steps'] = $countAllSteps;
                $nearbyAnimal[0]['name']  = $animal['name'];
                $stepsNearestAnimal = $nearbyAnimal[0]['steps'];
                $i = 1;
            } elseif ($countAllSteps == $stepsNearestAnimal) { //Если врагов на одном расстоянии несколько...
                $nearbyAnimal[$i] = $animal;                   //...добавляем их в массив
                $i++;
            }
        }
        return $nearbyAnimal; //Возвращаем координаты ближайшего врага или врагов
    }

    protected function countSteps($point1, $point2) //Метод считает расстоянии (8 направлений, а не 4) между любыми двумя точками (кошкой и мышью, мышью и собакой)
    {
        $countSteps['x'] = abs($point1['x'] - $point2['x']); //Подсчет шагов по оси X
        $countSteps['y'] = abs($point1['y'] - $point2['y']); //Подсчет шагов по оси Y
        if ($countSteps['x'] > $countSteps['y']) {
            return $countSteps['x'];
        } else {
            return $countSteps['y'];
        }
    }

    protected function moveTo($direction) //Метод шага на определенную координату
    {
        echo "Я, {$this->name}, хожу y:{$direction['y']}, x:{$direction['x']}.\n";
        $this->x = $direction['x'];
        $this->y = $direction['y'];
    }

    protected function getName($y, $x, $animals) //Метод определяющий имя животного по его координатам
    {
        foreach ($animals as $animal) {
            if ($animal->y == $y && $animal->x == $x) {
                return $animal->name;
            }
        }
        return NULL;
    }

}

class Mouse extends Animal {
    public $name;
    public $body;
    public $x;
    public $y;
    private $enemies = array();
    private $dogs    = array();
    private $possibleMoves = array();

    public function tryToMove($field, $game) //Выбор одного из вариантов хода
    {
        $this->enemies       = NULL; //чистим координаты прошлого хода
        $this->dogs          = NULL;
        $this->possibleMoves = NULL;
        $this->searchForEnemies($field, $game); //Координаты найденных в дальности обзора кошек
        $this->searchForDogs($field, $game);    //Собаки, которые могут мышке помочь
        $arrows["up"]    = array('y' => $this->y - 1, 'x' => $this->x); //Список возможных ходов, 4 напраавления
        $arrows["right"] = array('y' => $this->y,     'x' => $this->x+1);
        $arrows["down"]  = array('y' => $this->y + 1, 'x' => $this->x);
        $arrows["left"]  = array('y' => $this->y,     'x' => $this->x-1);
        foreach ($arrows as $arrow) {
            if ($this->canIMoveTo($arrow, $field)) { //Отсеиваем невозможные ходы, например ход за карту
                $this->possibleMoves[] = array('y' => $arrow['y'], 'x' => $arrow['x']);
            }
        }
        if (count($this->possibleMoves) == 0) {
            echo "Стоим на месте.";
        }
        elseif ($this->enemies != NULL) { //Если видно хоть одну кошку, мышь убегает от нее
            $this->escape($field);
        } else { //В остальных случаях просто ходит наобум
            $this->freeMove();
        }
    }

    private function escape($field) //Метод побега от кошек
    {
        echo "У мышки {$this->name} ";
        $nearbyEnemy = $this->nearbyAnimal($this->enemies); //Метод определяющий ближайшего врага/врагов
        if ($this->dogs != NULL) { //Если мышь увидела хоть одну собаку, она будет использоваться в плане побега
            $nearbyDog = $this->nearbyAnimal($this->dogs);
        }
        if (count($nearbyEnemy) == 1) {
            echo "ближайший враг {$nearbyEnemy[0]['name']}, y:{$nearbyEnemy[0]['y']}, x:{$nearbyEnemy[0]['x']}. Дойдет за {$nearbyEnemy[0]['steps']} шага. Убегаем от кошки. ";
        } else {
            echo "врагов несколько. Убегаем от кошек. ";
        }
        $bestMove = array(); //Здесь мы будем хранить лучший ход мыши
        $pointsMax = -1;     //Здесь мы будем хранить лучшее количество очков за ход мыши. -1, потому что бывает случаи когда лучший ход приносит 0 баллов
        foreach ($this->possibleMoves as $move) {
            /*
              Оценка каждого хода.
              Приоритет 1: Количество клеток до врага. Их должно быть как можно больше. Коэффициент 100
              Приоритет 2: Количество клеток до ближайшего угла. Как можно больше, чтобы не забиться в угол. Коэфициент 10
              Приоритет 3: Количество клеток до собаки. Может стать приоритетом 2 в ситуации когда только собака может спасти от съедения кошкой
            */
            $points = 0; //Количество очков текущего хода
            //var_dump($move);
            foreach ($nearbyEnemy as $enemy) {
                $pointsForDog = 0;
                $pointsForEnemy = $this->countSteps($move, $enemy) * 100;
                if ($pointsForEnemy == 100) { //Если кошка рядом, не даем очков за этот ход в ситуации когда мышь стоит между двумя кошками, чтобы он не выиграл  засчет оценки 3 + 1 клетки, когда нужно чтобы было 2 + 2 клетка
                    $pointsForEnemy = 0;
                }
                if ($this->dogs != NULL) { //Если мышь видет собаку
                    $pointsForDog = ($field->width) - $this->countSteps($move, $nearbyDog[0]); //Мышь хочет быть ближе к собакам
                    if ($pointsForDog == 1 && $pointsForEnemy == 0) { //Тот самый случай когда только собакен может мышь спасти
                        $pointsForDog *= 100;
                    }
                }
                if ($move['x'] < $field->width / 2) { //Ближе левый край
                    $stepsToCorner['x'] = $move['x'] - 1;
                } else {                              //Ближе правый край
                    $stepsToCorner['x'] = $field->width - $move['x'];
                }
                if ($move['y'] < $field->height / 2) { //Ближе вверхний край
                    $stepsToCorner['y'] = $move['y'] - 1;
                } else {                               //Ближе нижний край
                    $stepsToCorner['y'] = $field->height - $move['y'];
                }
                if ($stepsToCorner['x'] > $stepsToCorner['y']) { //Вертикальный край ближе горизонтального
                    $pointsForCorner = $stepsToCorner['y'] * 10;
                } else {                                         //Горизонтальный край ближе вертикального
                    $pointsForCorner = $stepsToCorner['x'] * 10;
                }
                //echo "points = Враг({$pointsForEnemy}) + Угол({$pointsForCorner}) + Собака({$pointsForDog})\n";
                $points+= $pointsForEnemy + $pointsForCorner + $pointsForDog;
                if ($points > $pointsMax) { //Если ход дал лучший результат по очкам, он будет лучшим ходом
                    $pointsMax = $points;
                    $bestMove = $move;
                }
            }
        }
        $this->moveTo($bestMove); //Выбрали лучший ход и походили
    }

    private function searchForEnemies($field, $game) //Метод поиска врагов ориентированный на дальность обзора (свойство mouseVision в классе Game)
    {
        $regexpForCats = '/[K@]/ui'; //Ищем кошек
        if (($this->y - $game->mouseVision) < 1 ) { //Если дальность обзора вверх упирается в край карты...
            $i = 1;                                 //...дальность обзора будет видеть край карты, а не то что находится за ним
        } else {
            $i = $this->y - $game->mouseVision;
        }
        if (($this->y + $game->mouseVision) > $field->height) { //Аналогично $i, только здесь мы определяем не выходит ли нижний край обзора за карту
            $k = $field->height;
        } else {
            $k = $this->y + $game->mouseVision;
        }
        if (($this->x - $game->mouseVision) < 1) { //Дальность обзора влево
            $j = 1;
        } else {
            $j = $this->x - $game->mouseVision;
        }
        if (($this->x + $game->mouseVision) > $field->width) { //Дальность обзора вправо
            $l = $field->width;
        } else {
            $l = $this->x + $game->mouseVision;
        }

        for ($y = $i; $y <= $k; $y++) { //Проходим вложенному циклу по воображаемому квадрату обзора, мышь в центре
            for ($x = $j; $x <= $l; $x++) {
                if (preg_match($regexpForCats, $field->field[$y][$x])) {
                    //Если нашли котэ, выводим сообщение и заносим его координаты в массив видимых врагов
                    $this->enemies[] = array('x' => $x, 'y' => $y, 'name' => $this->getName($y, $x, $game->cats));
                }
            }
        }
    }

    private function freeMove() //Метод случайного хода, мышка не знает где кошки
    {
        $randomTurn = $this->possibleMoves[mt_rand(0, count($this->possibleMoves)-1)];
        echo "Кошек рядом нет. ";
        $this->moveTo($randomTurn); //Ходим в случайном направлении
    }

    private function canIMoveTo($move, $field) //Метод могуЛиЯПоходитьТуда для мыши
    {
        if ($move['x'] != 0 && //Ход не должен быть дальше карты
            $move['x'] != $field->width + 1 &&
            $move['y'] != 0 &&
            $move['y'] != $field->height + 1 &&
            $field->field[$move['y']][$move['x']] == '.') {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    private function searchForDogs($field, $game) //Метод поиска собак для мыши
    {
        $regexpForDogs = '/[D]/ui'; //Ищем собак
        if (($this->y - $game->mouseVision) < 1 ) { //Если дальность обзора вверх упирается в край карты...
            $i = 1;                                 //...дальность обзора будет видеть край карты, а не то что находится за ним
        } else {
            $i = $this->y - $game->mouseVision;
        }
        if (($this->y + $game->mouseVision) > $field->height) { //Аналогично $i, только здесь мы определяем не выходит ли нижний край обзора за карту
            $k = $field->height;
        } else {
            $k = $this->y + $game->mouseVision;
        }
        if (($this->x - $game->mouseVision) < 1) { //Дальность обзора влево
            $j = 1;
        } else {
            $j = $this->x - $game->mouseVision;
        }
        if (($this->x + $game->mouseVision) > $field->width) { //Дальность обзора вправо
            $l = $field->width;
        } else {
            $l = $this->x + $game->mouseVision;
        }

        for ($y = $i; $y <= $k; $y++) { //Проходим вложенному циклу по воображаемому квадрату обзора, мышь в центре
            for ($x = $j; $x <= $l; $x++) {
                if (preg_match($regexpForDogs, $field->field[$y][$x])) {
                    //Если нашли собаку, выводим сообщение и заносим его координаты в массив видимых друзей-собак
                    $this->dogs[] = array('x' => $x, 'y' => $y, 'name' => $this->getName($y, $x, $game->dogs));
                }
            }
        }
    }
}

class Cat extends Animal {
    public $name;
    public $body = "K"; //по умолчанию на карте отображается буквой К
    public $x;
    public $y;
    private $enemies = array();
    private $possibleMoves = array();
    public $movesInARow = 0; //поле для ходов подряд, необходимо для внезапного сна

    public function tryToMove($field, $game)
    {
        $this->possibleMoves = NULL; //Чистим данные прошлого хода
        $this->enemies = NULL;
        foreach ($game->mice as $mouse) { //Кошка видит всех мышей и ей не нужна дальность обзора
            $this->enemies[] = ['x' => $mouse->x, 'y' => $mouse->y, 'name' => $mouse->name];
        }
        echo "У кошки {$this->name} ";
        $nearbyEnemy = $this->nearbyAnimal($this->enemies); //Нашли ближайшую жертву или жертв
        if (count($nearbyEnemy) == 1) {
            echo "ближайший враг {$nearbyEnemy[0]['name']}, y:{$nearbyEnemy[0]['y']}, x:{$nearbyEnemy[0]['x']}. Дойдет за {$nearbyEnemy[0]['steps']} шага. Убегаем от кошки. ";
        } else {
            echo "врагов несколько. ";
        }
        $arrows["up"]         = array('y' => $this->y-1, 'x' => $this->x);
        $arrows["up-right"]   = array('y' => $this->y-1, 'x' => $this->x+1);
        $arrows["right"]      = array('y' => $this->y,   'x' => $this->x+1);
        $arrows["right-down"] = array('y' => $this->y+1, 'x' => $this->x+1);
        $arrows["down"]       = array('y' => $this->y+1, 'x' => $this->x);
        $arrows["down-left"]  = array('y' => $this->y+1, 'x' => $this->x-1);
        $arrows["left"]       = array('y' => $this->y,   'x' => $this->x-1);
        $arrows["left-up"]    = array('y' => $this->y-1, 'x' => $this->x-1);
        foreach ($arrows as $arrow) {
            if ($this->canIMoveTo($arrow, $field)) { //Если ход не дальше карты
                foreach ($game->dogs as $dog) {
                    $point2 = array('y' => $dog->y, 'x' => $dog->x);
                    if ($this->countSteps($arrow, $point2) == 1) { //Если рядом есть собака
                        continue 2;
                    }
                }
                foreach ($nearbyEnemy as $enemy) {
                    if ($arrow['x'] == $enemy['x'] && $arrow['y'] == $enemy['y']) { //Если можно съесть мышь
                        if ($this->canIEatIt()) { //А не защищаются ли 3 мыши?
                            foreach ($game->mice as $key => $mouse) { //Удаляем ее из массива $game->mice по ключу
                                if ($mouse->name == $enemy['name']) {
                                    $this->x = $mouse->x; //Занимаем мышиную клетку
                                    $this->y = $mouse->y;
                                    unset($game->mice[$key]);
                                    echo "Мы съели мышку {$enemy['name']}. Засыпаем.\n";
                                    $this->body = "@"; //засыпаем
                                    return; //Завершаем ход
                                }
                            }
                        }
                    } else {
                        $this->possibleMoves[] = array('y' => $arrow['y'], 'x' => $arrow['x']); //Если съеть никого нельзя, добавляем ход в возможные для оценки
                    }
                }
            }
        }
        if (count($this->possibleMoves) == 0) { //Если ходить некуда - стоим
            echo "Стоим на месте.";
            return;
        }
        $bestMove = array(); //Здесь мы будем хранить лучший ход кошки
        $pointsMax = -1;     //Здесь мы будем хранить лучшее количество очков за ход кошки. -1, потому что бывает случаи когда лучший ход приносит 0 баллов
        foreach ($this->possibleMoves as $move) {
            foreach ($nearbyEnemy as $enemy) {
                /*
                Оценка каждого хода. В отличии от оценки хода мыши, очки кошки будут обнуляться во вложенном цикле и не будут складываться по сумме всего вложенного цикла
                Приоритет 1: Количество клеток до врага. Их должно быть как можно меньше. Коэффициент 100.
                Приоритет 2: Количество клеток до одной линии с мышью, удобная позиция для охоты.
                */
                $points = ($field->width - $this->countSteps($move, $enemy)) * 100;
                if ($move['x'] == $enemy['x'] || $move['y'] == $enemy['y']) { //Если на одной вертикали или горизонтали
                    $points += 99;
                } elseif (abs($move['x'] - $enemy['x']) > abs($move['y'] - $enemy['y'])) { //Быстрей оказаться на одной линии чтобы зажать в углу
                    $points += $field->width - abs($move['y'] - $enemy['y']);
                } else {  //(abs($move['x'] - $enemy['x']) < abs($move['y'] - $enemy['y']))
                    $points += $field->width - abs($move['x'] - $enemy['x']);
                }
                if ($points > $pointsMax) { //Если ход дал лучший результат по очкам, он будет лучшим ходом
                    $pointsMax = $points;
                    $bestMove = $move;
                }
            }
        }
            $this->moveTo($bestMove); //Выбрали лучший ход и походили
    }

    private function canIMoveTo($move, $field) //Метот могуЛиЯПоходитьСюда для кошек
    {
        $regexp = '/[\\d.]/'; //Цифра или точка
        if ($move['x'] != 0 &&
            $move['x'] != $field->width + 1 &&
            $move['y'] != 0 &&
            $move['y'] != $field->height + 1 &&
            preg_match($regexp, $field->field[$move['y']][$move['x']])
        ) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    private function canIEatIt() //Метод в котором проверятся присутствия 3 мышек на соседних клетках
    {
        $oneLine = 0; //Количество соседей
        $copyMice = $this->enemies; //Копия массива мышек
        foreach($this->enemies as $mouse1) {
            foreach($copyMice as $mouse2) {
                if ($mouse1 != $mouse2) {
                    $point1 = array('y' => $mouse1['y'],  'x' => $mouse1['x']);
                    $point2 = array('y' => $mouse2['y'],  'x' => $mouse2['x']);
                    if ($this->countSteps($point1, $point2) == 1) {
                        $oneLine++;
                    }
                }
                if ($oneLine == 3) {
                    echo "Мыши защищают друг друга. \n";
                    return FALSE;
                }
            }
        }
        return TRUE;
    }

}

class Dog extends Animal
{
    public $body = "D";
    public $name;
    public $x;
    public $y;
    private $possibleMoves = array();


    public function tryToMove($field, $game)
    {
        $this->possibleMoves = NULL;
        $arrows["up"]         = array('y' => $this->y-2, 'x' => $this->x); //перепрыгивание через клетку
        $arrows["up-right"]   = array('y' => $this->y-2, 'x' => $this->x+2);
        $arrows["right"]      = array('y' => $this->y,   'x' => $this->x+2);
        $arrows["right-down"] = array('y' => $this->y+2, 'x' => $this->x+2);
        $arrows["down"]       = array('y' => $this->y+2, 'x' => $this->x);
        $arrows["down-left"]  = array('y' => $this->y+2, 'x' => $this->x-2);
        $arrows["left"]       = array('y' => $this->y,   'x' => $this->x-2);
        $arrows["left-up"]    = array('y' => $this->y+2, 'x' => $this->x-2);
        foreach ($arrows as $arrow) {
            if ($this->canIMoveTo($arrow, $field)) {
                $this->possibleMoves[] = array('y' => $arrow['y'], 'x' => $arrow['x']);
            }
        }
        if (count($this->possibleMoves) == 0) {
            echo "Ходить $this->name некуда.\n";
        } else {
            $this->freeMove(); //Собака всегда ходит наобум
        }
    }

    private function freeMove() //прыг скок через клетку
    {
        $randomTurn = $this->possibleMoves[mt_rand(0, count($this->possibleMoves)-1)];
        $this->moveTo($randomTurn); //Ходим в случайном направлении
    }

    private function canIMoveTo($move, $field)
    {
        if ($move['x'] != 0 &&
            $move['x'] != -1 &&
            $move['x'] != $field->width + 2 &&
            $move['x'] != $field->width + 1 &&
            $move['y'] != 0 &&
            $move['y'] != -1 &&
            $move['y'] != $field->height + 2 &&
            $move['y'] != $field->height + 1 &&
            $field->field[$move['y']][$move['x']] == '.') {
            return TRUE;
        } else {
            return FALSE;
        }
    }
}

class Field {
    public $field = array(); //Поле в двухмерном массиве
    public $width;  //Ширина поля
    public $height; //Высота поля

    public function __construct($width, $height) //Данные для создания поля
    {
        $this->width = $width;
        $this->height = $height;
    }

    private function createField() //Метод создания нового чистого поля
    {
        for ($i = 1; $i <= $this->height; $i++)
            for ($j = 1; $j <= $this->width; $j++) {
                $this->field[$i][$j] = ".";
            }
    }

    public function placeTheAnimals($game) //Метод расположения животных на поле
    {
        $this->createField();
        $i = 1; //переменная для идентификатора мышки на поле
        foreach ($game->mice as $mouse) {
            if ($mouse->x == NULL && $mouse->y == NULL) { //Если у мыши еще нет координат - выберутся случайные
                do {
                    $mouse->x = mt_rand(1, $this->width);
                    $mouse->y = mt_rand(1, $this->height);
                } while ($this->field[$mouse->y][$mouse->x] != ".");
                $mouse->body = $i++;
            }
            $this->field[$mouse->y][$mouse->x] = $mouse->body; //Расположение мыши на поле
        }
        foreach ($game->cats as $cat) {
            if ($cat->x == NULL && $cat->y == NULL) { //Если у кошки еще нет координат - выберутся случайные
                do {
                    $cat->x = mt_rand(1, $this->width);
                    $cat->y = mt_rand(1, $this->height);
                } while ($this->field[$cat->y][$cat->x] != ".");
            }
            $this->field[$cat->y][$cat->x] = $cat->body; //Расположение кошки на поле
        }
        foreach ($game->dogs as $dog) {
            if ($dog->x == NULL && $dog->y == NULL) { //Если у собаки еще нет координат - выберутся случайные
                do {
                    $dog->x = mt_rand(1, $this->width);
                    $dog->y = mt_rand(1, $this->height);
                } while ($this->field[$dog->y][$dog->x] != ".");
            }
            $this->field[$dog->y][$dog->x] = $dog->body; //Расположение собаки на поле
        }
    }
}

class Game
{
    //Правила
    public $mouseVision      = 4;  //дальность видимости мыши
    public $numberOfTurns    = 30; //количество ходов
    public $turnWhenCatSleep = 8;  //ход когда мышь засыпает
    public $mice = array();        //массивы объектов
    public $cats = array();
    public $dogs = array();

    public function __construct($mice, $cats, $dogs)
    {
        $this->mice = $mice;
        $this->cats = $cats;
        $this->dogs = $dogs;
    }

    public function start($field, $game)
    {
        for ($turn = 0; $turn <= ($this->numberOfTurns); $turn++) {
            /*Вывод поля *******************/
            $field->placeTheAnimals($game);
            $line = 0; //Номер линии
            $top  = 1; //Номер оси сверху
            if ($line == 0) {
                echo "   ";
                while ($top <= $field->width) {
                    if ($top < 10) { //Если число однозначное - два пробела
                        echo $top++ . "  ";
                    } else {
                        echo $top++  . " ";
                    }
                }
                echo "\n";
                $line++;
            }
            foreach ($field->field as $y) {
                if ($line < 10) { //Если число однозначное - два пробела
                    echo "$line  ";
                } else {
                    echo "$line ";
                }
                foreach ($y as $x) {
                    echo "{$x}  ";
                }
                if ($line == 1) {echo "   Ход: " . ($turn);}
                if ($line == 2) {echo "   Кошек: " . (count($this->cats));}
                if ($line == 3) {echo "   Мышей: " . (count($this->mice));}
                echo "\n";
                $line++;
            }
            if ($turn == $this->numberOfTurns) { //Если последний ход
                die("Конец игры!");
            }
            foreach ($game->mice as $mouse) { //Ходят мышки
                $mouse->tryToMove($field, $game);
                $field->placeTheAnimals($game); //Устанавливают свои новые координаты
            }
            foreach ($game->cats as $cat) {
                if (count($this->mice) == 0) { //Если всех мышек съели
                    die("Конец игры!");
                }
                if ($cat->body == "@") {
                    echo "Кошка $cat->name спит. Пропускает ход\n";
                    $field->placeTheAnimals($game); //Устанавливают свои новые координаты
                    $cat->movesInARow = 0; //Обнуляем счетчик ходов подряд
                    $cat->body = "K";      //Проснулись
                } else {
                    $cat->tryToMove($field, $game);
                    $field->placeTheAnimals($game);
                    $cat->movesInARow++; //Прибавляем счетчик ходов подряд
                }
                if ($this->turnWhenCatSleep == $cat->movesInARow) { //Если ходили указанное количество ходов подряд
                    $cat->body = "@"; //Спим
                }
            }
            foreach ($game->dogs as $dog) { //Ходят собаки
                $dog->tryToMove($field, $game);
                $field->placeTheAnimals($game); //Устанавливают свои новые координаты
            }


            echo "\n\n";
        }
    }

}

$field = new Field(11, 11);

$mouse1 = new Mouse("mouse1");
$mouse2 = new Mouse("mouse2");
$mouse3 = new Mouse("mouse3");
$cat1   = new Cat("cat1");
$cat2   = new Cat("cat2");
$dog1   = new Dog("dog1");
$dog2   = new Dog("dog2");

$mice   = array($mouse1, $mouse2, $mouse3);
$cats   = array($cat1, $cat2);
$dogs   = array($dog1, $dog2);

$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);

/*Тесты*/
//Тест на два огня
/*
$field  = new Field(5, 6);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 3;
$mouse1->body = 1;
$cat1   = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$cat2   = new Cat("cat2");
$cat2->x = 5;
$cat2->y = 3;
$mice   = array($mouse1);
$cats   = array($cat1, $cat2);
$dogs   = array();
$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);
*/
//Тест на пирамиду
/*
$field  = new Field(7, 7);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 4;
$mouse1->body = 1;
$cat1   = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$cat2   = new Cat("cat2");
$cat2->x = 2;
$cat2->y = 2;
$cat3   = new Cat("cat3");
$cat3->x = 3;
$cat3->y = 1;
$cat4   = new Cat("cat4");
$cat4->x = 4;
$cat4->y = 2;
$cat5   = new Cat("cat5");
$cat5->x = 5;
$cat5->y = 3;
$mice   = array($mouse1);
$cats   = array($cat1, $cat2, $cat3, $cat4, $cat5);
$dogs   = array();
$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);
*/
//Тест на два огня 2
/*
$field  = new Field(8, 8);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 4;
$mouse1->body = 1;
$cat1   = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$cat2   = new Cat("cat2");
$cat2->x = 5;
$cat2->y = 5;
$mice   = array($mouse1);
$cats   = array($cat1, $cat2);
$dogs   = array();
$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);
*/
//Тест на мышиную оборону
/*
$field  = new Field(3, 3);
$mouse1 = new Mouse("mouse1");
$mouse2 = new Mouse("mouse2");
$mouse3 = new Mouse("mouse3");
$cat1 = new Cat("cat1");
$mice = array($mouse1, $mouse2, $mouse3);
$cats = array($cat1);
$dogs = array();
$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);
*/
//Тест на невозможность хода мыши на клетку рядом с собакой
/*
$field  = new Field(3, 3);
$mouse1 = new Mouse("mouse1");
$mouse2 = new Mouse("mouse2");
$mouse3 = new Mouse("mouse3");
$dog1   = new Dog("dog1");
$cat1 = new Cat("cat1");
$mice = array($mouse1, $mouse2, $mouse3);
$cats = array($cat1);
$dogs = array($dog1);
$game = new Game($mice, $cats, $dogs);
$game->start($field, $game);
*/