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

时间:2010-08-23 13:59:14

标签: php oop class

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

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

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

感谢任何帮助。

5 个答案:

答案 0 :(得分:11)

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

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

修改 Orc将扩展Monster,然后继承属性$ health和function attack()。

答案 1 :(得分: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
{
}

抽象类的基本布局如下:

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.
}

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

之类的事情
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.
    }
}

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

您还可以设置父析构函数以将用户名数据保存到数据库中,并使用__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.
}

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.
      }
   }
}

这里的例子来自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"
*/

?>

答案 2 :(得分:4)

类是关于行为的,所以如果游戏中不同类型的怪物表现不同,那么将它们建模为不同的对象。如果所有怪物基本上共享相同的行为(例如,所有怪物都具有共享属性集,所有怪物都可以攻击或防御并移动),那么如果将它们建模为单个怪物类,则可以节省大量工作。你总是可以将怪物类扩展为专门的类,例如,可以说话的怪物。

答案 3 :(得分:3)

OOP允许您扩展类,重用代码。这是一个简单的例子。查看Inheritance的PHP文档。

class Monster
{
  public $size = 'average';
  public $color = 'grey';

  public function scare()
  {
    return "Bo!";
  }
}

class Rat extends Monster
{
  public $size = 'small';

  public function scare()
  {
    return parent::scare() . " (runs away)";
  }
}

class Mouse extends Rat 
{
  public $color = 'white';
}

输出结果为:

$rat = new Rat();
echo $rat->scare(); //output: Bo! (runs away)
echo $rat->size;    //output: small
echo $rat->color;   //output: grey

答案 4 :(得分:2)

您应该阅读S.O.L.I.D 这些是OOD(面向对象设计)的5个基本原则:

S ingle责任原则
O 笔封闭原则
L iskov替代原则
nterface隔离原则
D 依赖倒置原则

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

顺便说一句,如果您只想使用继承来扩展某些属性和方法,可以使用Composition instead of Inheritance来实现。继承应该用于向类结构添加多态行为。