当前位置: 首页 > news >正文

基于Java Swing的猜数字小游戏(2)

1、演示视频

基于Java Swing的猜数字小游戏

2、项目截图

三、设计说明

3.1 整体架构设计

项目采用单一类封装所有功能(GuessNumberGame),继承自Swing的JFrame类,遵循“界面与逻辑结合”的设计模式(适合小型桌面应用),主要分为以下模块:

  1. 组件初始化模块:通过initComponents()方法初始化所有GUI组件(窗口、面板、输入框、按钮、文本域等),设置组件属性和布局。
  2. 游戏数据初始化模块:通过initGame()方法初始化游戏核心数据(谜底、猜测次数、猜测历史集合、数字范围最大值)。
  3. 事件监听模块:通过bindEvents()方法为按钮、输入框、下拉框绑定事件监听器,处理用户的交互操作。
  4. 业务逻辑处理模块:包含handleSubmit()(处理提交猜测)、handleReset()(处理游戏重置)、setMaxNumberByDifficulty()(根据难度设置数字范围)、updateGuessRecord()(更新猜测历史显示)等方法,处理核心业务逻辑。

3.2 界面布局设计

界面采用Swing的边界布局(BorderLayout)和流式布局(FlowLayout)、网格布局(GridLayout)组合使用,分为三个主要区域:

  • 顶部区域:包含难度选择下拉框和游戏提示标签,使用流式布局,居中显示。
  • 中间区域:包含输入框和提交按钮,使用流式布局,居中显示。
  • 底部区域:分为上下两部分,上部分包含提示标签和猜测历史滚动文本域(边界布局),下部分包含重置按钮(流式布局),整体使用网格布局。

3.3 数据结构设计

  • int targetNumber:存储随机生成的谜底数字。
  • int guessCount:记录用户的猜测次数。
  • List<Integer> guessNumbers:存储用户本次游戏的所有猜测数字,使用ArrayList实现,支持动态添加和遍历。
  • int maxNumber:存储当前难度对应的数字范围最大值。

3.4 组件设计

组件类型组件名称功能描述
JComboBoxdifficultyComboBox难度等级选择下拉框,提供三个难度选项
JTextFieldinputField用户输入猜测数字的文本框
JButtonsubmitButton提交用户猜测的按钮
JButtonresetButton重置游戏的按钮
JLabelhintLabel显示游戏提示信息的标签
JTextArea + JScrollPaneguessRecordTextArea显示猜测历史的文本域,包裹在滚动面板中

四、算法说明

4.1 随机数生成算法

使用Java内置的Random类生成指定范围的随机整数,核心代码逻辑:

  • 步骤1:根据难度等级确定数字范围的最大值maxNumber(如简单难度为50)。
  • 步骤2:调用Random.nextInt(maxNumber)生成0到maxNumber-1的随机整数。
  • 步骤3:将生成的随机数加1,得到1到maxNumber的随机整数(即谜底)。

该算法保证了随机数在指定范围内均匀分布,满足游戏的随机性要求。

4.2 猜测结果判断算法

核心逻辑为比较用户输入的数字与谜底的大小关系,步骤如下:

  1. 获取用户输入的文本内容,进行非空、格式、范围验证。
  2. 将验证通过的文本转换为整数userInput
  3. 比较userInputtargetNumber
    • userInput > targetNumber:提示“猜大了”,并记录猜测次数。
    • userInput < targetNumber:提示“猜小了”,并记录猜测次数。
    • userInput == targetNumber:提示猜对了,显示猜测次数,并禁用相关组件。

4.3 猜测历史拼接算法

guessNumbers集合中的数字拼接为字符串,显示在文本域中,核心逻辑:

  1. 判断集合是否为空,若为空则显示“你猜过的数字:无”。
  2. 若集合非空,使用StringBuilder拼接字符串,开头为“你猜过的数字:”,后续依次添加集合中的数字,数字之间用中文逗号分隔。
  3. 遍历集合时,判断是否为最后一个元素,若不是则添加分隔符,避免末尾出现多余符号。

使用StringBuilder而非字符串拼接(+),提升了字符串拼接的效率,尤其在猜测次数较多时效果明显。

五、测试说明

5.1 测试环境

  • 操作系统:Windows 10/11、macOS、Linux(兼容Java的操作系统均可)。
  • JDK版本:JDK 8、JDK 11、JDK 17(测试验证兼容各版本)。
  • 开发工具:IntelliJ IDEA 2023.1、Eclipse 2022-12。

5.2 测试用例

