Автоматическое перемещение по карте - PullRequest
0 голосов
/ 10 января 2019

У меня есть карта размером (10,10). Я представляю его объектом под названием Map. У меня есть Monster на этой позиции (5,5). Этот монстр должен автоматически менять положение на каждом $turn и зависеть от $nbMove. $nbMove является атрибутом класса Monster Вы выбираете его в конструкторе Monster.

$nbMove - число ходов до того, как он сделает пол-оборота

Вот пример того, что я хочу, когда начинается игра:

Игра в цикле for($turn = 0; $turn<10; $turn++)

То есть, если $nbMove равно 2. Монстр переходит к случаю (5,6), затем $turn, он переходит к (5,7), затем $turn возвращается к (5, 6) и следующий $turn (5,5). следующий $turn (5,6), следующий $turn (5,7), следующий $turn (5,6) и т. д. ...

То есть, если $nbMove равно 3. Монстр переходит к случаю (5,6), следующий $turn он переходит к (5,7), следующий $turn он переходит к (5,8) ) и следующее $turn (5,7), следующее $turn (5,6), следующее $turn (5,5) и т. д. ...

Он должен идти только по вертикали.

Это похоже на шахматный ход, но он выполняется компьютером и всегда делает одно и то же. Вот мой код:

<?php 

class Monster { 
  public $horizontal;
  public $vertical;
  public $nbMove;

  function __construct($horizontal, $vertical, $nbMove) {
    $this->horizontal = $horizontal;
    $this->vertical = $vertical;
    $this->nbMove = $nbMove;
  } 
}

?>
<?php 

class Map { 
  public $width;
  public $height;

  function __construct($width, $height) {
    $this->width = $width;
    $this->height = $height;
  } 
}

?>
<?php

function moveMonster($turn, $monster, $map) {
  // The move 
  if(// I need a condition there but what condition ??) {
    $orc->vertical = $orc->vertical + 1;
  } else {
    $orc->vertical = $orc->vertical - 1;
  }
}

$map = new Map(10,10);
$firstMonster = new Monster(5,5,2);

for($turn = 0; $turn<10; $turn++){
  moveMonster($turn, $firstMonster, $map);
}

?>

Я ищу, как заставить моего монстра двигаться, но я не нахожу никакого решения, чтобы это сделать Вот почему я прошу вас решить мою проблему. Я знаю, как заставить его двигаться, но это должно зависеть от числа $turn и $firstMonster->nbMove, я думаю.

1 Ответ

0 голосов
/ 10 января 2019

Monster должен иметь возможность отслеживать не только свою текущую позицию, но и то, как далеко он может идти в любом направлении и в каком направлении он движется в данный момент. Если у вас нет способа сохранить это состояние, то, как только вы переместите его в первый раз, вы потеряете исходную позицию Y и не сможете узнать, находитесь ли вы в пределах $nbMove ходов это или вы движетесь к нему или от него.

Если мы добавим еще несколько свойств к Monster, чтобы определить их и установить их в конструкторе, тогда ему будет легко перемещаться в пределах его определенной границы и изменять направление, когда он достигает края границы.

class Monster {
    public $horizontal;
    public $vertical;
    public $nbMove;

    private $minY;
    private $maxY;
    private $direction;

    function __construct($horizontal, $vertical, $nbMove) {
        $this->horizontal = $horizontal;
        $this->vertical = $vertical;
        $this->nbMove = $nbMove;

        $this->minY = $vertical;
        $this->maxY = $vertical + $nbMove;
        $this->direction = 1;
    }

    function move() {
        // if at the top of the movement range, set the direction to down
        if ($this->vertical == $this->maxY) {
            $this->direction = -1;
        }
        // if at the bottom of the movement range, set the direction to up
        if ($this->vertical == $this->minY) {
            $this->direction = 1;
        }
        // then move
        $this->vertical += $this->direction;
    }
}

Я показал move() здесь как метод Monster, потому что я думал, что это кажется более уместным, поскольку перемещение будет чем-то, что Monster делает. Если вы сделаете это таким образом, вы вызовете $firstMonster->move() в цикле вместо глобальной функции moveMonster().

Если вам нужно использовать moveMonster(), вы можете установить эти другие свойства как общедоступные и использовать ту же логику в этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...