保存游戏得分

时间:2016-05-13 18:33:27

标签: java save load bufferedreader bufferedwriter

我正试图为一个刽子手游戏制作一个高分。所以我需要保存它,所以每次你开始游戏或返回菜单都没有重启..所以我有一个游戏状态记录游戏结束时的输赢,如果用户离开之前解决它会增加一个损失。我发现了一个通过SavaData文件保存的教程..问题是它保存了一个空文件,但是有2个空行..所以我得到一个numberformatexception null ..我之前有它工作但它仍然无法读取该行并将返回一个错误numberformatexception Integer.parseInt ..我知道问题是在阅读行,现在我不知道出了什么问题请帮帮我..什么错了代码?感谢名单

这是保存代码......

 private void createSaveData() {

        File file = new File(saveDataPath, filename);
        try {

            FileWriter output = new FileWriter(file);
            BufferedWriter writer = new BufferedWriter(output);
            writer.write("" + 0);
            writer.newLine();
            writer.write("" + 0);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void setScores() {

        FileWriter output = null;

        try {

            File F = new File(saveDataPath, filename);
            output = new FileWriter(F);
            BufferedWriter writer = new BufferedWriter(output);
            writer.write(wins);
            writer.newLine();
            writer.write(losses);
            writer.close();

        }catch (Exception e){
        e.printStackTrace();
    }
}

private void loadScores() {
    try {

        File F = new File(saveDataPath, filename);

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(F)));

        String line = reader.readLine();

        line = reader.readLine();
        wins = Integer.parseInt(line);

        line = reader.readLine();
        losses = Integer.parseInt(line);

        reader.close();


    } catch (Exception e) {
        e.printStackTrace();
    }

}
然后我添加loadScore();在playstate的乞讨..和setScore();赢得++或亏损之后......

我有另一个调用playstate的高速状态,并以整数形式获得胜利和失败,并且没有问题,因为它会绘制0,0。

在我的渲染方法中,如果尝试太多或者猜对了正确的答案,我就有这个...

    if (tries == 6) {

        currentWord = ranWord;
        execcurrentframe.setRegion(eman.ExecLoss.getKeyFrame(elapsedTime, false));
        hangcurrentframe.setRegion(hman.hangdead.getKeyFrame(elapsedTime, false));
        Wordsfont.draw(batch, "Game Over", eman.getPosition().x + 60, hman.getPosition().y + 70);
        batch.draw(fu, 160, 510);

        if (leverpressed == false){

            bksound.stop();
            lever.play();
            leverpressed = true;

        }

        if (lossrecorded == false) {
            losses += 1;
            System.out.print("Losses = " + losses);
            setScores();
            lossrecorded = true;

        }
    }
    else if (CorrectAnswer == true) {
        hangcurrentframe.setRegion(hman.hangwin.getKeyFrame(elapsedTime, false));
        Wordsfont.draw(batch, "You Won", eman.getPosition().x + 60, hman.getPosition().y + 70);


        if (winrecorded == false) {
            bksound.stop();
            victory.play();
            wins += 1;
            System.out.print("Wins = " + wins);
            setScores();
            winrecorded = true;

        }
    }

2 个答案:

答案 0 :(得分:0)

您忽略了原始createSaveData方法的一个重要部分:

writer.write("" + 0);

看到"" + 0?它有效地将整数转换为字符串(尽管有更优雅的方法)。

BufferedWriter已超载write方法。这意味着当参数为String时,会调用另一种方法,当参数为int时,会调用另一种方法。

您已调用参数为int的版本。其documentation说:

  

public void write(int c) throws IOException

     

写一个字符。

     

<强>覆盖

     

写在类Writer

     

<强>参数:

     

c - int指定一个角色   写入

     

<强>抛出:

     

IOException - 如果发生I / O错误

这告诉您它认为您作为角色传递的int。也就是说,如果你给它int 65,它将被视为字符A。如果您将int 48赋予它,则将其视为字符0

如果你给它整数0,这就是NUL控制字符。

当您将其作为字符串读回时,它将被视为包含NUL字符的单字符字符串。当然,这不是数字的有效字符串格式。

所以替换

        writer.write(wins);

使用

        writer.write(String.valueOf(wins));

并为损失做同样的事。

答案 1 :(得分:0)

我建议进行以下更改。

  1. 使用单个writeSaveData方法。 createSaveDatasetScores之间的代码基本上是重复的。另外,使用Integer.toString()写入输出。此外,确保关闭流(此处使用try with resources)。

    private void writeSaveData(int wins, int losses)
    {
      File file = new File(saveDataPath, filename);
      try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
        writer.write(Integer.toString(wins));
        writer.newLine();
        writer.write(Integer.toString(losses));
    
      }
      catch (Exception e) {
          e.printStackTrace();
      }
    
    }
    
  2. readLine()方法中有一个额外的loadScores()。删除额外的行。更改使用尝试使用资源。

    private void loadScores()
    {
      File file = new File(saveDataPath, filename);
    
      try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
        String line = reader.readLine();
    
        // line = reader.readLine() <-- REMOVE THIS LINE
        wins = Integer.parseInt(line);
    
        line = reader.readLine();
        losses = Integer.parseInt(line);
    
        reader.close();
    
    
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    
  3. 编辑:如果无法使用资源尝试,则可以使用以下方法。

    private void loadScores()
    {
        File file = new File(saveDataPath, filename);
    
        BufferedReader reader = null;
        //        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));            
            String line = reader.readLine();
    
            wins = Integer.parseInt(line);
    
            line = reader.readLine();
            losses = Integer.parseInt(line);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (reader != null) {
                try {
                    reader.close();
                }
                catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }
    

    可以对建议的writeSaveData()或其他方法进行类似的修改。