Java剪刀石头布游戏输入'n'误触发错误提示的问题修复求助
修复剪刀石头布游戏中输入'n'触发错误提示的问题
你的问题根源是Java字符串比较的误区:用==比较字符串是判断两个对象是否为同一个引用,而不是比较内容是否相等。当输入'n'时,playAgain == "n"永远为false,所以会走到else分支输出错误提示。
核心修复点
把所有字符串比较的==替换成equals()方法,推荐用常量字符串调用equals()(避免空指针风险):
// 原代码 if (playAgain == "n") { // 修复后 if ("n".equals(playAgain)) {
同样,胜负判断里的字符串比较也要修改:
// 原代码 if (pemain == "Gunting" && komp == "Kertas" || pemain == "Batu" && komp == "Gunting" || pemain == "Kertas" && komp == "Batu") { // 修复后 if (("Gunting".equals(pemain) && "Kertas".equals(komp)) || ("Batu".equals(pemain) && "Gunting".equals(komp)) || ("Kertas".equals(pemain) && "Batu".equals(komp))) {
额外修复的潜在问题
除了核心问题,代码还有几个逻辑漏洞需要补全:
- 处理无效输入:当用户输入非1-3的数字时,
pemain会是空字符串,导致胜负判断错误,需要在switch里加default分支提示错误并重新循环。 - 平局判断:原代码只有玩家赢和电脑赢的分支,漏掉了双方选择相同的平局情况。
- 优化Random实例:每次循环新建Random对象没必要,把它移到循环外复用更高效。
完整修复后的代码
import java.util.*; public class App { public static void main(String[] args) { Scanner input = new Scanner(System.in); Boolean play = true; int skorPemain = 0, skorKomp = 0; // 把Random实例移到循环外复用 Random randomGenerator = new Random(); while (play) { int random = randomGenerator.nextInt(3); String komp, pemain = ""; if (random == 0) { komp = "Gunting"; } else if (random == 1) { komp = "Batu"; } else { komp = "Kertas"; } System.out.print("Game Suit :\n" + "1. Gunting\n" + "2. Batu\n" + "3. Kertas\n" + "Pilih [1/2/3] : "); // 先判断输入是否为整数,避免输入非数字导致崩溃 if (!input.hasNextInt()) { System.out.println("Input tidak valid! Masukkan angka 1-3."); input.next(); // 清空无效输入 continue; } int pilih = input.nextInt(); switch (pilih) { case 1: pemain = "Gunting"; break; case 2: pemain = "Batu"; break; case 3: pemain = "Kertas"; break; default: System.out.println("Pilihan tidak valid! Pilih antara 1-3."); continue; // 重新循环,让用户重新输入 } // 修复字符串比较,新增平局判断 if (("Gunting".equals(pemain) && "Kertas".equals(komp)) || ("Batu".equals(pemain) && "Gunting".equals(komp)) || ("Kertas".equals(pemain) && "Batu".equals(komp))) { System.out.println("Pemain memilih " + pemain + " dan komputer memilih " + komp + "\nPemain menang, karena " + pemain + " mengalahkan " + komp); skorPemain++; } else if (pemain.equals(komp)) { System.out.println("Pemain memilih " + pemain + " dan komputer memilih " + komp + "\nSeri!"); } else { System.out.println("Pemain memilih " + pemain + " dan komputer memilih " + komp + "\nKomputer menang, karena " + komp + " mengalahkan " + pemain); skorKomp++; } System.out.println("\nSkor Pemain vs Komputer : " + skorPemain + " vs " + skorKomp); System.out.print("Mau main lagi [y/n] : "); String playAgain = input.next(); System.out.println(""); // 修复字符串比较 if ("n".equals(playAgain)) { System.out.println("Terima kasih sudah bermain."); play = false; } else if ("y".equals(playAgain)) { continue; } else { System.out.println("Wrong input!"); play = false; } } input.close(); // 关闭Scanner,避免资源泄漏 } }
内容的提问来源于stack exchange,提问作者Dillon Leon
相关产品推荐
相关产品推荐

