将游戏的高分保存到文件然后访问它们,如何?
Saving high scores of a game to a file and then accessing them, how?
我想将我的游戏(一个简单的贪吃蛇游戏)的所有分数保存到一个文件中,然后读取所有分数。问题是,不知道会有多少,我不知道如何保存它们。
Example:
one person plays it, gets 1200 score, it gets saved;
2nd person plays it, gets 1000 and sees the first person's score;
3rd person plays, gets 1100 and sees the 1st and 2nd scores.
我已经用数组完成了,但并没有像我想要的那样工作。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream f("score.dat");
ofstream g("score.dat");
int comp(const void* e1, const void* e2){
int f = *((int*)e1);
int s = *((int*)e2);
if(f>s) return 1;
if(f<s) return -1;
return 0;
}
int main()
{
int k=0;
int n, x;
cin >> n;
int* v = new int[n];
for(int i=0; i<n; i++)
cin >> v[i];
for(int i=0; i<n; i++){
qsort(v, n, sizeof(int), comp);
g << v[i] << endl;
}
while(f >> x){
k++;
cout << k << ". " << x << endl;
}
return 0;
}
根据你的描述,你想要的是:
- 打开文件进行写入
- 写入文件
- 完成写入文件
- 打开文件进行阅读
- 从文件中读取
- 读取文件完成。
因此您的代码应反映该序列!
关键是你在任何给定时刻都只是从文件中读取或写入,所以 ifstream
和 ofstream
永远不应该同时存在!
有几种方法可以解决这个问题,但最简单的方法是使用函数来隔离它们。以下是您的情况:
void writeScoresToFile(int[] scores, int num_scores) {
// g only starts existing when the function is called
ofstream g("score.dat");
for(int i = 0; i < num_scores; ++i ) {
g<< v[i] << endl;
}
// g is destroyed. This closes the file
}
void readScoresFromFile() {
// f only starts existing when the function is called
ifstream f("score.dat");
int x = 0;
int k = 0;
while(f>> x){
k++;
cout << k << ". " << x << endl;
}
// f is destroyed. This closes the file
}
int main()
{
int n;
cin >> n;
int* v = new int[n];
// ...
// You only need to sort once, not inside the loop.
std::sort(v, v + n);
writeScoresToFile(v, n);
readScoresFromFile()
delete[] n; // <----- if there's a new, there must be a delete.
return 0;
}
顺便说一句,您的代码还可以在许多其他方面做得更好,但我故意保持原样(除了客观上损坏的东西),以便您可以专注于该特定部分:
我想将我的游戏(一个简单的贪吃蛇游戏)的所有分数保存到一个文件中,然后读取所有分数。问题是,不知道会有多少,我不知道如何保存它们。
Example:
one person plays it, gets 1200 score, it gets saved;
2nd person plays it, gets 1000 and sees the first person's score;
3rd person plays, gets 1100 and sees the 1st and 2nd scores.
我已经用数组完成了,但并没有像我想要的那样工作。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream f("score.dat");
ofstream g("score.dat");
int comp(const void* e1, const void* e2){
int f = *((int*)e1);
int s = *((int*)e2);
if(f>s) return 1;
if(f<s) return -1;
return 0;
}
int main()
{
int k=0;
int n, x;
cin >> n;
int* v = new int[n];
for(int i=0; i<n; i++)
cin >> v[i];
for(int i=0; i<n; i++){
qsort(v, n, sizeof(int), comp);
g << v[i] << endl;
}
while(f >> x){
k++;
cout << k << ". " << x << endl;
}
return 0;
}
根据你的描述,你想要的是:
- 打开文件进行写入
- 写入文件
- 完成写入文件
- 打开文件进行阅读
- 从文件中读取
- 读取文件完成。
因此您的代码应反映该序列!
关键是你在任何给定时刻都只是从文件中读取或写入,所以 ifstream
和 ofstream
永远不应该同时存在!
有几种方法可以解决这个问题,但最简单的方法是使用函数来隔离它们。以下是您的情况:
void writeScoresToFile(int[] scores, int num_scores) {
// g only starts existing when the function is called
ofstream g("score.dat");
for(int i = 0; i < num_scores; ++i ) {
g<< v[i] << endl;
}
// g is destroyed. This closes the file
}
void readScoresFromFile() {
// f only starts existing when the function is called
ifstream f("score.dat");
int x = 0;
int k = 0;
while(f>> x){
k++;
cout << k << ". " << x << endl;
}
// f is destroyed. This closes the file
}
int main()
{
int n;
cin >> n;
int* v = new int[n];
// ...
// You only need to sort once, not inside the loop.
std::sort(v, v + n);
writeScoresToFile(v, n);
readScoresFromFile()
delete[] n; // <----- if there's a new, there must be a delete.
return 0;
}
顺便说一句,您的代码还可以在许多其他方面做得更好,但我故意保持原样(除了客观上损坏的东西),以便您可以专注于该特定部分: