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

