玩家輸入 0(剪刀)、1(石頭)、2(布),電腦隨機出拳。比較勝負,**平局時需重新輸入並繼續比較,直到分出勝負**。
a==2 & b==1 使用了位運算 & 而非邏輯與 &&,雖然此處結果相同,但語義不清且存在優先級陷阱。if(player==0) 判斷的是玩家輸入而非電腦隨機數。package game;
import java.util.Scanner;
public class RockPaperScissors {
private static final String[] GESTURES = {"剪刀", "石頭", "布"};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int player, computer;
// 外層循環:處理平局重賽
while (true) {
// 1. 獲取合法玩家輸入
while (true) {
System.out.print("請輸入:0=剪刀,1=石頭,2=布 > ");
if (scanner.hasNextInt()) {
player = scanner.nextInt();
if (player >= 0 && player <= 2) break;
} else {
scanner.next(); // 消耗非法 token
}
System.out.println("輸入無效,請重新輸入 0、1 或 2。");
}
System.out.println("您出了:" + GESTURES[player]);
// 2. 電腦隨機出拳
computer = (int) (Math.random() * 3);
System.out.println("電腦出了:" + GESTURES[computer]);
// 3. 判斷勝負
int result = judge(player, computer);
if (result == 0) {
System.out.println("平局!重新開始...\n");
continue; // 進入下一輪循環
} else if (result == 1) {
System.out.println("🎉 您贏了!");
} else {
System.out.println("😢 您輸了。");
}
break; // 分出勝負,退出遊戲
}
scanner.close();
}
/**
* 判斷勝負
* @return 1: 玩家贏, -1: 玩家輸, 0: 平局
*/
private static int judge(int player, int computer) {
if (player == computer) return 0;
// (player - computer + 3) % 3 == 1 表示玩家贏
// 0-2=-2+3=1%3=1 贏; 1-0=1%3=1 贏; 2-1=1%3=1 贏
return ((player - computer + 3) % 3 == 1) ? 1 : -1;
}
}
| 改進點 | 說明 |
|---|---|
| 雙層 while 循環 | 外層控制「平局重賽」,內層保證「輸入合法性」。 |
| 數學公式判斷勝負 | 用 (player - computer + 3) % 3 == 1 替代多條 if-else,邏輯清晰且易擴展。 |
| 資源釋放 | 遊戲結束關閉 Scanner,避免資源洩漏。 |
| 常量數組存儲手勢名 | 消除魔術數字,輸出邏輯解耦,易維護。 |
Gesture 替換整數常量,增強類型安全。judge() 所有組合情況。通過引入循環控制與數學建模,這個小遊戲從「能跑」進化為「健壯、可維護、可擴展」的標準實現。