我正在开发一个自定义尺寸的 Tic Tac Toe 游戏。 我想制作一个保存文件,这样如果用户在游戏结束前离开游戏,他可以再次加载上一个游戏继续。
我对一个单元格和一个结构体使用了枚举。
typedef enum Cell {
c_empty, c_circle, c_cross
} Cell;
typedef struct Game {
Cell** board;
int SIZE;
} Game;
Game gboard;
static void file_write(Game* pgboard);
static void file_read(Game* pgboard);
<小时/>
读取 SIZE 已经可以使用此方法:
fscanf(fp, "%d", &pgboard->SIZE);
并将其写入文件:
fprintf(fp, "%d\n", pgboard->SIZE);
还将板写入文件可与 switch 一起使用:
for (j = 0; j < pgboard->SIZE; ++j){
for (i = 0; i < pgboard->SIZE; ++i){
switch (pgboard->board[j][i]) {
case c_empty: fprintf(fp, " "); break;
case c_circle: fprintf(fp, "o"); break;
case c_cross: fprintf(fp, "x"); break;
}
所以我的文件现在是这样的:
13
x o x
您对我如何读回黑板有什么建议吗?
最佳答案
虽然更好的方法是以数字格式而不是字符串读取/写入数据,但无论如何,这里的代码可以完成您想要的操作。
char cell;
fscanf(fp, "%d", &pgboard->SIZE);
fscanf(fp, "%c", &cell); /* to get rid of new line */
for (j = 0; j < pgboard->SIZE; ++j){
for (i = 0; i < pgboard->SIZE; ++i){
fscanf(fp, "%c", &cell)
switch (cell) {
case ' ': pgboard->board[j][i] = c_empty; break;
case 'o': pgboard->board[j][i] = c_circle; break;
case 'x': pgboard->board[j][i] = c_cross; break;
}
}
}
我没有测试代码,但它会显示这个想法的要点。
关于c - 从C中的文件读入二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036349/