我正在写一个有趣的足球模拟器,我不确定如何组织我的球员的属性评级。我知道随着我改进游戏,属性的数量会发生变化。我需要单独访问每个,即
SoccerPlayer.getSpeed()
SoccerPlayer.getShooting()
我也知道我希望能够通过单一功能对它们进行平均以获得总体评分。
SoccerPlayer.getOverall()
我的第一个倾向是使用列表或数组,使用常量来定义数组中每个属性的索引。
static final int SPEED_INDEX = 0;
static final int SHOOTING_INDEX = 1;
static final int NUM_ATTRIBUTES = 2;
int[] attributes = new int[NUM_ATTRIBUTES];
int getSpeed() {
return attributes[SPEED];
}
int getOverall() {
int total = 0;
for (int i : attributes) {
total += i;
}
return (total / attributes.length);
}
这样,每当我添加一个新属性时,我只需要改变总常量,并添加一个新的索引常量,总函数将始终有效。但是有更好的方法吗?
答案 0 :(得分:1)
您可以使用枚举作为属性,使用地图作为评分:
enum Attributes {
SPEED, SHOOTING;
};
private Map<Attributes,Integer> ratings = new LinkedHashMap<Attributes, Integer>();
int getRating(Attribute attribute) {
return ratings.get(attribute);
}
int getSpeed() {
return getAttribute(Attributes.SPEED);
}
int getOverall() {
int total = 0;
for (int i : ratings.values()) {
total += i;
}
return total / Attributes.values().length;
}
然后添加新属性,只需将其添加到枚举。
当您进行调试时,评级将更容易理解,因为属性具有名称而不是数字。
另外,如果你想为这些属性添加比例因子(例如速度加权的两倍),那么枚举就是一个方便的地方。
答案 1 :(得分:0)
我很惊讶你会对玩家属性的总和产生兴趣。我的意思是,将我的能力添加到我的准确投射能力中真的有意义吗?
假设你真的想要这样做,你所描述的内容似乎足够明智。
答案 2 :(得分:0)
从我看到的情况来看,您的系统整体排名是有效的。但有一件事,你可能想要检查并确保是正确的。为了使您的排名准确,1点射击指数必须与1点速度指数相比具有相同的竞争价值。如果速度指数的变化比射击指数更有价值,反之亦然,排名将是不准确的。到目前为止它似乎是一个优雅的设计,只要它是适当平衡的。
EG:4速4次射击可能每次都能击败10次速度,但仍会排在较低的位置。你必须调整每个速度/射击实际给予某人多少奖金,以确保排名更高的球队有更好的获胜机会。