<?php
abstract class Animal
{
public $symbol; //символ на карте
public $x; //координата
public $y; //координата
public $name; //имя животного
public $field; //карта класса FIeld
public $vision; //дальность обзора
abstract protected function tryToMove();
//Называем животное
public function __construct($name)
{
$this->name = $name;
}
//Метод возвращения символа для вывода на карте
public function getSymbol()
{
return $this->symbol;
}
//Метод передвижения в определенную координату
protected function moveTo($x, $y)
{
echo "Я, {$this->name}, хожу x:{$x}, y:{$y}.\n";
$this->x = $x;
$this->y = $y;
}
//Метод случайного хода без обдумывания побега или охоты
protected function freeMove($possibleMoves)
{
//Выбираем случайный ход из возможных
$randomTurn = $possibleMoves[mt_rand(0, count($possibleMoves) - 1)]; //Ходим
$this->moveTo($randomTurn['x'], $randomTurn['y']);
}
}
class Mouse extends Animal
{
public $symbol; //символ на карте
public $x; //координата
public $y; //координата
public $name; //имя животного
public $field; //карта класса Field
public $vision = 4; //дальность обзора
//Метод хода
public function tryToMove()
{
//Ищем животное в дальности обзора
$foundAnimals = $this->field->searchForAnimals($this->x, $this->y, $this->vision);
//Ищем возможные ходы
$possibleMoves = $this->searchPossibleMoves();
//Если нельзя сдвинуться - стоим
if (count($possibleMoves) == 0) { echo "Стою на месте.\n";
//Если нашли кошку - убегаем
} elseif ($foundAnimals["cats"] != NULL) {
echo "У мышки {$this->name} рядом кошка. ";
$bestMove = $this->searchBestMove($foundAnimals, $possibleMoves);
$this->moveTo($bestMove['x'], $bestMove['y']);
} else {
echo "Кошек рядом нет. ";
$this->freeMove($possibleMoves);
}
}
//Метод поиска возможных ходов
public function searchPossibleMoves()
{
//Возможые ходы для мышки (4 стороны)
$possibleMoves = array(); $arrows["up"] = array('x' => $this->x, 'y' => $this->y - 1); $arrows["right"] = array('x' => $this->x + 1, 'y' => $this->y); $arrows["down"] = array('x' => $this->x, 'y' => $this->y + 1); $arrows["left"] = array('x' => $this->x - 1, 'y' => $this->y); foreach ($arrows as $arrow) {
//Отсеиваем невозможные ходы (ход за карту, ход на собрата мыша или панибрата собаку)
if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
$possibleMoves[] = $arrow;
}
}
//Возвращаем результат
return $possibleMoves;
}
//Метод поиска лучшего хода
private function searchBestMove($foundAnimals, $possibleMoves)
{
//Очки за лучшиий за ход мыши. -1 из-за случаев когда лучший ход приносит 0 баллов
$pointsMax = -1;
foreach ($possibleMoves as $move)
{
$points = $this->countPoints($foundAnimals, $move);
if ($points > $pointsMax) {
$pointsMax = $points;
$bestMove = $move;
}
}
//Возвращаем лучший ход
return $bestMove;
}
//Метод подсчета очков за ход
private function countPoints ($foundAnimals, $move)
{
/**
* Оценка каждого хода.
* Приоритет 1: Количество клеток до врага. Их должно быть как можно больше. Коэффициент 100
* Приоритет 2: Количество клеток до ближайшего угла. Как можно больше, чтобы не забиться в угол. Коэфициент 10
* Приоритет 3: Количество клеток до собаки. Может стать приоритетом 2 в ситуации когда только собака может спасти от съедения кошкой
*/
//Ищем ближайшего врага и считаем шаги до него
$nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
$stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
//Не даем очки, если один шаг чтобы этот ход был максимально плохим вариантом
if ($stepsToEnemy == 1) {
$pointsForEnemy = 0;
} else {
$pointsForEnemy = $stepsToEnemy * 100;
}
//Если есть рядом собаки - используем их в плане побега
if ($foundAnimals["dogs"] != NULL) {
//Ищем ближайшую собаку и считаем ходы до нее
$nearbyDog = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["cats"]);
$stepsToDog = $this->field->countSteps($move['x'], $move['y'], $nearbyDog->x, $nearbyDog->y);
//Тот случай когда собака становится приоритетом 2, потому что может спасти мышку
if ($stepsToDog == 1 && $stepsToEnemy == 1) {
$pointsForDog = 90;
//В остальных случаях это наименьший по очкам приоритет
} else{
$pointsForDog = $this->field->getWidth() - $stepsToDog;
}
//Если собак нету - не даем очков
} else {
$pointsForDog = 0;
}
//Считаем очки за степень приближения к ближайшему краю, стараемся быть дальше от него
$pointsForCorner = $this->field->searchNearCorner($move['x'], $move['y']) * 10;
//Считаем общее число очков за ход
$points = $pointsForEnemy + $pointsForDog + $pointsForCorner;
//Если этот ход обогнал лучший результат - он становится лучшим ходом
return $points;
}
}
class Cat extends Animal
{
public $symbol = "K"; //символ на карте(для кошки еще состояние активности)
public $x; //координата
public $y; //координата
public $name; //имя животного
public $field; //карта класса Field
public $vision; //дальность обзора
public $movesInARow = 0; //кол-во ходов подряд
private $turnWhenCatSleep = 8; //правило "на каком ходу подряд кошка засыпает"
//Метод хода
public function tryToMove()
{
//Если кошка спит
if ($this->symbol == "@") {
//Она просыпается
$this->symbol = "K";
//Cчетчик ходов обнуляется
$this->movesInARow = 0;
echo "Кошка спит :3\n";
//Следующий ход
return;
//Если ходили n-ое кол-во ходов подряд - спим
} elseif($this->movesInARow == $this->turnWhenCatSleep) {
$this->symbol = "@";
}
//Ищем животное в дальности обзора
$foundAnimals = $this->field->searchForAnimals($this->x, $this->y, $this->vision);
//Присваиваем полям найденные результаты
//Ищем возможные ходы
$possibleMoves = $this->searchPossibleMoves($foundAnimals);
//Если нельзя сдвинуться - стоим
if (count($possibleMoves) == 0) { echo "Стою на месте.\n";
} else {
//Ищем лучший ход
$bestMove = $this->searchBestMove($foundAnimals, $possibleMoves);
//Если можно съесть мышь по данным координатам - едим
if ($this->canIEatIt($bestMove['x'], $bestMove['y'], $foundAnimals)) {
$this->eatIt($bestMove['x'], $bestMove['y']);
//В остальных случаях - ходим туда
} else {
$this->moveTo($bestMove['x'], $bestMove['y']);
}
//Прибавляем счетчик ходов подряд
$this->movesInARow++;
}
}
//Метод поиска возможных ходов
public function searchPossibleMoves($foundAnimals)
{
$possibleMoves = array(); //Возможые ходы для кошки (8 сторон);
$arrows["up"] = array('x' => $this->x, 'y' => $this->y - 1); $arrows["up-right"] = array('x' => $this->x + 1, 'y' => $this->y - 1); $arrows["right"] = array('x' => $this->x + 1, 'y' => $this->y); $arrows["right-down"] = array('x' => $this->x + 1, 'y' => $this->y + 1); $arrows["down"] = array('x' => $this->x, 'y' => $this->y + 1); $arrows["down-left"] = array('x' => $this->x - 1, 'y' => $this->y + 1); $arrows["left"] = array('x' => $this->x - 1, 'y' => $this->y); $arrows["left-up"] = array('x' => $this->x - 1, 'y' => $this->y - 1); foreach ($arrows as $arrow) {
//Если на этой клетке собака - сразу отбрасываем этот ход
if (!$this->field->areChosenAnimalsNearTheCage($arrow['x'], $arrow['y'], $foundAnimals["dogs"])) {
//Если там можно съесть мышь или походить - это возможных ход
if ($this->canIEatIt($arrow['x'], $arrow['y'], $foundAnimals)) {
$possibleMoves[] = $arrow;
} elseif ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
$possibleMoves[] = $arrow;
}
}
}
//Возвращаем результат
return $possibleMoves;
}
//Метод поиска лучшего хода
private function searchBestMove($foundAnimals, $possibleMoves)
{
//Очки за лучшиий за ход мыши. -1 из-за случаев когда лучший ход приносит 0 баллов
$pointsMax = -1;
foreach ($possibleMoves as $move) {
$points = $this->countPoints($foundAnimals, $move);
if ($points > $pointsMax) {
$pointsMax = $points;
$bestMove = $move;
}
}
//Возвращаем результат
return $bestMove;
}
//Метод подсчета очков за ход
private function countPoints($foundAnimals, $move)
{
/**
* Приоритет 1: Мышку можно съесть. 9999 очков
* Приоритет 2: Количество клеток до врага. Их должно быть как можно меньше. Коэффициент 100.
* Приоритет 3: Количество клеток до одной линии с мышью, удобная позиция для зажатия в угол.
*/
//Ищем ближайшего врага и считаем шаги до него
$nearbyEnemy = $this->field->searchNearbyAnimal($move['x'], $move['y'], $foundAnimals["mice"]);
$stepsToEnemy = $this->field->countSteps($move['x'], $move['y'], $nearbyEnemy->x, $nearbyEnemy->y);
//Если можно съесть мышь по указанным координатам - это однозначно лучший ход
if ($this->canIEatIt($move['x'], $move['y'], $foundAnimals)) {
$pointsForEnemy = 9999;
} else {
$pointsForEnemy = ($this->field->getWidth() - $stepsToEnemy) * 100;
}
//Если кошка на одной линии с мышкой
if ($move['x'] == $nearbyEnemy->x || $move['y'] == $nearbyEnemy->y) {
$pointsForOneLine = 99;
//Если нет
} else {
$pointsForOneLine = $this->field->getWidth() - abs(min($move['x'] - $nearbyEnemy->x, $move['y'] - $nearbyEnemy->y)); }
//Считаем общее очков за ход
$points = $pointsForEnemy + $pointsForOneLine;
//Если этот ход обогнал лучший результат - он становится лучшим ходом
return $points;
}
//Метод возможности съедения мышки по данным координатам
private function canIEatIt($x, $y, $foundAnimals)
{
//Если там мышка - очевидно возомжно, но еще не можно
if ($this->field->getAnimal($x, $y) instanceof Mouse) {
//Обнажили зубки
echo "Пытаюсь съесть {$this->field->getAnimal($x, $y)->name}. ";
//В переменной oneLine считаем количество мышей которые рядом с друг другом
$oneLine = 0;
foreach ($foundAnimals["mice"] as $mouse) {
if ($this->field->areChosenAnimalsNearTheCage($mouse->x, $mouse->y, $foundAnimals["mice"])) {
$oneLine++;
}
}
//Если их меньше трех - омномном
if ($oneLine < 3) {
return TRUE;
//Если больше - мы грустим
} else {
echo "Мыши защищают друг друга. ";
return FALSE;
}
//Если там мышки нет - не можем
} else {
return FALSE;
}
}
//Метод поедения несчастного объекта
private function eatIt ($x, $y)
{
//Удаление элемента массива по значению
if(($key = array_search($this->field->getAnimal($x, $y), $this->field->animals)) !== FALSE){ unset($this->field->animals[$key]); }
//Ход на освободившуюся клетку
$this->moveTo($x, $y);
//Переход в спящий режим
$this->symbol = "@";
}
}
class Dog extends Animal {
public $symbol = "D"; //символ на карте(для кошки еще состояние активности)
public $x; //координата
public $y; //координата
public $name; //имя животного
public $field; //карта класса Field
//Метод хода
public function tryToMove()
{
//Ищем возможные ходы
$possibleMoves = $this->searchPossibleMoves();
//Если нельзя сдвинуться - стоим
if (count($possibleMoves) == 0) { echo "Ходить $this->name некуда.\n";
//Если можно сдвинуться - ходим, как ни странно
} else {
$this->freeMove($possibleMoves);
}
}
//Метод поиска возможных ходов
public function searchPossibleMoves()
{
$possibleMoves = array(); //Возможые ходы для собаки (8 сторон)
$arrows["up"] = array('x' => $this->x, 'y' => $this->y-2); $arrows["up-right"] = array('x' => $this->x+2, 'y' => $this->y-2); $arrows["right"] = array('x' => $this->x+2, 'y' => $this->y); $arrows["right-down"] = array('x' => $this->x+2, 'y' => $this->y+2); $arrows["down"] = array('x' => $this->x, 'y' => $this->y+2); $arrows["down-left"] = array('x' => $this->x-2, 'y' => $this->y+2); $arrows["left"] = array('x' => $this->x-2, 'y' => $this->y); $arrows["left-up"] = array('x' => $this->x-2, 'y' => $this->y-2); foreach ($arrows as $arrow) {
//Отсеиваем невозможные ходы (ход за карту, ход на собрата собаку или противного мыша)
if ($this->field->canIMoveTo($arrow['x'], $arrow['y'])) {
$possibleMoves[] = $arrow;
}
}
//Возвращаем результат
return $possibleMoves;
}
}
class Field {
private $width; //ширина
private $height; //высота
private $numberOfTurns = 30; //количество ходов
public $animals = array(); //массив животных
//Задаем ширину, высоту
public function __construct($width, $height)
{
$this->width = $width;
$this->height = $height;
}
//Метод размещения животного на карте
public function addAnimal(Field $field, Animal $animal)
{
//Добавляем животное в список
$this->animals[] = $animal;
//Счетчик для различия мышей на карте
static $i = 1;
//Передаем карту в поле животного как советовал мудрый ОП
$animal->field = $field;
//Если животное - кошка, делаем ей максимальную дальность обзора
if ($animal instanceof Cat) {
$animal->vision = $this->width;
}
//Координаты могут быть заняты, если мы вручную их забиваем
if ($animal->x == NULL && $animal->y == NULL) {
//Рандомим пока не найдем пустую клетку
do {
} while ($this->isCageClose($x, $y));
//Инициализурем удачные координаты
$animal->x = $x;
$animal->y = $y;
//Увеличиваем счетчик для символа на карте
if ($animal instanceof Mouse) {
$animal->symbol = $i++;
}
}
}
//Метод определения возможности животного походить по указанным координатам
public function canIMoveTo($x, $y)
{
//Если хочет сбежать за пределы карты или клетка занята - нет
if ($x < 1 ||
$y < 1 ||
$x > $this->width ||
$y > $this->height ||
$this->isCageClose($x, $y)) {
return FALSE;
} else {
return TRUE;
}
}
//Метод поиска ближайшего угла
public function searchNearCorner($x, $y)
{
//Находимся ли мы слева от центра или справа, вверху или внизу
$stepsToCornerX = ($x < $this->width/2) ? $x - 1 : $this->width - $x;
$stepsToCornerY = ($y < $this->height/2) ? $y - 1 : $this->height - $y;
return min($stepsToCornerX, $stepsToCornerY); }
//Метод определяющий занятость клетки
private function isCageClose($x, $y)
{
foreach ($this->animals as $animal)
{
if ($x == $animal->x && $y == $animal->y) {
return True;
}
}
return False;
}
//Метод получения объекта по координатам из массива животных
public function getAnimal ($x, $y)
{
foreach ($this->animals as $animal)
{
if ($x == $animal->x && $y == $animal->y) {
return $animal;
}
}
}
//Метод вывода карты
private function showField($turn)
{
//Номер координаты на оси Y
$line = 0;
//Номер координаты на оси X
$top = 1;
//Выводим ось X
//Если первая строка
if ($line == 0) {
//Три пробела
echo " ";
while ($top <= $this->width) {
//А потом печатаем цифры и пробелы
if ($top < 10) {
//Два для двухзначных чисел
echo $top++ . " ";
//Один для однозначных
} else {
echo $top++ . " ";
}
}
//Следующая строка
$line++;
echo "\n";
}
//Выводим ось Y
for ($i = 1; $i <= $this->height; $i++) {
//Если число однозачное - два пробела
if ($line < 10) {
echo "$line ";
//Если число двухзначное - один пробел
} else {
echo "$line ";
}
//Выводим карту
for($j = 1; $j <= $this->width; $j++) {
//Если клетка ззанята - выводим символ животного
if ($this->isCageClose($j, $i)) {
echo "{$this->getAnimal($j, $i)->getSymbol()} ";
//Если клетка пустая - выводим ее в форме точки
} else {
echo ". ";
}
}
//Выводи дополнительные данные рядом с определенной строкой
if ($line == 1) echo " Ход: {$turn}";
if ($line == 2) echo " Мышек: {$this->countAnimals('Mouse')}";
if ($line == 3) echo " Кошек: {$this->countAnimals('Cat')}";
if ($line == 4) echo " Собак: {$this->countAnimals('Dog')}";
//Следующая строка
$line++;
echo "\n";
}
}
//Метод игры
public function startGame(Field $field)
{
//Делаем заданное заранее количество ходов
for ($turn = 0; $turn <= ($this->numberOfTurns); $turn++) {
//Выводим поле
$this->showfield($turn);
//Каждое животное делает ход
foreach ($this->animals as &$animal) {
//Так как в цикле foreach копия массива надо проверять данные с изменениями
//Животное делает ход
$animal->tryToMove();
//Если всех мышей съели - конец игры
if ($this->countAnimals("Mouse") == 0) {
}
}
echo "\n";
}
}
//Метод поиска животных в определенном обзоре
public function searchForAnimals($x, $y, $vision)
{
$foundAnimals = array("mice" => NULL, "cats" => NULL, "dogs" => NULL); //Обзор не должен выходить за пределы карты, в этом случае крайней точкой обзора будет край карты
for ($i = max($y - $vision, 1), $k = min($y + $vision, $this->height); $i <= $k; $i++) { //Проходим во вложенном цикле по воображаемому квадрату обзора, животное в центре
for ($j = max($x - $vision, 1), $l = min($x + $vision, $this->width); $j <= $l; $j++) { //Если мы увидели свои координаты - не добавляем их в результат
if ($i == $y && $j == $x) {
continue;
//В остальных случаев записываем увиденных животных в массив
} elseif ($this->getAnimal($j, $i) instanceof Mouse) {
$foundAnimals["mice"][] = $this->getAnimal($j, $i);
} elseif ($this->getAnimal($j, $i) instanceof Cat) {
$foundAnimals["cats"][] = $this->getAnimal($j, $i);
} elseif ($this->getAnimal($j, $i) instanceof Dog) {
$foundAnimals["dogs"][] = $this->getAnimal($j, $i);
}
}
}
//Возвращаем результат
return $foundAnimals;
}
//Метод подсчета животных. Считает определенных животных
private function countAnimals($nameOfTheAnimal)
{
$counter = 0;
//Если нужное животное есть в массиве - прибавляем счетчик
foreach ($this->animals as $animal) {
if ($animal instanceof $nameOfTheAnimal) {
$counter++;
}
}
return $counter;
}
//Возвращаем private поле с длинной карты
public function getWidth()
{
return $this->width;
}
//Возвращаем private поле с высотой карты
public function getHeight()
{
return $this->height;
}
//Метод определяющий наличие опреденного вида животных с данными координатами
public function areChosenAnimalsNearTheCage
($x, $y, array $animals) {
foreach ($animals as $animal)
{
//Наши координаты не влияют на ответ на поставленный вопрос
if ($animal->x == $x && $animal->y == $y) {
continue;
}
//Если количество шагов до животного равно одному, ответ - да
if($this->countSteps($x, $y, $animal->x, $animal->y) == 1) {
return TRUE;
}
}
//В остальных случаях ответ - нет
return FALSE;
}
//Метод подсчета шагов между двумя точками
public function countSteps($point1X, $point1Y, $point2X, $point2Y)
{
//Подсчет шагов по оси X
$countStepsX = abs($point1X - $point2X); //ПОдсчет шагов по оси Y
$countStepsY = abs($point1Y - $point2Y); //Возвращаем наибольшее
return max($countStepsX, $countStepsY); }
//Метод нахождения ближайшего животного из определенного массива
public function searchNearbyAnimal
($x, $y, array $animals) {
//Лучший результат по умолчанию
$stepsNearestAnimal = 1000;
foreach ($animals as $animal) {
//Считаем шаги между животным и координатами
$countSteps = $this->countSteps($x, $y, $animal->x, $animal->y);
//Если меньше лучшего результата - это лучший результат
if ($countSteps < $stepsNearestAnimal) {
$nearbyAnimal = $animal;
$stepsNearestAnimal = $countSteps;
//Если на одном расстоянии с результатом - продалжаем поиск
} elseif ($countSteps == $stepsNearestAnimal) {
continue;
}
}
//Возвращаем ближайшее животное
return $nearbyAnimal;
}
}
//Создаем карту
$field = new Field(10,10);
//Создаем и именум зверье
$mouse1 = new Mouse("mouse1");
$field->addAnimal($field, $mouse1);
$mouse2 = new Mouse("mouse2");
$field->addAnimal($field, $mouse2);
$mouse3 = new Mouse("mouse3");
$field->addAnimal($field, $mouse3);
$cat1 = new Cat("cat1");
$field->addAnimal($field, $cat1);
$cat2 = new Cat("cat2");
$field->addAnimal($field, $cat2);
$dog1 = new Dog("dog1");
$field->addAnimal($field, $dog1);
$dog2 = new Dog("dog2");
$field->addAnimal($field, $dog2);
//Начинаем игру
$field->startGame($field);
//Тест на два огня
/**
$field = new Field(5, 6);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 3;
$mouse1->symbol = 1;
$field->addAnimal($field, $mouse1);
$cat1 = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$field->addAnimal($field, $cat1);
$cat2 = new Cat("cat2");
$cat2->x = 5;
$cat2->y = 3;
$field->addAnimal($field, $cat2);
$dog1 = new Dog("dog1");
$dog1->x = 5;
$dog1->y = 6;
$field->addAnimal($field, $dog1);
$field->startGame($field);
*/
//Тест на мышинную оборону
/**
$field = new Field(10, 10);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 1;
$mouse1->y = 1;
$mouse1->symbol = 1;
$field->addAnimal($field, $mouse1);
$mouse2 = new Mouse("mouse2");
$mouse2->x = 2;
$mouse2->y = 2;
$mouse2->symbol = 2;
$field->addAnimal($field, $mouse2);
$mouse3 = new Mouse("mouse3");
$mouse3->x = 3;
$mouse3->y = 3;
$mouse3->symbol = 3;
$field->addAnimal($field, $mouse3);
$cat1 = new Cat("cat1");
$cat1->x = 2;
$cat1->y = 1;
$field->addAnimal($field, $cat1);
$dog1 = new Dog("dog1");
$dog1->x = 5;
$dog1->y = 5;
$field->addAnimal($field, $dog1);
$field->startGame($field);
*/
//Тест на пирамиду котов
/**
$field = new Field(7, 7);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 4;
$mouse1->symbol = 1;
$field->addAnimal($field, $mouse1);
$cat1 = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$field->addAnimal($field, $cat1);
$cat2 = new Cat("cat2");
$cat2->x = 2;
$cat2->y = 2;
$field->addAnimal($field, $cat2);
$cat3 = new Cat("cat3");
$cat3->x = 3;
$cat3->y = 1;
$field->addAnimal($field, $cat3);
$cat4 = new Cat("cat4");
$cat4->x = 4;
$cat4->y = 2;
$field->addAnimal($field, $cat4);
$cat5 = new Cat("cat5");
$cat5->x = 5;
$cat5->y = 3;
$field->addAnimal($field, $cat5);
$dog1 = new Dog("dog1");
$dog1->x = 7;
$dog1->y = 7;
$field->addAnimal($field, $dog1);
$field->startGame($field);
*/
//Тест на два огня #2
/**
$field = new Field(8, 8);
$mouse1 = new Mouse("mouse1");
$mouse1->x = 3;
$mouse1->y = 4;
$mouse1->symbol = 1;
$field->addAnimal($field, $mouse1);
$cat1 = new Cat("cat1");
$cat1->x = 1;
$cat1->y = 3;
$field->addAnimal($field, $cat1);
$cat2 = new Cat("cat2");
$cat2->x = 5;
$cat2->y = 5;
$field->addAnimal($field, $cat2);
$dog1 = new Dog("dog1");
$dog1->x = 8;
$dog1->y = 8;
$field->addAnimal($field, $dog1);
$field->startGame($field);
*/