我应该为游戏使用多个课吗?

Sal*_*ara 11 php oop class

我正在考虑在PHP中创建一个基于文本的RPG类型程序作为假日项目,并有机会了解有关PHP和OOP的更多信息.(也许不是语言的最佳选择,我知道,但我不想在与OOP同时从头开始学习另一种语言.)

无论如何,我只是开始设计过程并思考'怪物'.每个怪物类型(你知道,兽人,地精,老鼠等)将拥有自己的统计数据,技能和不具备的数据.起初我虽然我可以只有一个怪物类,并在实例化对象时设置属性.但后来我觉得这可能有点低效,所以我正在考虑为每种类型的怪物准备一个课程.

考虑到每个类中的方法可能是相同的,这是解决问题的最佳方法吗?做一些我还不知道的更好的方法吗?

任何帮助表示赞赏.

Aar*_*way 11

您可以创建一个抽象类,比如Monster,然后为每个不同类型的怪物扩展该类.所以

<?php
abstract class Monster {
  private $health;
  public function attack() {
    //do stuff
  }
}
class Orc extends Monster {
  private $damage_bonus;
}
?>
Run Code Online (Sandbox Code Playgroud)

编辑 Orc将扩展Monster,然后继承属性$ health和function attack().

  • 这不是一种可维护的方法.想象一下,你已经拥有Orc,OrcShaman(可以使用castSpell(),但健康状况较差)和OrcChieftain(可以踢()并获得健康奖励)然后决定你也想要OrcShamanChieftain.然后你将复制kick()和castSpell()以及stat bonus修饰符.然后你介绍一个OrcWarlord(可以使用kick(),warcry()并且还有更多的健康和伤害奖励).你想要OrcShamanWarlord ..看看结束的地方?到处重复代码.最好使用装饰器和策略模式并使用复合怪物. (6认同)

Rob*_*itt 9

你应该做的是让一些真正的组织进入游戏.

我以前从未构建过PHP游戏,但我非常清楚结构应该如何.

实体/怪物应该由几个定义其特征的类构成

这是我头脑中的一个小例子:

abstract class NonHuman implements Strengh,Weapons,Vehicles
{
     var $strength;
}
abstract class Vermin implements Strengh,Chemicals
{
    var $strength = 20;
    var $poisonous = true;
}
abstract class Humanoid implements Strengh,Weapons,Vehicles,Arms,Legs
{
}
Run Code Online (Sandbox Code Playgroud)

抽象类的基本布局如下:

abstract class <BeingType> implements < Characteristics , Weapons , Etc>
{
    // Depending on < Characteristics , Weapons , Etc> you should
    // Build the methods here so that theres less work in the long run.
}
Run Code Online (Sandbox Code Playgroud)

然后,一旦你有你的基础类型,你可以做的事情

class Rat extends Vermin
{
    public function __construct($name,$strength = 50)
    {
         $this->strength = $strength;
    }

    //Any new methods here would be specific to this Being / Rat.
}

$Robert = new Rat('Robert',80);
$Andrew = new Rat('Andrew',22);

if($Robert->strength > 50)
{
    $Robert->Kick($Andrew,'left',20); //20 mph lol
    if($Andrew->IsAlive())
    {
        if($Robert->TakeWeapon($Andrew,20)) //Uses 20% force
        {
             $Robert->FireWeaponAt($Andrew,-1); //Use all bullets on andrew!
        }
    }
    if(!$Andrew->IsAlive())
    {
        $Robert->UpdateScoreFromPLayer($Andrew,100); //Max of 100 points if andrew has them.
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,为实体生成特征并不困难.

您还可以设置父析构函数以将用户名数据保存到数据库中,并使用__construct更新类数据.希望这能给你一个好主意:)


还有更多 :)

如果你为SpecialMoves上课,可以说你可以随时做

$Robert->AddSpecialMove('Roundhouse',new SpecialMove_Roundhouse(12));
$Robert->UserSpecialMove('Roundhouse',2);/ x2
if($Robert->_SpecialMoves->Roundhouse->Left() < 12)
{
    $Robert->UserSpecialMove('Roundhouse',-1);/ Use all kicks.
}
Run Code Online (Sandbox Code Playgroud)

SpecialMove_Roundhouse它内部会有诸如损坏,完成时间长度,使用多少能量,使用多少次等参数.

并且在范围内的第一堂课应该总是我的计算器,如心率,血液水平,能量,库存等,所以你总是有必需品!


实现示例

实现确保更高级别包含某些函数和变量

interface Weapons
{
    public function Fire($target,$bullets);
}

class Colt45 implements Weapons
{
   var $damage = 2;
   var $max_bullets = 80;
   var $clip = 80;

   //THIS CLASS MUST HAVE FIRE
   public function fire($target,$bullets)
   {
      $ammo = $bullets > $clip ? $clip : $ammo;
      for($shot=0;$shot<=$ammo;$shot++)
      {
          $target->ReduceHealth($damage);
          if(!$target->IsAlive())
          {
              break;
          }
          $clip--; //Reduce ammo in clip.
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

这里的例子来自php.net | http://www.php.net/manual/en/language.oop5.interfaces.php#96368

<?php

interface Auxiliary_Platform
{
    public function Weapon();
    public function Health();
    public function Shields();
}

class T805 implements Auxiliary_Platform
{
    public function Weapon()
    {
        var_dump(__CLASS__);
    }
    public function Health()
    {
        var_dump(__CLASS__ . "::" . __FUNCTION__);
    }
    public function Shields()
    {
        var_dump(__CLASS__ . "->" . __FUNCTION__);
    }
}

class T806 extends T805 implements Auxiliary_Platform
{
    public function Weapon()
    {
        var_dump(__CLASS__);
    }
    public function Shields()
    {
        var_dump(__CLASS__ . "->" . __FUNCTION__);
    }
}

$T805 = new T805();
$T805->Weapon();
$T805->Health();
$T805->Shields();

echo "<hr />";

$T806 = new T806();
$T806->Weapon();
$T806->Health();
$T806->Shields();

/* Output:
    string(4) "T805"
    string(12) "T805::Health"
    string(13) "T805->Shields"
    <hr />string(4) "T806"
    string(12) "T805::Health"
    string(13) "T806->Shields"
*/

?>
Run Code Online (Sandbox Code Playgroud)