3 回答

TA貢獻1817條經驗 獲得超14個贊
這是一個非常好的問題。因為每個 if-else 都是一樣的;您檢查某個滾動是否在某個范圍內,然后返回一個字符串,您可以只使用枚舉。相對于您正在處理和用此數據表示的內容,可以改進枚舉名稱以及元素名稱。
public String generatePassageSection() {
int roll = roll();
Message message = Stream.of(Message.values()).filter(m -> m.inBounds(roll)).findAny().orElse(null);
return message == null ? null : message.message;
}
enum Message {
FIRST(1, 2, "passage goes straight for 10 feed."),
SECOND(3, 5, "passage ends in the door to a chamber."),
THIRD(6, 7, "door to right (main passage continues straight for 10 ft)"),
FOURTH(9, 10, "door to left (main passage continues straight for 10 ft)"),
FIFTH(10, 11, "passage turns to left and continues for 10 ft"),
SIXTH(12, 13, "passage turns to right and continues for 10 ft"),
SEVENTH(14, 16, "passage ends in door to chamber"),
EIGHTH(17, 17, "Stairs, (passage continues straight for 10 ft)"),
NINTH(18, 19, "Dead end"),
TENTH(20, 20, "Wandering Monster (passage continues straight for 10 ft)");
;
private final int minimumRollInclusive;
private final int maximumRollInclusive;
private final String message;
Message(int minimumRollInclusive, int maximumRollInclusive, String message) {
this.minimumRollInclusive = minimumRollInclusive;
this.maximumRollInclusive = maximumRollInclusive;
this.message = message;
}
boolean inBounds(int roll) {
return roll >= minimumRollInclusive && roll <= maximumRollInclusive;
}
}
int roll() {
return 0; // use ur code
}
另外,應該注意的是,Enum#values 每次調用時都會創建一個新的數組對象,因此值得對其進行緩存。

TA貢獻1921條經驗 獲得超9個贊
如果您只是想減少 if 語句的數量,您可以添加一組可能的結果,在適當的骰子上對每個結果進行索引,然后返回該索引處的值。我不會把它全部寫給你,但它看起來有點像這樣:
public String generatePassageSection(String[] diceRolls){ return diceRolls[roll()]; }

TA貢獻1828條經驗 獲得超3個贊
更喜歡數據結構而不是代碼。
final private static String text[] = {
"passage goes straight for 10 feet.", // 1, 2
"passage ends in door to a chamber.", // 3, 4, 5
"door to right (main passage continues straight for 10 ft)", // 6, 7
"door to left (main passage continues straight for 10 ft)", // 8, 9
"passage turns to left and continues for 10 ft", // 10, 11
"passage turns to right and continues for 10 ft", // 12, 13
"passage ends in door to chamber", // 14, 15, 16
"Stairs, (passage continues straight for 10 ft)", // 17
"Dead end", // 18, 19
"Wandering Monster (passage continues straight for 10 ft)" // 20
}
final private static int index[] = {
0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 9
}
public String generatePassageSection() {
return text[index[roll()-1]];
}
手動構造的索引數組對文本數組的順序和內容有隱式假設。就本次例行的情況和規模而言,我認為這是合理的;我不建議將其作為一般做法。
這隱含地假設 roll() 已知能夠可靠地返回 1 到 20(含)范圍內的結果;如果你不能信任它,應該添加錯誤檢查。
添加回答
舉報