Простейшая игра баттл на PHP

Есть одна интересная игра, написанная на PHP, которая будет не только увлекательная, но и полезная в усвоении ООП особенно для новичков. В этой игре мы рассмотрим интерфейсы, циклы, ну и конечно же объекты и классы.

Суть игры заключается в том, что есть некие существа имеющие определенное хп и они наносят по очереди друг-другу удары, тем самым уменьшая свое хп. Постепенно игроков-существ становится меньше, пока не останется один — победитель.

Итак, создаем интерфейс для наших существ:

interface IBeing
{
    public function getName();
    public function downXp($value);
    public function ISLive();
}

Далее создаем интерфейс для нашей битвы:

interface IBattle
{
    public function addBeing(IBeing $being);
    public function selected();
}

Вы спросите, а зачем впринципе нужны интерфейсы, мы могли бы обойтись и без них? Да, все верно, в любом проекте можно обойтись без интерфейсов. Согласно официальной документации интерфейсы объектов позволяют создавать код, который указывает, какие методы должен реализовать класс, без необходимости определять, как именно они должны быть реализованы. Тоесть, по сути интерфейсы необходимы для направления реализации того или иного проекта. Они помогают структурировать код.

Итак, полдела уже сделано, интерфейсы готовы, осталось только лишь их реализовать.

interface IBeing
{
    public function getName();
    public function downXp($value);
    public function ISLive();
}

class Being implements IBeing
{
    private $name;
    private $hp;

    public function __construct($name, $hp)
    {
        $this->name = $name;
        $this->hp = $hp;
    }

    public function hp(){
        return $this->hp;
    }
    public function ISLive()
    {
        return $this->hp > 0;
    }

    public function getName()
    {
        return $this->name;
    }

    public function downXp($value)
    {
        return $this->hp -= $value;
    }

}

interface IBattle
{
    public function addBeing(IBeing $being);
    public function selected();

}

class Battle implements IBattle
{
    public $i = 0;
    public $j = 1;
    public $beings = [];

    public function addBeing(IBeing $being)
    {
        return $this->beings[] = $being;
    }

    public function selected(){
        $con = count($this->beings);
        if($con == 1){
            echo 'Ура, ' . (array_pop($this->beings)->getName()).' - победил';
            return true;
        }

        if ($this->i <= $con) {
            if ($this->i == $con - 1) {
                $this->i = $con - 1;
                $this->j = 0;
            } elseif ($this->i == $con) {
                $this->i = 0;
                $this->j = 1;
            }
        } else {
            $this->i = $con - 1;
            $this->j = 0;
        }

        for ($i = 0; $i < $con; $i++){
            $attaker = $this->beings[$this->i];
            if ($this->i !== $this->j) {
                $loozer = $this->beings[$this->j]; //another random unique object

                $this->fight($attaker, $loozer);
            }
        }

    }

    private function fight($attaker,$loozer)
    {
        $hp=rand(1, 100);
        $loozer->downXp($hp);
        echo $attaker->getName().' бьет '. $loozer->getName().' на '. $hp.'хп, осталось ('.$loozer->hp(). ' хп)'."</br>";
        if (!$loozer->ISLive()){
            unset($this->beings[ array_search($loozer,$this->beings)]);
            sort($this->beings);
            echo $loozer->getName().' - был убит!'."</br>";
        }
        $this->i++;
        $this->j++;
        $this->selected();
    }
}
$being = new Being('Vital',300); // 1
$being1= new Being('Vova',300); // 2
$being2= new Being('Pasha',300); // 3
$battle = new Battle();
$battle->addBeing($being);
$battle->addBeing($being1);
$battle->addBeing($being2);
$battle->selected();

Вот и вся игра готова, в данной реализации каждый из существ бьет друг-друга по очереди, но это не совсем по-настоящему. В реальности все должно происходить в хаотичности. Необходимо сделать реализацию, что бы существа били себя рандомно. Это будет домашним задание. Решение дз можно скачать по ссылке.

Добавить комментарий