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

pb3skfrl  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(302)

我写足球模拟器是为了好玩,我不知道如何组织我的球员的属性评级。我知道属性的数量会随着我对游戏的改进而改变。我需要单独访问每一个,即。

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

这样,每当我添加一个新属性时,我只需更改total常量,并添加一个新的索引常量,total函数就会一直工作。但是有没有更好的方法呢?

byqmnocz

byqmnocz1#

您可以使用枚举作为属性,使用Map作为评级:

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

然后要添加新属性,只需将其添加到枚举。
在调试时,分级将更容易理解,因为属性具有名称而不是数字。
此外,如果您想在属性中添加比例因子之类的内容(例如,速度的权重是射击的两倍),枚举是放置它的方便位置。

qkf9rpyu

qkf9rpyu2#

我很惊讶你会对一个玩家的属性总和感兴趣。我的意思是,把我的跑步能力和准确的投篮能力结合起来真的有意义吗?
假设你真的想这么做,你所描述的似乎足够明智。

z8dt9xmd

z8dt9xmd3#

依我看,你的排名系统是有效的。但是,有一件事你可能需要检查并确保它是正确的。为了让你的排名准确,1分的射击指数必须与1分的速度指数具有同等的竞争力。如果速度指数的变化比射击指数更有价值,反之亦然,排名就会不准确。不过,到目前为止,这似乎是一个优雅的设计,只要它是适当的平衡。
例:4速4投可能每次都能击败10速1投,但排名还是会更低。你必须调整每一个速度/射门实际给某人多少奖金,以确保排名较高的球队有更好的获胜机会。

相关问题