もっといいデータ構造


 シナリオ用の構造体に、その構造体のデータが何を表すのかを表す iKind を付け足します。

iKind → 0 普通文章
         1 選択肢
         2 ヒットレット

#include "stdio.h"
#include "conio.h"

typedef struct{
        int     iKind;          //      処理の種類(0-> 通常文章  1-> 選択肢  2-> キー待ち)
        char*   pString;        //      文章
        int     idx1;           //      次のシナリオのインデックス(-1で終了)
        int     idx2;           //      次のシナリオのインデックス
}SCINARIO;

SCINARIO        s_aScinario[] = {
        {0,"シナリオ1\n",1,0},
        {1,"選択肢1->1 選択肢2->2\n",2,3},
        {0,"シナリオ2\n",9,0},
        {0,"シナリオ3\n",4,0},
        {1,"選択肢1->1 選択肢2->2\n",5,6},
        {0,"シナリオ4\n",9,0},
        {0,"シナリオ5\n",7,0},
        {2,"Hit Any Key",8,0},
        {0,"シナリオ6\n",9,0},
        {0,"エンドシナリオ\n",-1,0},
};

int main(int argc, char* argv[])
{
        int index = 0;
        
        do{
                switch(s_aScinario[index].iKind){
                case 0:         //      通常テキスト
                        printf("%s",s_aScinario[index].pString);
                        index = s_aScinario[index].idx1;
                        break;
                case 1:         //      選択肢
                        printf("%s",s_aScinario[index].pString);
                        if(getche() == '1'){
                                index = s_aScinario[index].idx1;
                        }
                        else{
                                index = s_aScinario[index].idx2;
                        }
                        break;
                case 2:         //      キー待ち
                        printf("%s",s_aScinario[index].pString);
                        getche();
                        index = s_aScinario[index].idx1;
                        break;
                }
        }while(index >= 0);

        return 0;
}

 これで完成です。簡単でしょ? iKind の種類を増やして3のときは画像を表示する、4のときは音を出すというようにしていけばさらにゲームらしくなります。

その昔、実際に僕の作った某ゲームも基本はこれです。

 単純に文字シナリオだけで分岐していくゲームブックのようなものを作りたかったら、シナリオを考えて上の s_aSci[] 部分を書いていけば完成です。ちょっと入力とデバッグが面倒なような気がしますが、とにかくゲームブックをモニター上で再現しようと思ったら、これで何とかできます。 でもそのときには、1画面を埋めてしまう以上のテキストが表示されたらまずいので、ヒットレット処理(いわゆる文章送り用のキー入力待ち)を適切な位置にちゃんと入れないとまずいですね。
それから、画面の文字消去というのも必要かもしれません。

 ゲームブックからサウンドノベルにアップグレードをしたい場合は、画像表示とサウンド発声の部分をプログラムする必要があります。
 その部分は機種依存になりますので今回はパスします。その代わり、次章ではこのプログラムの s_aScinario 部分の掘り下げを行います。いわゆるシナリオスクリプトといわれるものを作っていこうと思います。

矢印前ページ トップ
次ページ矢印