Java 实施属性和技能系统
我有两个解决方案的问题,选择哪一个。我想知道在RPG中实现属性的正确方法是什么。为了方便起见,让我们假设我们有三个属性进攻,防守和速度。每个角色都会有这些。我需要在某个地方存储属性的名称、描述和值。我认为应该在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
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;
}
}