首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 實現「猜拳遊戲」平局重賽邏輯完整指南

     編輯:程式設計綜合問答

需求分析

玩家輸入 0(剪刀)、1(石頭)、2(布),電腦隨機出拳。比較勝負,**平局時需重新輸入並繼續比較,直到分出勝負**。

原代碼存在的問題

  1. 缺少循環控制:平局或輸入非法後,程序直接結束,未實現「重賽」。
  2. 判斷邏輯運算符錯誤:a==2 & b==1 使用了位運算 & 而非邏輯與 &&,雖然此處結果相同,但語義不清且存在優先級陷阱。
  3. 電腦出拳輸出邏輯錯誤: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 替換整數常量,增強類型安全。
  • 增加多輪積分制、歷史記錄、GUI 界面等功能。
  • 單元測試覆蓋 judge() 所有組合情況。

通過引入循環控制與數學建模,這個小遊戲從「能跑」進化為「健壯、可維護、可擴展」的標準實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved