资讯动态

从ATM取款机到游戏菜单:用Java循环和Scanner打造你的第一个命令行交互程序(附完整代码)

发布时间:2026/8/20 3:55:12 来源:尧图企业网站定制
从ATM取款机到游戏菜单用Java循环和Scanner打造你的第一个命令行交互程序当你第一次学习Java基础语法时课本上的例子往往让人提不起兴趣——打印星星、计算数字这些简单的练习很难让你感受到编程的乐趣。但你知道吗这些看似枯燥的循环和条件语句正是构建交互式程序的基础。本文将带你跳出课本习题用while循环、Scanner输入和简单的控制逻辑打造一个完整的命令行交互程序。1. 为什么需要交互式程序在真实开发中程序很少是单向执行的。想想你每天使用的软件ATM机需要你输入密码和金额游戏菜单需要你选择角色和装备学生管理系统需要查询和修改数据。这些场景都有一个共同点——程序需要根据用户输入做出不同响应并且持续运行直到用户主动退出。传统课本上的循环练习如打印10x10的星号矩阵虽然能教会你语法但缺乏真实感。让我们换个思路用循环结构来实现这些实用场景// 传统练习打印星号矩阵 for(int i0; i10; i){ for(int j0; j10; j){ System.out.print(*); } System.out.println(); } // 交互式程序游戏菜单框架 while(true){ showMenu(); int choice getUserInput(); processChoice(choice); }前者只是机械地重复输出后者却能创建真正的用户对话。这就是我们要追求的学习方式——用基础语法解决实际问题。2. 构建交互程序的核心组件2.1 循环结构的选择Java提供了三种主要的循环结构每种适合不同场景循环类型特点适用场景while先判断条件后执行不确定循环次数时如菜单系统do-while先执行一次再判断条件至少需要执行一次时如密码重试for明确循环次数遍历数组、固定次数的操作对于交互程序while循环是最自然的选择boolean running true; while(running){ // 显示菜单 // 获取输入 // 处理逻辑 // 根据输入可能设置runningfalse }2.2 Scanner输入处理java.util.Scanner是处理控制台输入的利器。关键方法包括nextInt(): 读取整数nextLine(): 读取整行文本nextDouble(): 读取浮点数注意混合使用不同Scanner方法时要注意换行符的处理。建议在读取数字后调用nextLine()消耗换行符。2.3 流程控制技巧break: 立即退出当前循环continue: 跳过本次循环剩余部分return: 从方法返回如果在循环中这些控制语句能让你更灵活地管理程序流程。3. 实战游戏角色菜单系统让我们用上述知识构建一个简易的游戏角色管理系统。功能包括查看角色属性装备武器使用道具退出游戏3.1 基础框架搭建import java.util.Scanner; public class GameMenuSystem { public static void main(String[] args) { Scanner scanner new Scanner(System.in); boolean gameRunning true; // 角色初始属性 String characterName 冒险者; int health 100; String weapon 木剑; int potions 3; while(gameRunning) { System.out.println(\n 角色菜单 ); System.out.println(1. 查看角色属性); System.out.println(2. 装备武器); System.out.println(3. 使用道具); System.out.println(4. 退出游戏); System.out.print(请选择操作: ); int choice; try { choice scanner.nextInt(); scanner.nextLine(); // 消耗换行符 } catch(Exception e) { System.out.println(输入无效请输入数字1-4); scanner.nextLine(); // 清除错误输入 continue; } // 处理用户选择 switch(choice) { case 1: // 查看属性逻辑 break; case 2: // 装备武器逻辑 break; case 3: // 使用道具逻辑 break; case 4: gameRunning false; break; default: System.out.println(无效选择请重新输入); } } System.out.println(游戏结束再见); scanner.close(); } }3.2 完善各功能模块查看角色属性System.out.println(\n 角色属性 ); System.out.println(名称: characterName); System.out.println(生命值: health); System.out.println(当前武器: weapon); System.out.println(道具数量: potions);装备武器System.out.println(\n可选择的武器:); System.out.println(1. 铁剑 (攻击力10)); System.out.println(2. 长弓 (攻击力15)); System.out.println(3. 法杖 (攻击力20)); System.out.print(选择要装备的武器: ); int weaponChoice scanner.nextInt(); scanner.nextLine(); // 消耗换行符 switch(weaponChoice) { case 1: weapon 铁剑; break; case 2: weapon 长弓; break; case 3: weapon 法杖; break; default: System.out.println(无效选择保持原武器); } System.out.println(已装备: weapon);使用道具if(potions 0) { System.out.println(使用道具生命值恢复30点); health 30; potions--; System.out.println(剩余道具: potions); System.out.println(当前生命值: health); } else { System.out.println(没有可用道具了); }3.3 异常处理增强良好的交互程序应该能处理各种异常输入// 在获取数字输入的地方添加try-catch try { choice scanner.nextInt(); scanner.nextLine(); // 消耗换行符 } catch(Exception e) { System.out.println(输入无效请输入数字1-4); scanner.nextLine(); // 清除错误输入 continue; }4. 扩展思路学生成绩查询系统同样的框架可以轻松改造成其他实用程序。比如学生成绩查询系统import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class StudentGradeSystem { public static void main(String[] args) { Scanner scanner new Scanner(System.in); boolean systemRunning true; // 模拟学生数据 MapString, Integer grades new HashMap(); grades.put(张三, 85); grades.put(李四, 92); grades.put(王五, 78); while(systemRunning) { System.out.println(\n 学生成绩管理系统 ); System.out.println(1. 查询成绩); System.out.println(2. 添加学生); System.out.println(3. 修改成绩); System.out.println(4. 退出系统); System.out.print(请选择操作: ); int choice scanner.nextInt(); scanner.nextLine(); // 消耗换行符 switch(choice) { case 1: System.out.print(输入学生姓名: ); String name scanner.nextLine(); if(grades.containsKey(name)) { System.out.println(name 的成绩是: grades.get(name)); } else { System.out.println(找不到该学生); } break; case 2: System.out.print(输入新学生姓名: ); String newName scanner.nextLine(); System.out.print(输入成绩: ); int newGrade scanner.nextInt(); scanner.nextLine(); grades.put(newName, newGrade); System.out.println(添加成功); break; case 3: System.out.print(输入要修改的学生姓名: ); String updateName scanner.nextLine(); if(grades.containsKey(updateName)) { System.out.print(输入新成绩: ); int updatedGrade scanner.nextInt(); scanner.nextLine(); grades.put(updateName, updatedGrade); System.out.println(修改成功); } else { System.out.println(找不到该学生); } break; case 4: systemRunning false; break; default: System.out.println(无效选择); } } System.out.println(系统已退出); scanner.close(); } }这个例子展示了如何用相同的循环和输入处理框架构建完全不同功能的交互程序。5. 最佳实践与常见陷阱5.1 交互程序设计原则清晰的用户引导每个步骤都要明确告诉用户可以做什么一致的交互模式保持输入输出风格一致健壮的错误处理预料可能的错误输入并妥善处理简洁的界面避免信息过载合理分页5.2 常见问题与解决方案问题1Scanner输入混乱现象混合使用nextInt()和nextLine()时出现跳过输入解决在nextInt()后立即调用nextLine()消耗换行符int num scanner.nextInt(); scanner.nextLine(); // 消耗换行符问题2无限循环现象程序无法退出一直循环解决确保有明确的退出条件并测试所有分支while(running) { // ... if(choice EXIT_OPTION) { running false; // 确保这个条件能被触发 } }问题3代码重复现象相似的处理逻辑在多处重复解决将重复代码提取为方法private static int getMenuChoice(Scanner scanner, int maxOption) { while(true) { try { int choice scanner.nextInt(); scanner.nextLine(); if(choice 1 choice maxOption) { return choice; } System.out.println(请输入1- maxOption 之间的数字); } catch(Exception e) { System.out.println(请输入有效的数字); scanner.nextLine(); } } }6. 进一步优化方向6.1 添加更多功能保存/加载数据到文件添加密码验证功能实现更复杂的业务逻辑6.2 改进用户体验添加颜色输出使用ANSI转义码实现多级菜单系统添加ASCII艺术标题public static void printTitle() { System.out.println( ____ _ _ _ _ ); System.out.println( / ___|| |_ __ _| |_(_)___| |); System.out.println( \\___ \\| __/ _ | __| / __| |); System.out.println( ___) | || (_| | |_| \\__ \\_|); System.out.println( |____/ \\__\\__,_|\\__|_|___(_)); System.out.println(); }6.3 代码结构优化使用面向对象设计将不同功能封装到类中使用枚举定义菜单选项实现命令模式处理用户输入enum MenuOption { VIEW_STATS(查看属性, 1), EQUIP_WEAPON(装备武器, 2), USE_ITEM(使用道具, 3), EXIT(退出游戏, 4); private String description; private int code; // 构造函数、getter方法等 } // 使用示例 for(MenuOption option : MenuOption.values()) { System.out.println(option.getCode() . option.getDescription()); }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价