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

Posted

技术标签:

【中文标题】将游戏的高分保存到文件然后访问它们,如何?【英文标题】:Saving high scores of a game to a file and then accessing them, how? 【发布时间】:2021-06-01 19:34:24 【问题描述】:

我想将我的游戏(一个简单的蛇游戏)的所有分数保存到一个文件中,然后读取所有分数。问题是,我不知道如何保存它们,不知道会有多少。

 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;

【问题讨论】:

您是否关心让文件同时永久打开以进行读取和写入的具体原因,而我们没有看到在你的样本中?还是将这两个流作为全局变量打开是一个有点武断的决定? 我对文件工作没有真正的经验,所以如果你知道更好的解决方法,请分享:D @Frank 我只关心是否能够保存每个人演奏的所有分数,然后在调用函数后对其进行排序和显示 @MickeyMoise -- qsort(v, n, sizeof(int), comp); -- qsort 在 C++ 程序中?一个简单的std::sort(v, v + n); 就可以完成所有这些工作。 【参考方案1】:

根据你的描述,你想要的是:

    打开文件写入 写入文件 完成写入文件 打开文件进行阅读 从文件中读取 从文件中读取完成。

所以你的代码应该反映这个顺序!

关键是您在任何给定时刻都只是从文件中读取或写入,因此ifstreamofstream 绝不应该同时存在!

有几种方法可以解决这个问题,但最简单的方法是使用函数来隔离它们。以下是您的情况:

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;

顺便说一句,您的代码在许多其他方面也可能会更好,但我有意保持原样(除了客观上损坏的东西),以便您可以专注于该特定部分:

【讨论】:

仍然,我怎么做,所以我输入 1 个分数,关闭控制台,编译器(代码块),重新打开编译器,重新运行程序并输入另一个分数并将其添加到文件中而不一个数组? 您能否举个例子来修改您的答案,因为我在过去 15 分钟里一直在苦苦挣扎,无法弄清楚

以上是关于将游戏的高分保存到文件然后访问它们,如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cocos2d iphone 游戏中保存高分和加载高分

使用 NSUserDefaults 保存高分时出错

如何快速保存高分

使用 NSData 和 NSMutableArrays 保存 OS X 游戏数据

在 iCloud 上保存数据

如何将 tiff 图像保存到新的 npy 文件中?