假设我们有一个控制名为Player1的角色的玩家。要在运行时启用切换武器,我有以下代码:嵌套策略设计模式
public interface IWeapon
{
void Fire();
}
public class Player1Weapon1 : IWeapon
{
...
void Fire()
{
//do actions of Weapon1
}
...
}
public class Player1Weapon2 : IWeapon
{
...
void Fire()
{
//do actions of Weapon2
}
...
}
public class Player1
{
IWeapon weapon;
Player1Weapon1 w1;
Player1Weapon2 w2;
public Player1()
{
w1 = new Player1Weapon1(this);
w2 = new Player1Weapon2(this);
SetWeapon(w1);
}
void Update()
{
if(SWITCH_BTN_HELD)
{
if(weapon.equals(w1)) SetWeapon(w2);
if(weapon.equals(w2)) SetWeapon(w1);
}
if(FIRE_BTN_HELD)
weapon.Fire();
}
void SetWeapon(w)
{
weapon = w;
}
}
完美的工作。
但是现在玩家可以选择另一个名为Player2的角色。请注意,玩家2的武器与玩家1不同。因此,我们可以添加类是这样的:
public class Player2Weapon1 : IWeapon
{
...
void Fire()
{
//do actions of Weapon1
}
...
}
public class Player2Weapon2 : IWeapon
{
...
void Fire()
{
//do actions of Weapon2
}
...
}
public class Player2
{
IWeapon weapon;
Player2Weapon1 w1;
Player2Weapon2 w2;
public Player2()
{
w1 = new Player2Weapon1(this);
w2 =new Player2Weapon2(this);
SetWeapon(w1);
}
void Update()
{
if(SWITCH_BTN_HELD)
{
if(weapon.equals(w1)) SetWeapon(w2);
if(weapon.equals(w2)) SetWeapon(w1);
}
if(FIRE_BTN_HELD)
weapon.Fire();
}
void SetWeapon(w)
{
weapon=w;
}
}
这将再次工作,但它是非常紧张,如果玩家想与Player3玩,我应该addmore类项目。
我想知道如何使战略格局中像下面剥皮用:
interface IPlayer()
{
}
我不知道哪个方法将被放置在IP层?我如何创建嵌套的策略设计模式?
我觉得你的球员不应该甚至有 “PlayerXWeapon”,只是IWeapons的IEnumerable。 – 2015-02-08 15:59:07
是的,不要在将使用它的玩家之后命名一个项目。想象一下,如果你的游戏允许一个玩家放弃武器,而另一个玩家拿起它。这会让人困惑。武器的存在可以独立于持有它的人。 – MickyD 2015-02-08 17:03:45
@MickyDuncan,是的,但是解决方案是什么? – 2015-02-08 18:19:59