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

次に、新しい属性を追加するには、それを列挙型に追加するだけです。

デバッグ中は、属性に数字ではなく名前が付いているため、評価がわかりやすくなります。

また、属性にスケールファクターのようなものを追加したい場合(たとえば、速度は撮影の2倍の重みが付けられます)、列挙型はそれを配置するのに便利な場所です。

于 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 に答える