2013-03-23 113 views
1

我正在做一個類遊戲我正在和無法弄清楚如何以最高的「獎勵」返回到用戶:找出最大值在枚舉

我試圖得到它do是基於玩家的殺死回報獎勵。如果他有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()); 
     } 
    } 
} 

}

回答

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

注意,這依賴於枚舉爲了這有時是脆弱的被列。例如,如果在CHAMPION之後添加了新的KillReward枚舉,但殺死了必要值,則不會返回適當的值。

一個更好的解決方案是創建一個比較器,並使用它來首先通過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)); 
    } 

} 
+0

感謝您的迴應!我從未使用比較器。你介意讓我對使用比較器做這樣的事情有所瞭解嗎? – achauncey 2013-03-23 03:32:15

+0

我使用上面的比較器添加了一個版本。 – Blake 2013-03-23 14:56:22

+0

美麗......非常感謝。 – achauncey 2013-03-24 07:46:57