0

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

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

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

4

3 回答 3

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

然后添加一个新属性只需将其添加到枚举中。

在调试时,评级会更容易理解,因为属性有名称而不是数字。

此外,如果您想为属性添加诸如比例因子之类的东西(例如,速度的权重是射击的两倍),枚举是一个方便的放置位置。

于 2012-08-25T19:00:32.727 回答
0

我很惊讶你会对玩家的属性总和感兴趣。我的意思是,将我的跑步能力与准确投篮能力相结合真的有意义吗?

假设您真的想这样做,那么您所描述的似乎足够明智。

于 2012-08-25T18:25:05.530 回答
0

在我看来,你的整体排名系统是有效的。但是,有一件事您可能需要检查并确保它是正确的。为了使您的排名准确,1分的射击指数必须与1分的速度指数具有相同的竞争力。如果速度指数的变化比投篮指数更有价值,反之亦然,排名将不准确。到目前为止,它似乎是一个优雅的设计,只要它得到适当的平衡。

EG:4速4射可能每次都可以击败10速1射,但还是会排名靠后。您将不得不调整每个速度/射击实际上给某人带来的奖励,以确保排名较高的球队有更好的获胜机会。

于 2012-08-25T18:37:06.243 回答