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

修复Java Tic-Tac-Toe游戏输入验证与异常处理教程

陌丽姑娘_7062

陌丽姑娘_7062

发布时间:2025-11-14 17:18:02

|

313人浏览过

|

来源于php中文网

原创

修复Java Tic-Tac-Toe游戏输入验证与异常处理教程

本教程旨在解决java tic-tac-toe游戏中因玩家输入无效(如超出棋盘范围或已占用位置)而导致的程序崩溃问题。我们将详细介绍如何通过增强输入验证逻辑来确保游戏稳定运行,提升用户体验,并提供具体的代码示例和最佳实践建议。

Java Tic-Tac-Toe游戏输入验证与异常处理

在开发交互式游戏,尤其是像Tic-Tac-Toe这样需要用户输入的游戏时,对用户输入进行严格的验证是至关重要的。如果不对输入进行检查,玩家输入超出预期范围或格式不正确的数据可能导致程序崩溃,如数组越界异常(ArrayIndexOutOfBoundsException)或逻辑错误。本教程将以一个典型的Java Tic-Tac-Toe游戏为例,展示如何通过改进输入验证逻辑来解决此类问题。

问题描述

在一个Tic-Tac-Toe游戏中,常见的崩溃场景包括:

  1. 输入数字超出有效范围:例如,玩家输入一个大于9或小于1的数字,而游戏棋盘位置通常编号为1到9。这可能导致尝试访问数组中不存在的索引,从而引发 ArrayIndexOutOfBoundsException。
  2. 输入已占用的位置:玩家选择了一个已经被“X”或“O”占据的位置。虽然这通常不会直接导致程序崩溃,但会造成游戏逻辑混乱,影响用户体验。

原始代码中的 PlayGame 类在处理玩家输入时,checklocation 方法虽然检查了位置是否被占用,但缺少对输入值是否在1-9有效范围内的验证,从而引发了上述问题。

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

解决这类问题的核心在于在处理用户输入之前,对其进行全面的验证。我们需要确保玩家输入的数字:

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

  1. 在有效范围内:即1到9之间。
  2. 尚未被占用:该位置目前为空。

我们将重点修改 PlayGame 类中的 checklocation 方法,使其能够同时处理这两种验证。

原始 checklocation 方法(简化版)

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; // 位置有效且未被占用
    }
}

原始方法只检查了位置是否被占用。当 center 的值超出 location 数组的有效索引范围(1到9)时,location[center] 表达式会抛出 ArrayIndexOutOfBoundsException。

改进后的 checklocation 方法

为了解决上述问题,我们首先需要验证输入数字是否在有效范围内。将范围检查置于所有其他检查之前,可以有效避免数组越界。

public boolean checklocation(int center)
{
    // 1. 检查输入是否在有效范围 (1-9)
    if (center < 1 || 9 < center)
    {
        System.out.println("That location is not valid please choose another location");
        return true; // 输入无效,需要重新输入
    }
    // 2. 如果在有效范围内,则检查位置是否已被占用
    else if (location[center] == 'X' || location[center] == 'O')
    {
        System.out.println("That location is already occupied please choose another location");
        return true; // 位置已被占用,需要重新输入
    }
    // 3. 输入有效且位置未被占用
    else {
        return false; // 输入完全有效
    }
}

代码解析:

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

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

下载
  • if (center : 这是新增的关键部分。它在访问 location 数组之前,首先判断玩家输入的 center 值是否小于1或大于9。如果条件为真,说明输入超出了有效范围,程序会打印错误信息并返回 true,指示需要重新输入。
  • else if (location[center] == 'X' || location[center] == 'O'): 只有当 center 值通过了范围检查后,才会执行此处的逻辑,安全地检查 location[center] 是否已被占用。
  • else { return false; }: 如果通过了所有检查,说明玩家输入了一个有效且未被占用的位置,此时返回 false,允许游戏继续。

在游戏循环中集成验证

PlayGame 类中的 startplay 方法通过一个 while (currentlocation) 循环来不断请求玩家输入,直到 checklocation 返回 false(表示输入有效)。

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) {
            Scanner in =new Scanner (System.in);
            center=in.nextInt(); // 获取玩家输入
            currentlocation = checklocation(center); // 验证输入
            if(currentlocation==false) // 如果输入有效 (checklocation返回false)
                location[center]=locategamer(); // 放置棋子
        }

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

        presentBoard();

        latergamer();
    }while ( getWinner() == blank ); // 游戏未结束则继续
}

通过上述修改,当玩家输入无效位置时,checklocation 方法会返回 true,while (currentlocation) 循环会继续执行,再次提示玩家输入,直到输入有效为止。这从根本上解决了程序因无效输入而崩溃的问题。

进一步的注意事项与最佳实践

  1. 处理非整数输入:Scanner.nextInt() 方法在遇到非整数输入时会抛出 InputMismatchException。为了使游戏更加健壮,应该使用 try-catch 块来捕获并处理这类异常。

    Scanner in = new Scanner(System.in);
    int center;
    while (true) {
        try {
            System.out.println("\n\n gamer " + locategamer() + " choose a location.");
            center = in.nextInt();
            // 清除缓冲区中剩余的换行符
            in.nextLine(); 
            if (!checklocation(center)) { // 如果checklocation返回false,表示输入有效
                location[center] = locategamer();
                break; // 跳出输入循环
            }
        } catch (InputMismatchException e) {
            System.out.println("Invalid input! Please enter a number between 1 and 9.");
            in.next(); // 消费掉错误的输入,防止无限循环
        }
    }

    请注意,上述代码片段是 startplay 方法中输入部分的更健壮实现,它将替代原有的 while (currentlocation) 循环。

  2. 单一职责原则:checklocation 方法现在负责两项检查:范围和占用。这符合单一职责原则,因为它只关注验证一个位置的有效性。

  3. 清晰的用户反馈:在输入无效时提供明确的错误消息,指导用户如何正确操作,是提升用户体验的关键。

  4. 代码复用:checklocation 这样的验证方法可以被游戏的任何部分调用,确保了代码的一致性和可维护性。

总结

通过对Java Tic-Tac-Toe游戏中的输入验证逻辑进行增强,特别是改进 checklocation 方法,我们成功地解决了因玩家输入超出有效范围或已占用位置而导致的程序崩溃问题。这不仅提高了游戏的稳定性和健壮性,也显著改善了玩家的游戏体验。在任何需要用户输入的应用程序中,实现严格且友好的输入验证都是一项不可或缺的最佳实践。

相关文章

在线游戏
在线游戏

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

下载

相关标签:

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

热门AI工具

更多
豆包大模型

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

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

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

Laper
Laper Hot

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

DeepSeek

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
while的用法
while的用法

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

354

2023.09.25

location.assign
location.assign

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

2882

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

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

40

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

20

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