如何为Java石头剪刀布程序实现用户输入Yes后重启运行的功能
Java石头剪刀布重启功能实现修正方案
原有代码存在的问题
- 缺少外层控制游戏重启的while循环,仅打印了是否重玩的提示,没有读取用户输入的判断逻辑
- 玩家分数、电脑分数、局数变量初始化位置错误,游戏重启时不会重置数值
- 重复在每轮游戏内创建Scanner对象,存在资源浪费
- 玩家胜利判断逻辑错误:
playerMove.equalsIgnoreCase("Rock") && computerMove.equalsIgnoreCase("Paper")属于玩家输的场景,误写到了胜利分支中 - 胜负结算逻辑写在了3局循环内部,每玩一轮就会结算一次胜负,不符合三局两胜的设计预期
修正后完整代码
import java.util.Scanner; public class RockPaperScissors { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 外层重启控制循环 String playAgain; do { // 每局游戏开始前重置分数和局数 int playerScore = 0; int computerScore = 0; int round = 0; // 3局游戏循环 while (round < 3) { System.out.println("请输入你的出拳:石头、剪刀、布"); System.out.println(">>"); String playerMove = input.next(); // 输入合法性校验 if (!playerMove.equalsIgnoreCase("石头") && !playerMove.equalsIgnoreCase("剪刀") && !playerMove.equalsIgnoreCase("布")) { System.out.println("出拳无效,对手得1分"); computerScore++; round++; System.out.println("你的分数:"+ playerScore + ";对手分数:"+ computerScore); continue; } // 生成电脑出拳 int computerInt = (int)(Math.random()*3); String computerMove = switch (computerInt) { case 0 -> "石头"; case 1 -> "布"; default -> "剪刀"; }; System.out.println("对手出拳:"+ computerMove); // 胜负判断 if (playerMove.equalsIgnoreCase(computerMove)) { System.out.println("平局"); } else if ( (playerMove.equalsIgnoreCase("石头") && computerMove.equalsIgnoreCase("剪刀")) || (playerMove.equalsIgnoreCase("剪刀") && computerMove.equalsIgnoreCase("布")) || (playerMove.equalsIgnoreCase("布") && computerMove.equalsIgnoreCase("石头")) ) { System.out.println("你赢了本轮"); playerScore++; } else { System.out.println("你输了本轮"); computerScore++; } round++; System.out.println("你的分数:"+ playerScore + ";对手分数:"+ computerScore); } // 三局结束后结算最终胜负 System.out.println("=== 本局最终结果 ==="); if (playerScore < computerScore) { System.out.println("你输了本局,太遗憾了;("); } else if (playerScore > computerScore) { System.out.println("你赢了本局,获得小奖励;) "); } else { System.out.println("本局平局,可以再试一次^_^"); } // 询问是否重玩 System.out.println("是否要再玩一局?输入Yes重启,输入其他内容退出游戏"); playAgain = input.next(); } while (playAgain.equalsIgnoreCase("Yes")); input.close(); System.out.println("游戏已成功退出"); } }
核心修改说明
- 新增
do-while外层循环控制游戏重启,每次循环结束时读取用户输入,输入为Yes时自动重启游戏 - 将
playerScore、computerScore、round变量移到内层游戏循环前定义,每次重启游戏自动重置数值 - 修正了玩家胜利判断逻辑,移除错误的胜利条件
- 将最终胜负结算逻辑移到3局循环外部,仅在3局全部结束后输出最终结果
- Scanner统一在程序入口创建,程序退出前关闭,避免重复创建资源
- 界面提示全部替换为中文,符合使用习惯
内容的提问来源于stack exchange,提问作者Tran Minh My
相关产品推荐
相关产品推荐

