0

在我正在开发的游戏中,我有一个String显示分数的游戏,问题是代码将其保存String到文件中。我不希望文件不断保存分数,因为分数会随着您玩游戏而更新。因此,我从这样的摇摆定时器运行该方法。

        Timer timer = new Timer(1, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                save();
            } 
        });
        timer.start();

保存方法看起来像这样,它应该可以工作,因为我在不久前制作的文本程序中使用了完全相同的代码。

    public void save(){
        try{
            getScore = new File("Score.dat");
            scoreFile = new FileOutputStream(getScore);
            byte[] saveScore = score.getBytes();
            scoreFile.write(saveScore);
            scoreFile.close();
        }catch(FileNotFoundException ex){

        }catch(IOException ex){

        }
    }

我在游戏的开始屏幕上有两个按钮,New Game还有Continue. 我已经做到了,如果你按下New Game文件,它将把它的文本更新为 0,如果你按下Continue,代码将照常进行,分数将等于文件中显示的分数。这是ActionListener两个按钮的。

    public void actionPerformed(ActionEvent e){
    Object command = e.getSource(); 
    if(command.equals(newGame)){
        try{
            PrintWriter pw = new PrintWriter(new File("Score.dat"));
            pw.print("0");
            pw.close();
        }catch (FileNotFoundException ex){

        }
        startGame = true;
    }
    if(command.equals(contGame)){
        startGame = true;
    }
}

该文件是正常创建的,我没有收到任何错误,但文件没有更新,它里面总是一个 0。我尝试使用PrintWriter,而不是FileOutputStream因为它可以将文件的文本设置为 0,但是当我在pw.print(score);文件资源管理器崩溃的情况下使用它时,我必须重新启动我的通勤者。

编辑:

我已经弄清楚问题是什么,但我不知道如何解决它。当我打印出分数时,结果将如下所示:0, 0, 0, 0, 10, 0, 0, 0, 0, 20, 0, 0, 0, 0, 30(如果文件内的数字是0,如果是 50,则将所有 0 替换为 50) 等等。

因此,如您所见,文件只有 25% 的机会更新分数。我不知道为什么会发生这种情况,因为我的代码中看不到任何可能导致这种情况的地方。

这是加载分数的代码。

    public void load(){
        try{
            br = new BufferedReader(new FileReader("Score.dat"));
            score = br.readLine();
        }catch (FileNotFoundException ex){

        }catch(IOException ex){

        }
    }

该方法通过load();public Player()方法中运行一次(Player是类的名称)。

4

2 回答 2

0

我不想建议这个,但你确定你的变量在方法score中是非零的吗?save()您可能会考虑在其中放置一行以打印 的值以score进行调试,或检查调试器中的值。这种方法没有明显的问题,并且它在没有 a 的情况下也可以工作flush(),因为 aPrintWriterclose()按照Writer.

正如反斜杠所指出的,您可能想要增加计时器的睡眠时间,一毫秒真的很短。

于 2013-05-01T16:29:04.213 回答
0

您可能遇到同步问题。只制作一种获取分数并将其写入文件的方法。在新游戏上调用此方法,继续,关闭窗口(如果它是 java 框架),并在您的计时器中。但是让计时器至少 250 毫秒

synchronized void save(int score) {
    PrintWriter pw = null;//any resource with IO should be in a finally block to close
    try {
        pw = new PrintWriter(new File("Score.dat"));
        pw.print("" + score);
        pw.close();
    } catch (Exception ex) {
        System.out.println("save err " + ex);
        ex.printStackTrace();
        // or better get a logger
        // logger.log(Level.WARNING,"save err " + ex ,ex);

    }finally{
        if (pw != null) {
            try {
                pw.close();
            } catch (Throwable e) {
                logger.log(Level.FINER, "err close :pw" , e);
            }
        }           
    }
}

编辑:最好将您的分数 var 保持为 int 或 long,编辑您的代码以便相应地阅读

于 2013-05-01T17:27:26.203 回答