我遇到两个解决方案的问题,需要选择一个。我想知道在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;
}
}
选项#2,我创建了一个AttributeSystem
AttributeSystem.java
public class AttributeSystem
{
private List<Attribute> attributes;
public AttributeSystem () {
attributes = new ArrayList<Attribute>();
attributes.add (new Attribute ("Offensive", "Your damage.", 5);
attributes.add (new Attribute ("Defensive", "Your defense.", 5);
attributes.add (new Attribute ("Speed", "Your speed.", 5);
}
public Attribute getAttribute(int i) {
return attributes[i];
}
}
Character.java
public class Character
{
private AttributeSystem attributes;
public Character() {
attributes = new AttributeSystem();
}
public AttributeSystem getAttributes () {
return attributes;
}
}
结论
选项#2对我来说在逻辑上更有意义。 在这两种情况下,我都可以使用HashMap而不是ArrayList。
我使用哪一个?为什么?
最后的注释
这对你的角色没有影响。它也没有能力添加属性点。暂时忽略这两个因素。
答案 0 :(得分:2)
这两种选择对我来说都是合法的。 但我会将属性列表声明为静态,因为无论如何,播放器的可用属性列表都不会改变。
然后,对于每个玩家,您将每个可用属性映射到给定值。
答案 1 :(得分:1)
也许你已经过度工程了:假设这是经典的RPG,那些值(属性)的选择名称应该给你一个提示:如果你有一个Character对象,它将有属性......然后我会添加角色本身的那些属性:
class Character {
int defensive,offensive,speed;
... //other attributes here, like name, race or whatever you need
}
设备,技能和其他可以变化的东西(你可以拥有一个或20个项目,你可以学习一项技能或20个......它们之间的性质可能完全不同)更有意义列表或其他相关对象。
此外,不要混淆模型和视图:每个属性的描述不应该是Character的一部分,该对象不需要那种信息,并且每次创建一个新字符时都会重复这些信息。 / p>
答案 2 :(得分:1)
我同意巴勃罗,但我想稍微扩展一下。所以我觉得这个设计对你的要求来说太元了。在那个属性是如此通用,它没有那么有用,它的灵活性阻碍你。
在设计#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;
}
}