测试用例ID测试场景测试步骤预期结果测试结果
TC001空输入提交1. 打开游戏;2. 直接点击提交按钮提示“请输入数字后再提交!”,输入框保持为空通过
TC002非数字输入1. 打开游戏;2. 输入“abc”并提交提示“请输入有效的整数!”,输入框清空通过
TC003超出范围输入(简单难度)1. 选择简单难度(1-50);2. 输入“51”并提交提示“请输入1到50之间的数字!”,输入框清空通过
TC004猜大了提示1. 中等难度,谜底为50;2. 输入“60”并提交提示“猜大了!你已经猜了1次”,输入框清空,历史记录添加60通过
TC005猜小了提示1. 中等难度,谜底为50;2. 输入“40”并提交提示“猜小了!你已经猜了1次”,输入框清空,历史记录添加40通过
TC006猜对数字1. 中等难度,谜底为50;2. 输入“50”并提交提示“恭喜你猜对了!谜底是50,你一共猜了N次”,输入框和提交按钮禁用通过
TC007难度切换1. 打开游戏,选择简单难度;2. 切换为困难难度游戏重置,数字范围变为1-200,输入框和历史记录清空通过
TC008重置游戏1. 猜对数字后;2. 点击重置游戏按钮游戏重置,所有组件恢复可用,输入框和历史记录清空通过
TC009大量猜测记录1. 连续输入20个不同数字并提交历史记录文本域显示所有数字,出现滚动条,可滚动查看通过
TC010回车键提交1. 输入数字;2. 按回车键与点击提交按钮效果一致,正常处理猜测逻辑通过

5.3 测试结论

所有测试用例均通过验证,程序能够正确处理各种输入场景和用户操作,功能完整,交互体验良好,无明显bug和异常情况。

六、关键代码

6.1 组件初始化核心代码

