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

C语言四子棋游戏存档及读档功能开发问题咨询

四子棋(Connect Four)存档读档功能实现方案

先修正现有代码的基础错误

  • main函数中save变量为int类型,判断if(save == '0')逻辑错误:'0'是字符型ASCII值48,输入数字0时int值为0,二者不等,需要修改判断条件
  • 原存档部分打开文件用"r"只读模式,无法写入数据,需改为写模式
  • case 2分支结束后未加break,会直接落入case3执行退出逻辑,需要补充break

功能实现思路

你需要持久化存储的对局状态只有2个核心数据:

  • 全局棋盘数组scores[ROWS][COLS]
  • 当前执棋玩家标识disc
    采用二进制读写更简单,不需要额外处理文本格式解析:

具体代码修改

1. 新增load函数声明

在函数声明区添加:

int load();

2. 实现save函数

替换空的save函数为:

void save() {
    FILE *fp = fopen("game.dat", "wb");
    if (fp == NULL) {
        printf("存档失败,无法打开文件\n");
        return;
    }
    // 写入棋盘数组
    fwrite(scores, sizeof(char), ROWS * COLS, fp);
    // 写入当前执棋玩家
    fwrite(&disc, sizeof(char), 1, fp);
    fclose(fp);
    printf("游戏已成功存档\n");
}

3. 实现load函数

新增load函数:

int load() {
    FILE *fp = fopen("game.dat", "rb");
    if (fp == NULL) {
        printf("读档失败,不存在存档文件\n");
        return 0;
    }
    // 读取棋盘数组覆盖全局变量
    fread(scores, sizeof(char), ROWS * COLS, fp);
    // 读取当前执棋玩家覆盖全局变量
    fread(&disc, sizeof(char), 1, fp);
    fclose(fp);
    printf("读档成功\n");
    return 1;
}

4. 修改main函数中的存档触发逻辑

原存档部分代码替换为:

printf("Would you like to save this game? Press 0\n");
scanf("%d", &save);
if(save == 0){
    save();
    break;
}

5. 补全case2的case4加载逻辑

case 4:
    if (load()) {
        // 读档成功直接进入游戏循环
        print_board();
        while(1){
            printf("Player %c, your turn!\n", disc);
            choose();
            printf("\n\n");
            print_board();
            if (check('X')){
                printf("\n\nPlayer X wins!\n\n");
                break;
            }
            if (check('O')){
                printf("\n\nPlayer O wins!\n\n");
                break;
            }
            printf("Would you like to save this game? Press 0\n");
            scanf("%d", &save);

            if(save == 0){
                save();
                break;
            }
        }
        printf("Thanks for playing!\n");
    }
    break;

6. 补充case2分支的break

在case2的switch结束后添加break;,避免落入case3直接退出。

如果需要支持多存档,只需要修改save/load函数的文件名逻辑,让用户输入存档名称即可实现多个存档的管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:24:02