自动在地图上移动

时间:2019-01-09 23:23:12

标签: php algorithm oop

我有一张尺寸为(10,10)的地图。我用一个名为Map的对象表示它。我在位置(5,5)上有一个Monster。这个怪兽必须在每个$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 :(得分:2)

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(),则可以将其他属性设置为public,并在该函数中使用相同的逻辑。