组织数据的最佳方式:可变数量的特定数据点

时间:2012-08-25 02:55:22

标签: java data-structures code-organization

我正在写一个有趣的足球模拟器,我不确定如何组织我的球员的属性评级。我知道随着我改进游戏,属性的数量会发生变化。我需要单独访问每个,即

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);
}

这样,每当我添加一个新属性时,我只需要改变总常量,并添加一个新的索引常量,总函数将始终有效。但是有更好的方法吗?

3 个答案:

答案 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次速度,但仍会排在较低的位置。你必须调整每个速度/射击实际给予某人多少奖金,以确保排名更高的球队有更好的获胜机会。