CSIS课程GUI对战游戏项目:文件读写功能故障求助
解决游戏进度保存的文件读写问题
嘿,我看你在做CSIS课程的GUI对战游戏,还想着实现进度持久化——这个想法挺棒的,毕竟没人想每次打开游戏都从头打!不过文件读写出问题确实闹心,我先结合你给出的部分代码,帮你排查可能的坑,再给你一套能跑的解决方案。
首先,你贴的read()方法只写了开头,我猜大概率是这几个地方出问题了:
- 第一次运行游戏时,进度文件还没创建,Scanner直接抛异常,导致返回值一直是0
- 文件路径没搞对,比如你以为文件在项目根目录,但实际程序找的是其他位置
- 文件内容格式不对(比如不小心写了非数字字符),读取时直接报错
- 没有处理读取时的异常,导致程序悄悄崩溃或者进度重置
我给你写一套完整的读写方法,把这些坑都填上:
读取进度的方法
private static int readWinCount() { int winCount = 0; // 把进度文件放在项目根目录,名字叫win_progress.txt File progressFile = new File("win_progress.txt"); try (Scanner scanner = new Scanner(progressFile)) { // 先判断文件里有没有整数,避免格式错误 if (scanner.hasNextInt()) { winCount = scanner.nextInt(); } } catch (FileNotFoundException e) { // 第一次运行没文件很正常,不用慌,返回初始值0就行 System.out.println("首次运行,未找到进度文件,将创建新文件"); } catch (InputMismatchException e) { // 如果文件里写了不是数字的内容,直接重置进度为0并保存 System.out.println("进度文件格式错误,已重置进度"); writeWinCount(0); } catch (Exception e) { // 其他未知错误,打印日志方便调试 e.printStackTrace(); } return winCount; }
写入进度的方法
private static void writeWinCount(int winCount) { File progressFile = new File("win_progress.txt"); try (PrintWriter writer = new PrintWriter(progressFile)) { writer.println(winCount); System.out.println("当前进度已保存:已击败" + winCount + "个对手"); } catch (FileNotFoundException e) { System.out.println("无法写入进度文件,请检查文件权限"); e.printStackTrace(); } }
怎么在你的游戏里用
- 游戏启动的时候,先加载进度:
int currentWins = readWinCount(); - 每次击败一个对手后,更新计数并保存:
currentWins++; writeWinCount(currentWins); // 判断是否达到胜利条件 if (currentWins >= 5) { // 显示你的"YOU WIN"提示,比如用JOptionPane或者GUI组件 JOptionPane.showMessageDialog(null, "YOU WIN"); // 可以重置进度或者让玩家重新开始 writeWinCount(0); }
额外提醒
- 如果你的GUI游戏以后要打包成Jar,最好把进度文件放在用户的文档目录里(比如
System.getProperty("user.home") + "/Documents/GameProgress.txt"),避免权限问题或者找不到文件 - 如果是多线程的游戏(比如动画和逻辑分开线程),读写文件的时候要加同步锁,防止同时读写导致的文件损坏
- 要是想更靠谱,也可以用Properties类或者JSON来存进度,不过对于简单的计数来说,文本文件足够用了
内容的提问来源于stack exchange,提问作者Jared27
相关产品推荐
相关产品推荐

