★ファイル操作(テキストファイル5)★


以前、迷路を作りました。

迷路のデータは2次元配列に初期値としていれてありましたが、ファイルから読み込むようにしてみましょう。

まずはプロジェクトを作り、プロジェクトフォルダの中に「"Maze.txt"」を作ります。


迷路のイメージは以前と同じように↓でいきましょう。

データを読み込んだ後の二次元配列mazeの中身

maze   0 1 2 3 4 5 6 7 8 9
   +−+−+−+−+−+−+−+−+−+−+
  0|0|0|0|0|0|0|0|0|0|0|
   +−+−+−+−+−+−+−+−+−+−+
  1|0|1|1|1|0|1|1|0|2|0|
   +−+−+−+−+−+−+−+−+−+−+
  2|0|1|0|1|1|1|1|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  3|0|1|0|1|0|1|0|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  4|0|1|0|1|0|1|1|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  5|0|1|0|1|0|1|1|1|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  6|0|1|0|1|0|1|1|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  7|0|1|0|1|0|1|0|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  8|0|1|0|1|1|1|1|0|1|0|
   +−+−+−+−+−+−+−+−+−+−+
  9|0|0|0|0|0|0|0|0|0|0|
   +−+−+−+−+−+−+−+−+−+−+
    0 壁
    1 床(通路)
    2 ゴール

では、このデータをファイルに打ち込みます。

横方向のデータは「半角空白」で区切り、10個目のデータで「改行」を入れてイメージと同じようにデータを作ります。

打ち込んだら保存しておきましょう。


次に、データを読み込むための二次元配列を準備します。

<sample program 115-01>

#include <stdio.h>

#define ROW 10
#define COL 10

enum {
    WALL,
    FLOOR,
    GOAL,
};

int main(void)
{
    int maze[ROW][COL];

    return 0;
}

この二次元配列にデータを読み込みます。

<sample program 115-02>

#include <stdio.h>

#define ROW 10
#define COL 10

enum {
    WALL,
    FLOOR,
    GOAL,
};

int main(void)
{
    int maze[ROW][COL];

    int i, j;

    FILE* fp;

    fp = fopen("Maze.txt", "r");

    if (fp == NULL) {
        printf("OPEN ERROR\n");
        return 1;
    }

    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            fscanf(fp, "%d", &maze[i][j]);
        }
    }

    fclose(fp);

    return 0;
}

二重ループを使って、すべてのデータを配列に読み込んでいます。


実際にデータが入っているかどうか、表示するプログラムを付け加えましょう。

<sample program 115-03>

#include <stdio.h>

#define ROW 10
#define COL 10

enum {
    WALL,
    FLOOR,
    GOAL,
};

int main(void)
{
    int maze[ROW][COL];

    int i, j;

    FILE* fp;

    fp = fopen("Maze.txt", "r");

    if (fp == NULL) {
        printf("OPEN ERROR\n");
        return 1;
    }

    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            fscanf(fp, "%d", &maze[i][j]);
        }
    }

    fclose(fp);

    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            switch (maze[i][j]) {
            case WALL:
                printf("■");
                break;
            case FLOOR:
                printf("□");
                break;
            case GOAL:
                printf("G");
                break;
            }
        }
        printf("\n");
    }

    return 0;
}

<実行結果>

■■■■■■■■■■
■□□□■□□■G■
■□■□□□□■□■
■□■□■□■■□■
■□■□■□□■□■
■□■□■□□■□■
■□■□■□□□□■
■□■□■□■■□■
■□■□□□□■□■
■■■■■■■■■■
続行するには何かキーを押してください・・・

ファイルにデータを置くと、データを変更してもコンパイルやビルドをしなくても済みます。

実際のゲームなどでゲームバランスを調整する際にも、ファイルのデータを変更することで行います。

なるべく再コンパイルせず変更や調整が出来るようファイルを使ってください。


次へ

戻る

目次へ