2016-05-13 89 views
0

我想为hang子手游戏做一个高分。所以我需要保存它,所以它不会重新启动,每次开始游戏或返回到菜单..所以我有一个playstate记录在游戏结束时的胜利和损失,如果用户离开之前解决它增加了损失。我发现一个教程,通过SavaData文件保存..问题是它保存一个空文件没有什么在那里,但有2个空行..所以我得到一个numberformatexception空..我以前的工作,但它仍然不会阅读该行,并会返回一个错误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并获取作为一个整数的胜利和lossess,并且没有任何问题,因此它绘制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; 

     } 
    } 
+0

一个评论,一定要关闭'createSaveData()'中的作者。您还应该将所有'.close()'方法调用放在finally块中,或者使用Java 7的try-with-resources方法。 – KevinO

+0

我注意到,即使在教程中他也没有添加..仍然没有帮助只改变了错误.lang.NumberFormatException:对于输入字符串:“”+加上阅读问题.. java.lang.Integer.parseInt(Integer .java:481) – Joe

+0

(1)您是否同时使用'createSaveData'和'setScores'? “胜利”和“损失”是什么类型? – RealSkeptic

回答

0

我会建议进行以下更改。

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

编辑:如果一个人不能使用尝试用资源,那么下面的方法可以替代使用。

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

+0

得到一个错误说在这个语言级别不支持尝试资源?是版本问题还是仅仅是错误的导入库? ty为你提供帮助 – Joe

+0

我把这个vs改成了1.7,但仍然得到一个错误..任何想法都是?使用android工作室 – Joe

+0

我不知道你是如何编译的(即IDE,javac等)。如果尝试使用资源不可用,则可以将该声明移到try之外,然后添加finally以关闭它们。我会尽快更新答案。 – KevinO

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

而且损失也这样做。

+0

谢谢你的信息...即时新的这个,但我明白你说我把整数转换为一个字符串,然后调用它作为一个int ..要尝试下面的方法因为它结合了我的两种方法..如果不是会做这一个 – Joe