保存游戏分数

Posted

技术标签:

【中文标题】保存游戏分数【英文标题】:Saving Game Scores 【发布时间】:2016-05-13 18:33:27 【问题描述】:

我正在尝试为一个刽子手游戏创造高分。所以我需要保存它,这样每次你开始游戏或返回菜单时它都不会重新启动..所以我有一个游戏状态,记录游戏结束时的输赢,如果用户在解决它之前离开会增加损失.我找到了一个通过 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();在游戏状态的乞求..和 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 (los-s-recorded == false) 
            losses += 1;
            System.out.print("Losses = " + losses);
            setScores();
            los-s-recorded = 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()的作者。您还应该将所有 .close() 方法调用放在 finally 块中,或者使用 Java 7 try-with-resources 方法。 我也注意到,即使在教程中他没有添加.. 仍然没有帮助,只是改变了错误太 .lang.NumberFormatException: For input string:"" + 加上阅读问题.. java。 lang.Integer.parseInt(Integer.java:481) (1) 您是否同时使用createSaveDatasetScoreswinslosses的类型是什么? 我在问题中添加了胜利损失 【参考方案1】:

我建议进行以下更改。

    使用单个writeSaveData 方法。 createSaveDatasetScores 之间的代码大部分重复。此外,使用Integer.toString() 写入输出。此外,确保流已关闭(此处使用资源尝试)。

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

    loadScores() 方法中有一个额外的readLine()。删除那条多余的线。更改为对资源使用 try。

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

【讨论】:

收到一条错误消息,提示此语言级别不支持尝试使用资源??这是版本问题还是只是错误的导入库?为您提供帮助 我将 vs. 更改为 1.7 但仍然出现错误.. 知道吗?使用安卓工作室 我不确定您是如何编译的(即 IDE、javac 等)。如果 try with resources 不可用,您可以将声明移到 try 之外,然后添加 finally 以关闭它们。我稍后会尝试更新答案。 WRT 到 Java、版本和 android 工作室,this link may help 嘿凯文..我不明白你做了什么..或者大部分代码,但我爱你,它的工作原理..这就是我在第一场比赛中完成的..【参考方案2】:

您忽略了原始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));

对损失做同样的事情。

【讨论】:

感谢您提供的信息...我对此很陌生,但我明白您所说的我将整数转换为字符串,然后将其作为整数调用...因为它会尝试以下方法结合我的两种方法.. 如果没有,我会这样做

以上是关于保存游戏分数的主要内容,如果未能解决你的问题,请参考以下文章

保存 webview 游戏分数

使用 NSUser Defaults 保存当前游戏分数(不是高分)?

以安全格式存储游戏偏好和保存的游戏

将游戏的高分保存到文件然后访问它们,如何?

在Firestore数据库中保存用户分数和收藏夹

Java:将字符串保存到文件