保存游戏分数

Saving Game Scores

我正在尝试为刽子手游戏取得高分。所以我需要保存它,这样它就不会在你每次开始游戏或 return 到菜单时重新启动..所以我有一个游戏状态记录游戏结束时的输赢以及用户是否在解决之前离开它增加了损失。我找到了一个通过 SavaData 文件保存的教程。问题是它保存了一个空文件,里面什么也没有,但有 2 个空行。该行并将 return 错误 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();在游戏状态开始时……和 setScore();在获胜++或失败++之后..

我有另一个 highscorestate,它调用 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;

        }
    }

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

writer.write("" + 0);

看到 "" + 0 了吗?它有效地将整数转换为字符串(尽管有更优雅的方法可以做到这一点)。

BufferedWriter 重载了 write 方法。这意味着当参数为 String 时调用不同的方法,当参数为 int.

时调用不同的方法

您调用了参数为int的版本。它的 documentation 说:

public void write(int c) throws IOException

Writes a single character.

Overrides:

write in class Writer

Parameters:

c - int specifying a character to be written

Throws:

IOException - If an I/O error occurs

这告诉您它认为您传递的 int 是一个字符。也就是说,如果你给它int65,它会被当作字符A。如果给它int 48,它会被当作字符0.

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

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

所以替换

        writer.write(wins);

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

对损失也做同样的事情。

我建议进行以下更改。

  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. loadScores()方法中多了一个readLine()。删除那条额外的线。更改为尝试使用资源。

    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();
      }
    }
    

编辑:如果无法对资源使用 try,则可以改用以下方法。

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()或其他方法进行类似的修改。