保存游戏分数
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) 您是否同时使用createSaveData
和setScores
? wins
和losses
的类型是什么?
我在问题中添加了胜利损失
【参考方案1】:
我建议进行以下更改。
使用单个writeSaveData
方法。 createSaveData
和 setScores
之间的代码大部分重复。此外,使用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));
对损失做同样的事情。
【讨论】:
感谢您提供的信息...我对此很陌生,但我明白您所说的我将整数转换为字符串,然后将其作为整数调用...因为它会尝试以下方法结合我的两种方法.. 如果没有,我会这样做以上是关于保存游戏分数的主要内容,如果未能解决你的问题,请参考以下文章