/** * 初始化所有GUI组件 */ private void initComponents() { // 设置窗口属性 setTitle("猜数字小游戏"); setSize(550, 320); // 适配滚动面板的窗口大小 setLocationRelativeTo(null); // 窗口居中 setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); // 禁止调整窗口大小 // 创建主面板,使用边界布局 mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 顶部面板:难度选择 + 标题提示 JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0)); JLabel difficultyLabel = new JLabel("难度选择:"); // 初始化难度下拉框,默认选中中等 difficultyComboBox = new JComboBox<>(new String[]{"简单(1-50)", "中等(1-100)", "困难(1-200)"}); difficultyComboBox.setSelectedIndex(1); JLabel titleLabel = new JLabel("猜一个对应范围的整数:"); topPanel.add(difficultyLabel); topPanel.add(difficultyComboBox); topPanel.add(titleLabel); mainPanel.add(topPanel, BorderLayout.NORTH); // 中间面板:输入框和提交按钮 JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0)); inputField = new JTextField(10); submitButton = new JButton("提交"); centerPanel.add(inputField); centerPanel.add(submitButton); mainPanel.add(centerPanel, BorderLayout.CENTER); // 底部面板:提示+历史记录 + 重置按钮 JPanel bottomPanel = new JPanel(new GridLayout(2, 1, 10, 10)); JPanel hintRecordPanel = new JPanel(new BorderLayout(10, 0)); hintLabel = new JLabel("请开始猜数字吧!", SwingConstants.CENTER); // 初始化猜测历史文本域,支持滚动和换行 guessRecordTextArea = new JTextArea(3, 30); guessRecordTextArea.setEditable(false); guessRecordTextArea.setLineWrap(true); guessRecordTextArea.setWrapStyleWord(true); guessRecordTextArea.setText("你猜过的数字:无"); JScrollPane scrollPane = new JScrollPane(guessRecordTextArea); scrollPane.setBorder(BorderFactory.createTitledBorder("猜测历史")); hintRecordPanel.add(hintLabel, BorderLayout.NORTH); hintRecordPanel.add(scrollPane, BorderLayout.CENTER); JPanel resetPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); resetButton = new JButton("重置游戏"); resetPanel.add(resetButton); bottomPanel.add(hintRecordPanel); bottomPanel.add(resetPanel); mainPanel.add(bottomPanel, BorderLayout.SOUTH); }

6.2 提交猜测核心逻辑代码

/** * 处理提交猜数字的逻辑 */ private void handleSubmit() { // 获取输入内容并去除首尾空格 String inputText = inputField.getText().trim(); // 验证输入是否为空 if (inputText.isEmpty()) { hintLabel.setText("请输入数字后再提交!"); return; } int userInput; try { // 转换为整数,处理非数字输入异常 userInput = Integer.parseInt(inputText); } catch (NumberFormatException ex) { hintLabel.setText("请输入有效的整数!"); inputField.setText(""); return; } // 验证数字是否在指定范围内 if (userInput < 1 || userInput > maxNumber) { hintLabel.setText("请输入1到" + maxNumber + "之间的数字!"); inputField.setText(""); return; } // 猜测次数加1 guessCount++; // 添加到猜测历史集合 guessNumbers.add(userInput); // 更新历史记录显示 updateGuessRecord(); // 判断猜测结果 if (userInput > targetNumber) { hintLabel.setText("猜大了!你已经猜了" + guessCount + "次"); inputField.setText(""); } else if (userInput < targetNumber) { hintLabel.setText("猜小了!你已经猜了" + guessCount + "次"); inputField.setText(""); } else { // 猜对数字,显示结果并禁用相关组件 hintLabel.setText("恭喜你猜对了!谜底是" + targetNumber + ",你一共猜了" + guessCount + "次"); inputField.setEnabled(false); submitButton.setEnabled(false); difficultyComboBox.setEnabled(false); } // 输入框获得焦点,方便继续输入 inputField.requestFocus(); }

6.3 猜测历史更新代码

/** * 更新猜测记录的界面显示(优化拼接逻辑,避免多余符号) */ private void updateGuessRecord() { if (guessNumbers.isEmpty()) { guessRecordTextArea.setText("你猜过的数字:无"); } else { // 使用StringBuilder高效拼接字符串 StringBuilder sb = new StringBuilder("你猜过的数字:"); for (int i = 0; i < guessNumbers.size(); i++) { sb.append(guessNumbers.get(i)); // 最后一个数字后不添加逗号 if (i != guessNumbers.size() - 1) { sb.append(","); } } guessRecordTextArea.setText(sb.toString()); } }

6.4 难度等级处理代码

/** * 根据难度选择设置数字范围的最大值 */ private void setMaxNumberByDifficulty() { int selectedIndex = difficultyComboBox.getSelectedIndex(); switch (selectedIndex) { case 0: // 简单难度:1-50 maxNumber = 50; break; case 1: // 中等难度:1-100 maxNumber = 100; break; case 2: // 困难难度:1-200 maxNumber = 200; break; default: // 默认中等难度 maxNumber = 100; } }

6.5 游戏重置代码

/** * 处理重置游戏的逻辑 */ private void handleReset() { // 重新初始化游戏数据 initGame(); // 清空输入框 inputField.setText(""); // 恢复组件功能 inputField.setEnabled(true); submitButton.setEnabled(true); difficultyComboBox.setEnabled(true); // 重置提示文字 hintLabel.setText("请开始猜数字吧!"); // 重置历史记录显示 guessRecordTextArea.setText("你猜过的数字:无"); // 输入框获得焦点 inputField.requestFocus(); }
http://www.cnnetsun.cn/news/40652.html

相关文章:

  • 提升 Web 端 JavaScript 的可信度:WAICT 体系详解
  • Solon (可替换 SpringBoot)集成 Docker 实战:30分钟搞定轻量级应用容器化部署
  • 一次 React 项目 lock 文件冲突修复:从 Hook 报错到 Vite 配置优化
  • 记录一次USB虚拟网络问题排查
  • 学Simulink——基于高比例可再生能源渗透的复杂电网建模场景实例:大规模光伏并网对区域电网频率稳定影响研究
  • CANN Samples(十九):特色场景:机器人 AI 绘画 手写识别等
  • 毕设开源 深度学习YOLO交通路面缺陷检测系统(源码+论文)
  • 【URP】Unity[后处理]色彩调整ColorAdjustments
  • Flutter混合开发与WebView集成实战
  • 压缩空气储能和释能阶段模型,附相关文档文献。 建立了压缩空气储能系统中的压缩机、换热器、储气罐...
  • Profinet转Modbus TCP工业数据采集网关:实现1200PLC 与打标卡数据实时传输
  • Flutter 2025 国际化与本地化实战:从多语言支持到文化适配,打造真正全球化的用户体验
  • P1178 到天宫做客 题解
  • 2025年GEO优化机会与争议以及规范发展的必要性
  • 2026老年春晚怀化区域节目征集启动仪式在怀化学院举行
  • 【笔记篇】【硬件基础篇】电力电子元器件应用手册 阅读笔记(1)电阻器及其应用
  • 柠檬 软件测试之python全栈自动化测试工程师第25期
  • 为什么你的视觉AI项目总是耗时又低效?Florence-2-large-ft一站式解决方案
  • 基于php的微信小程序的学习交流平台系统(源码+lw+部署文档+讲解等)
  • springboot高校读书分享系统的设计与实现_34ur7fyk-
  • 如何快速解锁RouterOS无限权限:MikroTikPatch的终极指南
  • 测试工程师的增值型职业休假策略:从技术深耕到跨界突破
  • USART串口
  • SDET职业生涯中的关键决策点与路径选择
  • 第三方API密集型聚合服务的测试体系构建
  • System Informer:你的Windows系统管家,3大核心功能深度解析
  • 探索城市脉搏:解密共享单车数据背后的故事
  • 如何用abogen构建高质量有声书生成系统:从单文件到批量处理的完整指南
  • FastText实战进阶:解锁文本处理的极致性能与多场景应用
  • 车载功能测试都要做什么?总结来了~