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
相关产品推荐
相关产品推荐

