我正在考虑在PHP中创建一个基于文本的RPG类型程序作为假日项目,并有机会了解有关PHP和OOP的更多信息。 (我知道,也许不是语言的最佳选择,但我不想在与OOP同时从头开始学习另一种语言。)
无论如何,我只是开始设计过程并思考'怪物'。每个怪物类型(你知道,兽人,地精,老鼠等)将拥有自己的统计数据,技能和不具备的数据。起初我虽然我可以只有一个怪物类,并在实例化对象时设置属性。但后来我觉得这可能有点低效,所以我正在考虑为每个类型的怪物设一个班级。
考虑到每个类中的方法可能相同,这是解决问题的最佳方法吗?做一些我还不知道的更好的方法吗?
感谢任何帮助。
答案 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来实现。继承应该用于向类结构添加多态行为。