讲师中心 微信公众号
AI工具推荐 视频效率加速

Java井字棋游戏:强化用户输入验证,避免程序崩溃

陌丽姑娘_7062

陌丽姑娘_7062

发布时间:2025-11-14 17:10:03

|

749人浏览过

|

来源于php中文网

原创

Java井字棋游戏:强化用户输入验证,避免程序崩溃

本教程旨在解决java井字棋游戏中因用户输入无效(如超出范围或已占用位置)导致的程序崩溃问题。通过优化输入验证逻辑,我们将在用户选择位置前,首先检查其合法性(1-9),然后判断是否已被占用,从而有效提升游戏的稳定性和用户体验。

在开发交互式游戏时,用户输入是不可避免的一部分。然而,不当的用户输入处理是导致程序不稳定甚至崩溃的常见原因。对于像井字棋这样的游戏,玩家需要输入一个数字来选择棋盘上的位置。如果玩家输入的数字超出了有效范围(例如,小于1或大于9),或者选择了已被占用的位置,程序就可能因为数组越界或逻辑错误而崩溃。本教程将深入探讨如何在Java井字棋游戏中实现健壮的用户输入验证,以避免此类问题。

问题分析

在提供的井字棋代码中,PlayGame 类负责处理游戏逻辑和用户交互。其中,checklocation(int center) 方法旨在验证玩家选择的位置是否合法。然而,原始的 checklocation 方法仅检查了位置是否已被 'X' 或 'O' 占用:

public boolean checklocation(int center)
{
    if (location[center] == 'X' || location[center] == 'O')
    {
        System.out.println("That location is already occupied please choose another location");
        return true;
    }
    else {
        return false;
    }
}

当用户输入一个超出数组索引范围的数字(例如10)时,location[center] 访问将导致 ArrayIndexOutOfBoundsException,从而使程序崩溃。此外,如果用户输入的不是数字,Scanner.nextInt() 可能会抛出 InputMismatchException。本教程主要关注如何处理超出有效数字范围的情况。

解决方案:增强输入验证逻辑

要解决这个问题,我们需要在访问 location 数组之前,首先对用户输入的 center 值进行范围检查。只有当 center 值在有效范围 [1, 9] 内时,才进一步检查该位置是否已被占用。

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

以下是修改后的 checklocation 方法:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
public boolean checklocation(int center)
{
    // 首先检查输入位置是否在有效范围内 (1-9)
    if (center < 1 || 9 < center)
    {
        System.out.println("That location is not valid. Please choose a position between 1 and 9.");
        return true; // 表示输入无效,需要重新选择
    }
    // 如果位置在有效范围内,则检查该位置是否已被占用
    else if (location[center] == 'X' || location[center] == 'O')
    {
        System.out.println("That location is already occupied. Please choose another location.");
        return true; // 表示位置已被占用,需要重新选择
    }
    // 如果位置有效且未被占用
    else {
        return false; // 表示输入有效,可以进行下一步操作
    }
}

代码解析:

  1. 范围检查 (center : 这是新增的第一层验证。它确保玩家输入的数字 center 必须在 1 到 9 之间(包含 1 和 9)。
    • 如果 center 小于 1 或大于 9,程序会打印一条错误消息,并返回 true。true 的返回值表示当前输入是“无效的”,需要玩家重新输入。
  2. 占用检查 (location[center] == 'X' || location[center] == 'O'): 这一部分与原始逻辑相同,在通过范围检查后执行。它判断指定位置是否已被玩家 'X' 或电脑 'O' 占据。
    • 如果位置已被占用,同样打印错误消息并返回 true,提示玩家重新选择。
  3. 合法输入: 只有当 center 通过了范围检查且位置未被占用时,方法才返回 false,表示这是一个合法的、可以使用的位置。

整合到游戏循环

在 startplay() 方法中,while (currentlocation) 循环会根据 checklocation 的返回值来决定是否继续要求用户输入。由于 checklocation 在输入无效时返回 true,这个 while 循环会持续要求用户输入,直到他们提供一个有效且未被占用的位置。

public void startplay()
{
    int center;
    char blank = ' ';

    System.out.println( "gamer " + locategamer() +" will go first and be the letter 'X'" );

    do {
        presentBoard();

        System.out.println( "\n\n gamer " + locategamer() +" choose a location." );

        boolean currentlocation = true;
        while (currentlocation) { // 循环直到 currentlocation 为 false (即输入有效)
            Scanner in =new Scanner (System.in);
            // 考虑非整数输入:在生产环境中,这里应增加 try-catch 块处理 InputMismatchException
            // 或者使用 hasNextInt() 预判断
            center=in.nextInt();
            currentlocation = checklocation(center); // 调用增强后的验证方法
            if(currentlocation==false) // 如果输入有效,则放置棋子
                location[center]=locategamer();
        }

        System.out.println( "Excellent move" );

        presentBoard();

        latergamer();
    }while ( getWinner() == blank );
}

注意事项与最佳实践

  1. 明确的错误提示: 提供清晰、用户友好的错误消息至关重要。例如,当输入超出范围时,明确告知用户有效范围是 1 到 9。

  2. 处理非整数输入: 尽管原始问题主要关注整数值超限,但在实际应用中,用户可能会输入非数字字符。为了使程序更加健壮,可以在读取用户输入时使用 Scanner.hasNextInt() 进行预判断,并结合 try-catch 块来处理 InputMismatchException。

    // 示例:更健壮的输入读取
    Scanner in = new Scanner(System.in);
    int center;
    while (true) {
        System.out.println("\n\n gamer " + locategamer() + " choose a location.");
        if (in.hasNextInt()) { // 检查下一个输入是否是整数
            center = in.nextInt();
            // 清除缓冲区中的换行符
            in.nextLine(); 
            if (!checklocation(center)) { // 如果 checklocation 返回 false,表示输入有效
                location[center] = locategamer();
                break; // 退出输入循环
            }
        } else {
            System.out.println("Invalid input. Please enter a number between 1 and 9.");
            in.next(); // 消费掉无效输入,避免无限循环
        }
    }
  3. 单一职责原则: checklocation 方法现在同时负责范围检查和占用检查。这符合其“检查位置合法性”的职责。

总结

通过在 checklocation 方法中引入先进行范围检查再进行占用检查的逻辑,我们成功地解决了Java井字棋游戏因用户输入无效而导致程序崩溃的问题。这种前置验证机制不仅提升了程序的稳定性,也通过友好的错误提示改善了用户体验。在任何涉及用户输入的应用程序中,实现健壮的输入验证都是确保软件质量和可靠性的关键步骤。

相关文章

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3225

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4168

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2865

2025.08.29

location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

2902

2023.06.27

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.7万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn