如何在 C 中实现保存和加载?

编程


我有这个垄断克隆,我需要添加保存和加载的能力,但我不知道从哪里开始,所以感谢任何帮助!

Monopoly,在终端中,用 C 语言实现棋盘游戏大富翁,下载Monopoly的源码_GitHub_酷徒[^]

我尝试过的:

记录每次掷骰子,但玩家姓名已损坏

解决方案1

这很大程度上取决于现有代码的作用。 一般来说,您只需将数据写入文件以保存,然后从文件中读取数据以重新加载。 但确切的实现很大程度上取决于现有代码的结构。

流I/O | 微软学习[^]。

解决方案2

我们无法给你一个具体的答案:我们不知道你尝试了什么,也不知道对这个软件有任何熟悉程度——而且我不会费力地浏览整个 github 项目来弄清楚它是如何工作的。尝试添加功能。

如果您想向现有项目添加功能,您需要首先了解整个项目:仅“记录骰子掷出”不会有帮助,因为这甚至无法关闭恢复项目所需的所有信息到目前为止的游戏:购买你所登陆的房产并不是强制性的,机会卡和公益金卡是随机顺序的,等等。

所以去github项目仔细检查一下:当你知道它是如何工作的时候,你就可以开始考虑mod了,但之前不行!

解决方案3

你很幸运,现有代码已经从文件加载“位置”(’位置.csv‘ 在里面 ‘数据‘ 文件夹)。 看看 ReadLocations 函数并用它作为实现你的(比如说)的参考 ReadPlayers 一。
然后,凭借所获得的经验,您可以轻松地编写补充性内容 WritePlayers 代码也是如此。

解决方案4

在Windows下测试程序时,如果命令窗口大小不合适,程序就会终止,这是特别烦人的事情。 应该对此进行更改,以便更容易从开发环境中调试程序。
这是Windows的改进版本,它调整窗口大小而不是关闭程序。

C
#ifdef _WIN32
#include <windows.h>

void checkWindowSize(int screenWidth, int screenHeight)
{
     CONSOLE_SCREEN_BUFFER_INFO csbi;
     HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
     if (!GetConsoleScreenBufferInfo(hStdout, &csbi)) {
         printf("Error: GetConsoleScreenBufferInfo (%d)\n", GetLastError());
         exit(1);
     }

     SMALL_RECT srctWindow = csbi.srWindow;
     int width = srctWindow.Right - srctWindow.Left + 1;
     int height = srctWindow.Bottom - srctWindow.Top + 1;

     if (width < screenWidth || height < screenHeight) {
        if(width < screenWidth) 
             srctWindow.Right = screenWidth;
        if(height < screenHeight)
             srctWindow.Bottom = screenHeight;

        COORD wbuff = { screenWidth +1, screenHeight +1 };

        SetConsoleScreenBufferSize(hStdout, wbuff);
        SetConsoleWindowInfo( hStdout, TRUE, &srctWindow);

        // printf("\nTerminal size is too small. Please resize terminal.");
        // printf("\nSuggested size: %d X %d", screenWidth, screenHeight);
        // printf("\nCurrent size  : %d X %d", width, height);
        // printf("\n\n");
        // exit(1);
}

正如已经说过的,代码有很多弱点,从未初始化的变量到堆栈问题。 例如,在 ReadPlayers() 函数中,调试器报告了发生堆栈溢出的情况。
这里使用scanf和%s将字符串读入一个字节的数组中,看起来不太健康。

コメント

タイトルとURLをコピーしました