Я почти закончил игру с тральщиком в C. В настоящее время я пытаюсь реализовать функцию сохранения игры. После того, как у игрока спрашивают его имя, игра проверяет, есть ли файл с его именем. Если да, попытка загрузить файл и восстановить игровую структуру.
Я немного расширил структуру, это выглядит так:
typedef struct GAMEOBJECT {
gamestate STATE; ///< the current State of the game. see GAMESTATE.
uint8_t width; ///< width of the game board.
uint8_t height; ///< height of the game board.
int mines; ///< the amount of mines places on the game board.
size_t elements; ///< total amount of cells (width*height).
cell *cells; ///< pointer to the start of the cell pointer array.
player player; ///< Structure to store Player Data;
status status; ///< Structure to store game infos;
} gameObject;
есть еще 3 структуры используется внутри этой конструкции:
typedef struct GAMES{
int total;
int won;
int lost;
int cells;
} games;
typedef struct STATUS{
int moves;
int flagged;
int revealed;
} status;
typedef struct PLAYER {
char name[20];
games games;
} player;
Вопрос: - Сохраняются ли структуры внутри GameObject Structs при попытке записи структуры GameObject в файл? (Я знаю, для ячеек *, что я должен делать это отдельно, поскольку это всего лишь указатель на другую структуру.
Функции загрузки сводятся к основам:
savegameState loadGame(gameObject *Minesweeper, char *player){
FILE *savegame = fopen(savegameName,"rb");
[...]
//loading Gameboard from file to memory...
size_t items_board = fread (Minesweeper, sizeof(gameObject), 1, savegame);
//allocating memory for the Cells...
Minesweeper->cells = (cell*)calloc(Minesweeper->elements,sizeof(cell));
//loading cells from file to memory...
size_t items_cells = fread (Minesweeper->cells, sizeof(cell), Minesweeper->elements, savegame);
[...]
errorhandling
функция сохранения :
savegameState saveGame(gameObject *Minesweeper, char *player){
[...]
FILE *savegame = fopen(savegameName,"r+b");
[...]
size_t items_board = fwrite (&Minesweeper, sizeof(gameObject), 1, savegame);
size_t items_cells = fwrite (&Minesweeper->cells, sizeof(cell), Minesweeper->elements, savegame);
[...] errorhandling
попытался закомментировать сохранение для области ячейки, но все еще с ошибками ...
может быть важно, функции инициализации для основного GameObject:
// Allocating memory for the board struct.
gameObject *Minesweeper = (gameObject *)calloc(1,sizeof(gameObject));
//Initing Board Parameters
Minesweeper->width = width;
Minesweeper->height = height;
Minesweeper->elements = height*width;
Minesweeper->mines = mineCount;
Minesweeper->STATE=INIT;
strcpy(Minesweeper->player.name,player);
Minesweeper->cells = (cell*)calloc(Minesweeper->elements,sizeof(cell));
if (!fromFile){
//placing mines and getting neighboring mines.
placeMines(Minesweeper,mineCount);
getNeighborMines(Minesweeper);
revealFirst(Minesweeper);
} else {
Minesweeper->STATE = RESTORE;
}
//return struct
return Minesweeper;
}
Если обнаружена сохраненная игра, эта функция инициализации вызывается с базовыми параметрами c (матрица 10x10, 5 мин), чтобы иметь возможность инициировать объект.
(Или я должен только инициировать GameObject? И не волнует указатель ячеек?)