修复Java掷骰子游戏中的循环中断异常

修复java掷骰子游戏中的循环中断异常

本文旨在帮助Java初学者解决在掷骰子游戏中循环中断时遇到的异常问题。通过分析代码,找出导致异常的原因,并提供修改后的代码示例,确保游戏在玩家选择退出或资金不足时能够正常结束,并展示游戏结束时的信息。

在提供的代码中,主要问题集中在游戏循环的退出条件和System.out.printf的使用上。以下将详细解释并提供修改后的代码。

问题分析与修复

循环退出条件

原代码中,循环的退出条件是playAgain && total > 0。这意味着只有当playAgain为true且total大于0时,循环才会继续。虽然在循环内部有break语句用于处理total <= 9和again.equalsIgnoreCase("n")的情况,但逻辑上没有错误。问题在于,当输入无效字符时,again变量的值未被正确更新,导致可能进入死循环。

修改后的代码示例:

立即学习“Java免费学习笔记(深入)”;

while (playAgain && total > 0) {    // ... (游戏逻辑) ...    if (total <= 9) {        break;    }    System.out.println("Keep playing (y/Y or n/N)? ");    in.nextLine(); // Consume the newline character    String again = in.nextLine();    if (again.equalsIgnoreCase("y")) {        playAgain = true;    } else if (again.equalsIgnoreCase("n")) {        playAgain = false; // Set playAgain to false to exit the loop        break;    } else {        System.out.println("Invalid character input, try again:");        // No need to read input again here. The loop will continue and ask again.    }}

注意事项:

在读取字符串之前,使用in.nextLine()来消耗掉之前in.nextInt()留下的换行符,避免影响后续的输入。当玩家输入 “n” 时,将 playAgain 设置为 false,确保循环能够正常退出。当输入无效字符时,不需要再次读取输入。循环会自动回到开始,再次提示用户输入。

System.out.printf 异常

原始代码中使用System.out.printf(“Based on your play, the probability of winning is %.2%”, winPercent);,这可能会导致MissingFormatArgumentException异常,因为%.2%需要一个参数,而winPercent已经被用作格式化的数值。

正确的做法是使用System.out.println进行字符串拼接,或者使用String.format方法。

修改后的代码示例:

立即学习“Java免费学习笔记(深入)”;

// 方法一:使用 System.out.println 进行字符串拼接System.out.println("Based on your play, the probability of winning is " + String.format("%.2f", winPercent) + "%.");// 方法二:使用 String.format//System.out.printf("Based on your play, the probability of winning is %.2f%%", winPercent);

解释:

方法一使用 String.format(“%.2f”, winPercent) 将 winPercent 格式化为保留两位小数的浮点数,然后与字符串拼接。方法二使用 String.format 和 %% 来输出百分号。

完整修改后的代码

import java.util.Random;import java.util.Scanner;public class GameOfCrapsTester {    static Scanner in = new Scanner(System.in);    static Random rand = new Random();    public static void main(String[] args) {        System.out.println("Welcome to the game of Craps");        System.out.println(" ");        System.out.println("The house has given you a starting balance of $500");        System.out.println("On each round, you will make a whole number wager.");        System.out.println("The minimum wager is $10, and the maximum wager is your remaining balance.");        System.out.println(" ");        System.out.println("You may keep playing until you decide to cash in, or");        System.out.println("    you can't cover the minimum wager.");        System.out.println("Good Luck!");        boolean win;        double wins = 0, numOfGames = 0;        int total = 500;        // Come out roll and set point value        int pointValue = 0;        boolean playAgain = true;        while (playAgain && total > 0) {            System.out.println(" ");            System.out.println("Your balance is $" + total);            System.out.println(" ");            System.out.println("Place your bet: $");            // Get and check wager placed            int bet = in.nextInt();            in.nextLine(); // Consume newline            while (bet > total || bet < 10) {                if (bet = 4 && num <= 10 && num != 7) || num == 0) {                pointValue = num;                System.out.println(" ");                System.out.println("Your point value is " + pointValue);                System.out.println(" ");                win = rollWithPoint(pointValue);                if (win) {                    total = wonGame(bet, total);                    wins++;                    numOfGames++;                    System.out.println("Wins: " + wins + " Number of games: " + numOfGames);                } else if (!win) {                    total = lostGame(bet, total);                    numOfGames++;                    System.out.println("Wins: " + wins + " Number of games: " + numOfGames);                }            } else if (num == 7 || num == 11) {                total = wonGame(bet, total);                wins++;                numOfGames++;                System.out.println("Wins: " + wins + " Number of games: " + numOfGames);            } else {                total = lostGame(bet, total);                numOfGames++;                System.out.println("Wins: " + wins + " Number of games: " + numOfGames);            }            if (total <= 9) {                break;            }            System.out.println("Keep playing (y/Y or n/N)? ");            String again = in.nextLine();            if (again.equalsIgnoreCase("y")) {                playAgain = true;            } else if (again.equalsIgnoreCase("n")) {                playAgain = false;                break;            } else {                System.out.println("Invalid character input, try again:");            }        }// end of loop        gameOver(wins, numOfGames);    } // END of main    public static int rollDice() {        int dice1, dice2, total;        dice1 = rand.nextInt(6) + 1;        dice2 = rand.nextInt(6) + 1;        total = dice1 + dice2;        System.out.print("Your roll: ");        System.out.print("Dice1: " + dice1);        System.out.print(", Dice2: " + dice2);        System.out.println("; Roll Value: " + total);        return total;    } // END of rollDice    public static boolean rollWithPoint(int point) {        int total = rollDice();        boolean winner = false;        while (total != 7 && winner == false) {            total = rollDice();            if (total == point) {                winner = true;            } else {                winner = false;            }        }        return winner;    } // END of rollWithPoint    public static int lostGame(int bet, int total) {        System.out.println("Oh, I'm sorry, you lost.");        System.out.println(" ");        total = total - bet;        System.out.println("Your current balance: $" + total);        System.out.println(" ");        return total;    } // END of lostGame    public static int wonGame(int bet, int total) {        System.out.println("A winner!");        System.out.println(" ");        total = total + bet;        System.out.println("Your current balance: $" + total);        System.out.println(" ");        return total;    } // END of wonGame    public static void gameOver(double win, double tot) {        double winPercent = (win / tot) * 100;        System.out.println(" ");        System.out.println("Based on your play, the probability of winning is " + String.format("%.2f", winPercent) + "%.");        System.out.println(" ");        System.out.println("Seems you lost your shirt; better luck next time.");        System.out.println("Have a nice day! Hope to see you soon!");    } // END of gameOver} // END of GameOfCraps

总结

通过以上修改,可以解决游戏循环中断时可能出现的异常,并确保游戏在玩家选择退出或资金不足时能够正常结束。同时,修正了概率输出的格式,使其更加清晰易懂。希望本文能够帮助Java初学者更好地理解和掌握循环控制和字符串格式化的相关知识。

以上就是修复Java掷骰子游戏中的循环中断异常的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/81741.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
客户管理费用包括哪些
上一篇 2025年11月15日 23:29:58
客户管理五个内容是哪些
下一篇 2025年11月15日 23:30:17

相关推荐

  • Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略

    Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略

    本文探讨了如何在单一JAR包中集成Kotlin Native多平台可执行文件与JVM回退实现,以兼顾高性能与极致跨平台能力。核心在于利用Java Native Interface (JNI) 作为桥梁,使JVM应用能动态加载并调用Kotlin Native编译生成的平台特定动态库,同时在原生库不可用…

    2026年9月29日 • 用户投稿
    100
  • 格子达知网查重入口在哪里—格子达毕业设计查重入口

    格子达知网查重入口在哪里—格子达毕业设计查重入口格子达知网查重入口在哪里—格子达毕业设计查重入口格子达知网查重入口在哪里—格子达毕业设计查重入口格子达知网查重入口在哪里—格子达毕业设计查重入口

    格子达查重入口为https://co.gocheck.cn/11653,提供论文重复率检测、AIGC风险评估及多轮自检功能,适配本科毕业设计全流程,支持Word格式直接上传,结果清晰标红便于修改。 格子达知网查重入口在哪里—这是不少网友都关注的,接下来由PHP小编为大家带来格子达毕业设计查重入口地址…

    2026年9月29日 • 用户投稿
    100
  • 理解标准输出缓冲:Python、C、Java与Go的行为差异解析

    理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析

    本文深入探讨了不同编程语言在标准输出(stdout)缓冲机制上的差异,特别是在输出连接到终端(TTY)或管道时。我们将解析Python和C在管道场景下默认采用块缓冲,导致输出延迟,而Java和Go则倾向于实时刷新。文章将提供代码示例,并指导如何控制和管理输出缓冲,以确保在各种环境下都能获得预期的程序…

    2026年9月29日 • 用户投稿
    100
  • sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程

    sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程

    安装package control后通过命令面板安装sublimerepl插件;2. 通过菜单或快捷键运行代码或发送选中代码到repl;3. 配置快捷键(如f5运行文件,ctrl+b发送选中代码)提升效率;4. 遇到问题时检查解释器路径、环境变量、文件编码或快捷键冲突;5. 可结合terminus插…

    2026年9月29日 • 用户投稿
    200
  • 如何用API调用Midjourney生成图像 Midjourney API使用与参数详解

    如何用API调用Midjourney生成图像 Midjourney API使用与参数详解如何用API调用Midjourney生成图像 Midjourney API使用与参数详解如何用API调用Midjourney生成图像 Midjourney API使用与参数详解如何用API调用Midjourney生成图像 Midjourney API使用与参数详解

    调用midjourney api可通过第三方平台集成到应用中,具体步骤为:注册账号并获取api密钥、阅读接口文档、发送请求;基本流程包括发送“/imagine”命令、等待任务完成、获取图片链接;常用参数有prompt、aspect、style、version、chaos、seed;生成图片后需注意临…

    2026年9月29日 • 用户投稿
    100
  • 一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5

    一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5

    国庆与中秋双节叠加的超长假期即将到来,不少朋友已经按捺不住,计划走出国门、畅游世界——东京、首尔、巴黎、曼谷、莫斯科依旧是热门首选。然而,出境旅行虽令人期待,但“老三难”问题总是如影随形:担心没网络、害怕迷路、忧虑语言不通……不过这次我发现,鸿蒙5系统内置的几款原生应用,实测下来竟然把这三大痛点一一…

    2026年9月29日 • 用户投稿
    100
  • Win10下Edge浏览器地址栏出现热门站点取消方法

    Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法

    近期,在使用windows 10系统时发现,当利用edge浏览器点击地址栏时,总是会弹出令人困扰的“热门站点”。为了解决这一问题,本文将向大家介绍如何在windows 10系统中移除edge浏览器地址栏中的热门站点。接下来是具体的操作步骤。 操作步骤: 启动Edge浏览器,找到设置界面中的相关选项(…

    2026年9月29日 • 用户投稿
    100
  • Sublime代码重构工具 Sublime自动化重构方案

    Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案

    sublime text在代码重构中的核心局限性在于缺乏原生的深度语义理解和重构功能的碎片化;其优势在于极致速度、高度定制性及强大的多光标与正则查找替换能力。1.局限性:①缺乏深度语义分析,依赖简单文本替换易引入错误;②重构功能依赖第三方包,配置复杂且质量参差不齐。2.优势:①轻量快速,适合快速修改…

    2026年9月29日 • 用户投稿
    000
  • 多语言对比:深入理解标准输出缓冲机制与TTY连接的影响

    多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响

    本文深入探讨了Python、C、Java和Go等编程语言中标准输出(stdout)的缓冲机制。重点分析了在输出连接到终端(TTY)和管道/文件(非TTY)时,不同语言默认缓冲行为的差异及其背后的原因。文章解释了行缓冲与块缓冲的概念,并提供了控制输出刷新的方法,旨在帮助开发者更好地理解和管理程序输出,…

    2026年9月29日 • 用户投稿
    100
  • realmeV系列摄像头怎么设置以提升夜间拍摄效果?夜间模式的优化方法

    realmeV系列夜间拍摄的核心是启用夜间模式并结合专业模式手动调节ISO、快门速度、白平衡等参数,配合三脚架提升稳定性,避免高ISO和手持抖动,同时善用环境光、前景构图与后期处理,以获得细节丰富、噪点少、色彩真实的高质量夜景照片。 realmeV系列手机在夜间拍摄时想要获得更好的效果,核心在于充分…

    2026年9月29日
    100
  • 怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧

    怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧

    使用ai工具辅助将jquery代码迁移到vue是可行的,尤其适用于老项目升级。1. 首先让ai理解jquery逻辑,通过解释代码功能和列出数据依赖帮助确认逻辑清晰;2. 拆分功能模块逐步转换,按表单提交、动态列表等小模块分别处理,生成可在vue中直接运行的代码;3. 借助ai识别常见陷阱,如避免频繁…

    2026年9月29日 • 用户投稿
    100
  • 使用 Cloud Function 访问不同 GCP 项目中的资源

    在 Cloud Functions 中,每个函数都运行在一个特定的服务账号下。这个服务账号拥有访问其他 GCP 资源的权限。当你的 Cloud Function 需要访问位于不同项目中的资源时,例如从一个项目 (com-project-data) 的 Secret Manager 中读取密钥,而 C…

    2026年9月29日
    100
  • java使用教程如何使用JWT实现身份认证 java使用教程的JWT认证应用方法

    java使用教程如何使用JWT实现身份认证 java使用教程的JWT认证应用方法java使用教程如何使用JWT实现身份认证 java使用教程的JWT认证应用方法java使用教程如何使用JWT实现身份认证 java使用教程的JWT认证应用方法java使用教程如何使用JWT实现身份认证 java使用教程的JWT认证应用方法

    答案:使用JWT实现身份认证需引入jjwt库,登录后生成含用户信息的Token并返回,客户端每次请求携带Token,服务器验证其有效性。具体步骤包括:1. 在pom.xml中添加jjwt-api、jjwt-impl、jjwt-jackson依赖;2. 利用Jwts.builder()生成带用户ID、…

    2026年9月29日 • 用户投稿
    100
  • Elser AI Comics的免费版和付费版有什么区别?如何选择?

    Elser AI Comics的免费版和付费版有什么区别?如何选择?Elser AI Comics的免费版和付费版有什么区别?如何选择?Elser AI Comics的免费版和付费版有什么区别?如何选择?Elser AI Comics的免费版和付费版有什么区别?如何选择?

    免费版适合偶尔创作或试用,付费版适合高频及专业需求。免费版提供基础功能,如简单文本生成漫画、低分辨率输出、每日次数限制及无高级编辑工具,适合新手或轻度用户;付费版则提升至高分辨率输出、无生成限制、更多风格模板、图层管理、无水印导出等功能,适合连载创作或商业用途。选择时应根据使用频率和项目需求决定,可…

    2026年9月29日 • 用户投稿
    100
  • Sublime插件推荐列表 Sublime必备扩展精选集

    Sublime插件推荐列表 Sublime必备扩展精选集Sublime插件推荐列表 Sublime必备扩展精选集Sublime插件推荐列表 Sublime必备扩展精选集Sublime插件推荐列表 Sublime必备扩展精选集

    sublime text强大的原因在于其丰富的插件生态,选择合适插件可显著提升开发效率。1. package control是插件管理的基础,简化插件安装、更新与卸载;2. autofilename实现文件路径自动补全,减少输入错误;3. emmet通过缩写生成html/css代码,大幅提升前端开发…

    2026年9月29日 • 用户投稿
    100
  • 云服务器怎么挂机-腾讯云服务器怎么挂机

    云服务器怎么挂机-腾讯云服务器怎么挂机云服务器怎么挂机-腾讯云服务器怎么挂机云服务器怎么挂机-腾讯云服务器怎么挂机云服务器怎么挂机-腾讯云服务器怎么挂机

    如何在php中文网服务器上实现挂机操作?创想鸟服务器相当于一台永不关机的网络电脑,可以全天候运行任何在个人电脑上能够运行的软件,如qq、游戏软件、网页游戏等。将这些需要长时间自动运行的程序放置在创想鸟服务器上,可以实现24小时不间断运行,非常适合挂机使用。 PHP中文网服务器挂机步骤 购买PHP中文…

    2026年9月29日 • 用户投稿
    100
  • 微信小店的简介怎么填写?在微信上如何填写表格

    微信小店的简介怎么填写?在微信上如何填写表格微信小店的简介怎么填写?在微信上如何填写表格微信小店的简介怎么填写?在微信上如何填写表格微信小店的简介怎么填写?在微信上如何填写表格

    随着电子商务在人们日常生活中的地位日益提升,社交电商的崛起为传统电商注入了新的活力。作为微信生态中重要的社交电商平台,微信小店凭借其独特的社交优势,正在推动整个行业的创新发展。本文将围绕微信小店的基本介绍、发展现状、市场前景及未来趋势展开探讨。 一、微信小店概述 微信小店是由腾讯微信推出的一款基于小…

    2026年9月29日 • 用户投稿
    100
  • Java中排列数据的生成与逐个处理策略

    Java中排列数据的生成与逐个处理策略Java中排列数据的生成与逐个处理策略Java中排列数据的生成与逐个处理策略Java中排列数据的生成与逐个处理策略

    本文旨在探讨在Java中如何有效地生成所有可能的排列,并对每个独立的排列进行逐个处理。我们将通过一个经典的“雇佣助理”问题作为案例,详细阐述如何修正常见的将所有排列扁平化处理的错误,确保每个排列都能作为独立的输入传递给处理函数,从而实现正确的统计与分析,最终计算出特定条件下的概率。 理解问题:排列生…

    2026年9月29日 • 用户投稿
    100
  • Win10没有hyperv选项只有虚拟机平台怎么回事?

    Win10没有hyperv选项只有虚拟机平台怎么回事?Win10没有hyperv选项只有虚拟机平台怎么回事?Win10没有hyperv选项只有虚拟机平台怎么回事?Win10没有hyperv选项只有虚拟机平台怎么回事?

    虚拟机是一种能够在单一物理设备上模拟出多台虚拟计算机的技术,这些虚拟计算机能够像真实的计算机一样运行,支持安装操作系统及各类应用程序。然而,部分win10用户可能会发现自己无法找到hypervisor(简称hyperv)选项,而仅能看到虚拟机平台,这究竟是怎么回事呢?下面将为大家介绍解决这一问题的具…

    2026年9月29日 • 用户投稿
    100
  • Sublime代码导航技巧 Sublime快速跳转定义位置

    Sublime代码导航技巧 Sublime快速跳转定义位置Sublime代码导航技巧 Sublime快速跳转定义位置Sublime代码导航技巧 Sublime快速跳转定义位置Sublime代码导航技巧 Sublime快速跳转定义位置

    sublime text的代码导航功能强大,核心在于快捷键与命令面板结合使用。1. go to definition (f12 或 ctrl + f12) 可快速跳转至变量、函数或类的定义;2. go to symbol in file (ctrl + r) 用于在当前文件内跳转符号;3. go t…

    2026年9月29日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信