今回は、ゲームのセーブをイメージして構造体のデータを扱っていきます。
セーブデータはRPGのキャラクターデータとします。
プレイヤーは4人パーティーとして、4人分のデータを準備します。
プレイヤー1人分のデータは構造体で宣言します。
プレイヤー構造体 メンバ変数 名前 name char型配列 ヒットポイント hp int型 マジックポイント mp int型 |
<sample program 112-01>
#include <stdio.h> #define NAME_MAX 20 #define PARTY_MAX 4 typedef struct { char name[NAME_MAX]; int hp; int mp; } Player; int main(void) { Player player[PARTY_MAX]; return 0; } |
ここから4人分の名前を入力し、hpとmpは乱数で決めるように作っていきます。
<sample program 112-02>
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NAME_MAX 20 #define PARTY_MAX 4 typedef struct { char name[NAME_MAX]; int hp; int mp; } Player; int main(void) { Player player[PARTY_MAX]; int i; srand((unsigned int)time(NULL)); for (i = 0; i < PARTY_MAX; i++) { scanf("%s", player[i].name); player[i].hp = rand() % 101 + 100; player[i].mp = rand() % 51 + 50; } return 0; } |
hpについては100から200までの範囲、mpについては50から100までの範囲でランダムに決まります。
この構造体に入っているデータをファイルに書き込むことでセーブを行います。
追加すべきプログラムは↓の通りです。
ファイルポインタを用意する ファイルを開く エラーチェックを行う 4人分のデータを書き込む ファイルを閉じる |
「4人分のデータを書き込む」以外の箇所から作ってみましょう。
今回書き込むファイルの名前は「Save.txt」とします。
<sample program 112-03>
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NAME_MAX 20 #define PARTY_MAX 4 typedef struct { char name[NAME_MAX]; int hp; int mp; } Player; int main(void) { Player player[PARTY_MAX]; int i; FILE* fp; srand((unsigned int)time(NULL)); for (i = 0; i < PARTY_MAX; i++) { scanf("%s", player[i].name); player[i].hp = rand() % 101 + 100; player[i].mp = rand() % 51 + 50; } fp = fopen("Save.txt", "w"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } /* データを書き込む場所 */ fclose(fp); return 0; } |
今回は「データを書き込む」ので、モードは「"w"」です。
後はデータを書き込んで確認するだけなのですが、データを書き込む際には「読み込む」ことを考慮して書き込まなければなりません。
前回、区切り文字について触れましたが、データとデータの間には「半角空白」や「改行」といった区切り文字が必要になります。
今回の区切り文字は改行にしてみます。
<sample program 112-04>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NAME_MAX 20
#define PARTY_MAX 4
typedef struct
{
char name[NAME_MAX];
int hp;
int mp;
} Player;
int main(void)
{
Player player[PARTY_MAX];
int i;
FILE* fp;
srand((unsigned int)time(NULL));
for (i = 0; i < PARTY_MAX; i++) {
scanf("%s", player[i].name);
player[i].hp = rand() % 101 + 100;
player[i].mp = rand() % 51 + 50;
}
fp = fopen("Save.txt", "w");
if (fp == NULL) {
printf("OPEN ERROR\n");
return 1;
}
for (i = 0; i < PARTY_MAX; i++) {
fprintf(fp, "%s\n", player[i].name);
fprintf(fp, "%d\n", player[i].hp);
fprintf(fp, "%d\n", player[i].mp);
}
fclose(fp);
return 0;
}
|
実行した後で、保存された「Save.txt」の中身を確認しましょう。
<実行結果>
player1 player2 player3 player4 続行するには何かキーを押してください・・・
<Save.txtの中身>
player1 173 57 player2 147 61 player3 184 71 player4 168 53
name、hp、mpの順に4人分のデータが改行区切りで保存されています。
ロードする際には、この順番で読み込むようにプログラムを組めば良いですね。