You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发Oware Abapa游戏:如何从show函数取数据写入保存文件?

解决Oware Abapa游戏存档与显示内容同步问题

要让saveFile()函数写入文件的内容和show()函数打印的内容完全一致,核心是复用show()里的格式化输出逻辑,同时调整saveFile()的参数以获取必要的游戏状态数据。具体修改如下:

关键调整点

  • 扩展saveFile()的参数列表,传入show()所需的全部游戏状态数据:当前玩家player、得分数组s[]、胜利标记win,以及原有的pit[]
  • 在saveFile()内部复用show()中的变量计算逻辑(活跃玩家/对手索引、坑位索引、提示文本)
  • 将show()中的printf替换为fprintf,直接输出到文件流

修改后的代码

原show()函数(无需修改)

void show( int player, t_Pit p[], t_Pit s[], int win ) {
    int a = player, o = !a; // 'a'ctive & 'o'pponent

    int x = a ? 0 : 6;
    int y = a ? 6 : 0;
    char *str = win ? "Wins the game\n\n" : "Select pit (1-6)\nSave board state (0): ";
    printf(
            "\n"
            "----+-----player%d-----+\n"
            "%2d  |%2d|%2d|%2d|%2d|%2d|%2d|\n"
            "----+-----------------+\n"
            "%2d  |%2d|%2d|%2d|%2d|%2d|%2d|\n"
            "----+-----player%d-----+\t"

            "\nPlayer %d %s",
            o,  s[o], p[y+5], p[y+4], p[y+3], p[y+2], p[y+1], p[y+0], // NB: custom indexing
            s[a], p[x+0], p[x+1], p[x+2], p[x+3], p[x+4], p[x+5], a,
            a, str
    );
}

修改后的saveFile()函数

void saveFile(int player, t_Pit pit[], t_Pit s[], int win) {
    char fName[26];
    printf("Input a name for the save file:");
    scanf("%s", fName); // 修复原代码错误:fName本身是数组指针,无需加&
    FILE *save = fopen(fName, "w");
    if (save == NULL) {
        perror("Error opening file for writing");
        return;
    }

    // 复用show()中的变量计算逻辑
    int a = player, o = !a;
    int x = a ? 0 : 6;
    int y = a ? 6 : 0;
    char *str = win ? "Wins the game\n\n" : "Select pit (1-6)\nSave board state (0): ";

    // 用fprintf输出和show()完全一致的内容
    fprintf(
            save,
            "\n"
            "----+-----player%d-----+\n"
            "%2d  |%2d|%2d|%2d|%2d|%2d|%2d|\n"
            "----+-----------------+\n"
            "%2d  |%2d|%2d|%2d|%2d|%2d|%2d|\n"
            "----+-----player%d-----+\t"

            "\nPlayer %d %s",
            o,  s[o], pit[y+5], pit[y+4], pit[y+3], pit[y+2], pit[y+1], pit[y+0],
            s[a], pit[x+0], pit[x+1], pit[x+2], pit[x+3], pit[x+4], pit[x+5], a,
            a, str
    );
    
    fclose(save);
    printf("file '%s' saved.", fName);
}

额外说明

  • 调用saveFile()时,需要从main()中传入当前游戏的player、pit数组、s数组和win标记,确保数据和show()显示的完全一致

内容的提问来源于stack exchange,提问作者ramwen0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:33:33