Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实施属性和技能系统_Java_Game Engine - Fatal编程技术网

Java 实施属性和技能系统

Java 实施属性和技能系统,java,game-engine,Java,Game Engine,我有两个解决方案的问题,选择哪一个。我想知道在RPG中实现属性的正确方法是什么。为了方便起见,让我们假设我们有三个属性进攻,防守和速度。每个角色都会有这些。我需要在某个地方存储属性的名称、描述和值。我认为应该在Attributes.java中完成。给我以下Attribute.java public class Attribute { private String name; private String desc; private int value; publ

我有两个解决方案的问题,选择哪一个。我想知道在RPG中实现属性的正确方法是什么。为了方便起见,让我们假设我们有三个属性进攻防守速度。每个角色都会有这些。我需要在某个地方存储属性的名称、描述和值。我认为应该在
Attributes.java
中完成。给我以下
Attribute.java

public class Attribute
{
    private String name;
    private String desc;
    private int value;

    public Attribute (String name, String desc, int value) {
        this.name = name;
        this.desc = desc;
        this.value = value;
    }

    public String getName () { // for desc and value as well
        return name;
    }
}
现在问题是,我是否创建和存储这些属性

选项#1,我在这里创建它们,用它们填充ArrayList

Character.java

import java.util.ArrayList;
import java.util.List;

public class Character
{
    private List<Attribute> attributes;

    public Character() {
        attributes = new ArrayList<Attribute>();
    }

    public List<Attribute> getAttributes () {
        return attributes;
    }
}
public class Character
{
    private AttributeSystem attributes;

    public Character() {
        attributes = new AttributeSystem();
    }

    public AttributeSystem getAttributes () {
        return attributes;
    }
}
结论

选项2在逻辑上对我更有意义。 在这两种情况下,我都可以使用HashMap而不是ArrayList

我为什么要用哪一个


最后说明


这还不会影响你的角色。它也不能添加属性点。暂时忽略这两个因素。

也许你设计过度了:假设这是经典的RPG,为这些值(属性)选择的名称应该会给你一个提示:如果你有一个角色对象,它将有属性。。。然后我会将这些属性添加到角色本身:

class Character {
   int defensive,offensive,speed;
   ... //other attributes here, like name, race or whatever you need

}
设备、技能和其他更可变的东西(你可以有一个或20个项目,你可以学习一个或20个技能…它们之间的性质可能完全不同)更适合列在列表或其他相关对象中


此外,不要混合使用模型和视图:每个属性的描述不应该是角色的一部分,该对象不需要此类信息,并且在每次创建新角色时都会复制这些信息。

这两个选项对我来说都是合法的。 但是我会声明属性列表是静态的,因为无论发生什么,玩家可用属性列表都不会改变


然后,对于每个玩家,您将把每个可用属性映射到一个给定的值。

我同意Pablo的观点,但我想对其进行一点扩展。因此,我认为这个设计对于您的需求来说有点过于元化。在这种情况下,属性非常通用,没有什么帮助,而且它的灵活性正在妨碍您

在《设计2》中,角色永远不能改变其属性。他们都是5岁。也许这只是一个例子,但当您超出硬编码的值时,处理它会变得更加麻烦

如果每个角色都必须具有这三个值,那么为什么不采用更简单的设计呢?这也比属性方案快得多,访问的代码也更少

class Character {
    int defensive, offensive, speed;
}
现在您可以使用getter方法封装修改器,如武器、装甲等,如下所示:

class Character {
    int defensive, offensive, speed;

    Item weapon;
    Item armor;
    Item shoes;

    public int getTotalDefensive() {
        return armor.getDefensive() + defensive;
    }

    public int getTotalOffensive() {
        return weapon.getOffensive() + offensive;
    }

    public int getTotalSpeed() {
        return shoes.getSpeed() + speed;
    }

    public List<Attribute> getAttributes() {
        // if you really need to work with a character like this then you can do that too.
        List<Attribute> attributes = new ArrayList<Attribute>();
        attributes.add( new Attribute( "offensive", "How much damage you can do", offensive );
        attributes.add( new Attribute( "defensive", "How much damage you can sustain", defensive );
        attributes.add( new Attribute( "speed", "How fast you can move", offensive );
        return attributes;
    }
}
类字符{
防守,进攻,速度;
项目武器;
项目装甲;
项目鞋;
公共int getTotalDefensive(){
返回护甲。getDefensive()+防御;
}
public int getTotalOffensive(){
返回武器。获得攻击性()+攻击性;
}
public int getTotalSpeed(){
返回鞋子。getSpeed()+速度;
}
公共列表getAttributes(){
//如果你真的需要与这样的角色合作,那么你也可以这样做。
列表属性=新的ArrayList();
属性。添加(新属性(“攻击性”,“你能造成多大伤害”,攻击性);
增加(新属性(“防御”,“你能承受多少伤害”,防御);
添加(新属性(“速度”,“移动速度”,攻击性);
返回属性;
}
}

这个问题似乎离题了,因为它是关于代码审查的,你应该把这个问题贴在上面,这样codereview会更好吗?我没有贴在那里,因为代码远远不完整或不真实。问题是这两个实现中哪一个更适合使用?或者是否有我不知道的第三个实现。@Emz Code review与IMO更匹配。您没有具体问题,只是关于选择哪种解决方案的问题。这也可能被视为主要基于意见。您没有回答问题,因为属性不仅仅是一个值,而是一个值名称和描述的元组:/Check my update:在我看来,这种值不应该存在,还有什么您需要哪些信息?我将如何存储属性的名称和描述?我正在考虑使用这些属性时,逻辑可能有多复杂,但假设逻辑只是一些算术计算,我认为这是最好的方法。您可以使用一个静态方法的类,在该类中接收字符作为参数为了计算任何动作,也许我应该粘贴整个
属性.java
代码?而不是这个简短的示例?也许我把它简化了。问题是有6个属性和40多种技能。装备有14个部分。属性类比我发布的要复杂得多。也许我应该编辑问题并显示整体e属性类?若属性很复杂,但您只得到其中的6个,我会将“int”改为“Attribute”,我会添加一个技能列表和另一个设备列表,但总体思路是,角色具有某些属性,访问这些属性应该尽可能容易。如果您在代码审阅上重新发布,请在此处给我们一个链接,我将移到那边。您可能希望在那边扩展问题的复杂性,以帮助我们了解你正试图代表我。
class Character {
    int defensive, offensive, speed;

    Item weapon;
    Item armor;
    Item shoes;

    public int getTotalDefensive() {
        return armor.getDefensive() + defensive;
    }

    public int getTotalOffensive() {
        return weapon.getOffensive() + offensive;
    }

    public int getTotalSpeed() {
        return shoes.getSpeed() + speed;
    }

    public List<Attribute> getAttributes() {
        // if you really need to work with a character like this then you can do that too.
        List<Attribute> attributes = new ArrayList<Attribute>();
        attributes.add( new Attribute( "offensive", "How much damage you can do", offensive );
        attributes.add( new Attribute( "defensive", "How much damage you can sustain", defensive );
        attributes.add( new Attribute( "speed", "How fast you can move", offensive );
        return attributes;
    }
}