为角色制作设备时的子类太多(角色扮演游戏)

时间:2017-02-20 19:38:00

标签: java oop design-patterns uml abstract-factory

我正在建立一个小型角色扮演游戏。角色有多个属性,如:力量,魔法,射箭和防御。玩家也可以穿戴头盔,躯干,腿,靴子,手套和武器等装备。每件设备都有自己的统计数据。例如,银色躯干有10个防御。

当角色有15个防守,并且他穿着银色躯干时,他的防守现在是25.无论如何,为了穿戴装备,需要制作它。目前我用抽象工厂模式设计了它(见图)。

这个设计有很多类,其中大部分都是无用的,比如 Bronze Helmet Silver Torso 等等,因为它们只有一个实例。 class Stats。

因此,我的问题是:生产设备的最佳方法是什么,减少更有用的课程。由于它是针对学校项目的,我最好想要使用设计模式。 enter image description here

3 个答案:

答案 0 :(得分:1)

在商业视频游戏中,许多具有不同属性和可能特殊效果的项目通常通过脚本系统实现。很难使它更具体,因为脚本绑定和基于组件的体系结构之类的东西没有严格定义,并且因游戏而异。

通过了解RPG的(项目更改)mod如何工作,您可以很好地了解这些系统的内部工作原理。例如,看看" Papyrus" Skyrim 的绑定,或者更简单的例子来看看 Isaac的绑定:重生的lua绑定。

答案 1 :(得分:1)

我会这样接近:

有一个抽象类Armor,所有的头盔,躯干等都继承自。然后你可以拥有一个Silver和Bronze类,也可能在ArmorType类下统一。我会根据它的设备有一些修饰符,即Bronze :: modifier = 1.25;,Silver :: modifier = 1.5;等等。这样,对于你拥有的每个新的ArmorType或Armor,你都不要&# 39;必须添加大量新课程。随着游戏的扩大,这种情况只会越来越严重。

当在Armor子类中进行实际的统计计算时,它将如下:

//这是你的盔甲课。

    class Torso extends Armor {

        public Torso(ArmorType armorType) {
            this.armorType = armorType;
            this.baseStat = 10;
        }

        public double calculateStats() {
             return this.getBaseStat() * armorType.getModifier();
        }
    }

现在举个例子。如果躯干的基础属性为10护甲,则银的修正值为1.5,那么这件护甲的防御力就是15.当然你可以根据自己的喜好调整这些数字,或者为计算添加更多方面。这只是你可以做的事情的一个简单例子。

如果您想将Stats保留为原始设计的一部分,我会将Stats对象放入Armor类中。所以你有效地使用Decorator模式用ArmorTypes来装饰你的Armor类。你也只是在你的Stats类和你的Armor子类之间插入一层。

让我知道你的想法。

答案 2 :(得分:1)

  

这个设计有很多类,其中大部分都是无用的,比如Bronze Helmet,Silver Torso等,因为它们只有一个Stats类的实例。

你似乎没有充分理由爆炸你的设计。整个层次结构只能用一个名为Equipment的类替换。

public class Equipment {
    private Stats stats;
    private String equiptmentName;

    //constructors and getters and setters follow..
}

您的Player课程可以Set Equipment,如下所示。每当安装或卸载设备时,您都会使用Playerstats更新Equipment统计信息。

public class Player {
    private Set<Equipment> mountedEquipment;
    private Stats baseStats;

    public Player(Stats baseStats) {
       this.baseStats = baseStats;//set base stats for player
       mountedEquipment = new HashSet<Equipment>();
    }

    public void mountEquipment(Equipment equipment) { 
          baseStats.setMagic(baseStats.getMagic()+equipment.getStats().getMagic());

         //update base stats similarly for strength, hitpoints, etc
         mountedEquipment.add(equipment);

    }

    public void unmountEquipment(Equipment equipment) {

       baseStats.setMagic(baseStats.getMagic()-equipment.getStats().getMagic());
       //update base stats in a similar fashion for strength, hitpoints, etc
       mountedEquipment.remove(equipment);
    }

    public Set<Equipment> getMountedEquiptment() {
        return Collections.unmodifiableSet(mountedEquiptment);
    }

}

您不需要在问题中显示任何 Factory 类,因为您可以将所有可能的stats添加到Equipment和{{每当您引入新的Player类型时,都会出现类。