1

作成しているゲームのクラスを作成していますが、ユーザーに最高の「報酬」を返す方法がわかりません。

私がやろうとしているのは、プレイヤーのキルに基づいて報酬を返すことです。彼が38キルを持っている場合、それは300だけを返すはずです。150も返しません。

    class EnumTest {

private static int playerKills = 38;

private enum KillReward {

    BEGINNER(10, 150),
    JUNIOR(25, 300),
    EXPERT(50, 500),
    CHAMPION(100, 1000);

    private KillReward(int kills, int reward) {
        this.kills = kills;
        this.reward = reward;
    }

    private int kills, reward;

    private int getKillsNeeded() {
        return kills;
    }

    private int getKillReward() {
        return reward;
    }
}

public static void main (String[] args) {
    for (KillReward k : KillReward.values()) {
        if (playerKills > k.getKillsNeeded()) {
            System.out.println("Kills: " + playerKills + "; Reward: " + k.getKillReward());
        }
    }
}

}

4

1 に答える 1

1

これにはいくつかの方法があります。

簡単な方法の 1 つは、報酬を変数に割り当てることです。そのループの最後に、reward以下の変数が適用可能な最高のキル報酬になります。

public static void main (String[] args) {
    KillReward reward = null;
    for (KillReward k : KillReward.values()) {
        if (playerKills > k.getKillsNeeded()) {
            reward = k;
        }
    }
    System.out.println("Kills: " + playerKills + "; Reward: " + k.getKillReward());
}

これは、脆弱な場合がある順序でリストされている列挙型に依存していることに注意してください。たとえば、新しい KillReward 列挙型が CHAMPION の後に追加されたが、killsNeeded 値が低い場合、適切な値が返されません。

より良い解決策は、 Comparator を作成し、それを使用して enum 値を最初に killsNeeded でソートすることです。降順でも並べ替えると、最初に該当するループにヒットすると、ループから抜け出すこともできます。

class EnumTest {

    private enum KillReward {

        BEGINNER(10, 150), JUNIOR(25, 300), EXPERT(50, 500), CHAMPION(100, 1000);

        // Sort KillRewards once at initialization
        private static final List<KillReward> sortedKillRewards = new ArrayList<KillReward>();
        static {
            for (KillReward k : values())
                sortedKillRewards.add(k);
            Collections.sort(sortedKillRewards, new Comparator<KillReward>() {
                @Override
                public int compare(KillReward o1, KillReward o2) {
                    return (o1.kills - o2.kills) * -1; // multiplying by -1 makes it
                    // descending
                }
            });
        }

        private KillReward(int kills, int reward) {
            this.kills = kills;
            this.reward = reward;
        }

        private int kills, reward;

        private int getKillsNeeded() {
            return kills;
        }

        private int getKillReward() {
            return reward;
        }

        public static KillReward forKills(int killCount) {
            for (KillReward k : sortedKillRewards)
                if (killCount >= k.kills)
                    return k;

            // must not have enough kills for any reward
            return null;
        }
    }

    public static void main(String[] args) {
        int kills = 9;
        System.out.println("Kills: " + kills + "; Reward: "
                + KillReward.forKills(kills));

        kills = 10;
        System.out.println("Kills: " + kills + "; Reward: "
                + KillReward.forKills(kills));

        kills = 38;
        System.out.println("Kills: " + kills + "; Reward: "
                + KillReward.forKills(kills));
    }

}
于 2013-03-23T02:48:17.417 に答える