テキストアドベンチャー

2003/6/25作成

テキストアドベンチャー

最近ですとビジュアルノベルなどと呼ばれますが、むかーしはアドベンチャーゲームと呼んでいました。特に画像が出ないものをテキストアドベンチャーと言っていましたが、中身はこんな単純なものでも出来上がるのです。

プログラム


/*  フラグ初期化    */
a = 0;
b = 0;

/********************************************************/
/*  シーン1                                             */
/********************************************************/
SCENE1:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "はるかなる昔。まだ神々や", 0, 3 );
    symbol( 0, 10, "精霊が人々と共に暮らして", 0, 3 );
    symbol( 0, 20, "いた時代。しかし、神々の", 0, 3 );
    symbol( 0, 30, "力とて永遠ではなかった。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE2;

/********************************************************/
/*  シーン2                                             */
/********************************************************/
SCENE2:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "神々の力が衰え、今や世界", 0, 3 );
    symbol( 0, 10, "は魔王により支配される時", 0, 3 );
    symbol( 0, 20, "代となった。神々の末裔で", 0, 3 );
    symbol( 0, 30, "あるあなたは世界の最後の", 0, 3 );
    symbol( 0, 40, "望みを託され、魔王を倒す", 0, 3 );
    symbol( 0, 50, "旅へと出た。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE3;

/********************************************************/
/*  シーン3                                             */
/********************************************************/
SCENE3:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王配下の悪魔との数々の", 0, 3 );
    symbol( 0, 10, "戦いを経て、あなたはつい", 0, 3 );
    symbol( 0, 20, "に魔王の住む塔へとやって", 0, 3 );
    symbol( 0, 30, "きた。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE4;

/********************************************************/
/*  シーン4                                             */
/********************************************************/
SCENE4:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王の住むにふさわしい、", 0, 3 );
    symbol( 0, 10, "暗黒の雰囲気ただよう禍々", 0, 3 );
    symbol( 0, 20, "しい塔である。あなたは今", 0, 3 );
    symbol( 0, 30, "その塔の扉の前に立ってい", 0, 3 );
    symbol( 0, 40, "る。どうするか。", 0, 3 );
    symbol( 0, 60, "A:扉を開けて塔に入る", 0, 3 );
    symbol( 0, 70, "B:塔に入らず帰る", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE6;
        if( pad() & PAD_B ) goto    SCENE5;
    }

/********************************************************/
/*  シーン5                                             */
/********************************************************/
SCENE5:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "あなたが魔王を倒さなかっ", 0, 3 );
    symbol( 0, 10, "たため、世界は永遠に暗黒", 0, 3 );
    symbol( 0, 20, "に包まれてしまった。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;

/********************************************************/
/*  シーン6                                             */
/********************************************************/
SCENE6:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "塔の中に入るとひんやりと", 0, 3 );
    symbol( 0, 10, "した空気が頬をなでる。通", 0, 3 );
    symbol( 0, 20, "路は二手に分かれているよ", 0, 3 );
    symbol( 0, 30, "うだ。どちらに進む。", 0, 3 );
    symbol( 0, 60, "A:右へ", 0, 3 );
    symbol( 0, 70, "B:左へ", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE7;
        if( pad() & PAD_B ) goto    SCENE8;
    }

/********************************************************/
/*  シーン7                                             */
/********************************************************/
SCENE7:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路を右に進むと階段が見", 0, 3 );
    symbol( 0, 10, "えてきた。上る階段と下る", 0, 3 );
    symbol( 0, 20, "階段だ。どちらへ進む。", 0, 3 );
    symbol( 0, 60, "A:上へ", 0, 3 );
    symbol( 0, 70, "B:下へ", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE13;
        if( pad() & PAD_B ) goto    SCENE10;
    }

/********************************************************/
/*  シーン8                                             */
/********************************************************/
SCENE8:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路を左へ進むと左手に扉", 0, 3 );
    symbol( 0, 10, "が現れた。部屋があるよう", 0, 3 );
    symbol( 0, 20, "だ。どうする。", 0, 3 );
    symbol( 0, 60, "A:部屋に入る", 0, 3 );
    symbol( 0, 70, "B:そのまま進む", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE9;
        if( pad() & PAD_B ) goto    SCENE11;
    }

/********************************************************/
/*  シーン9                                             */
/********************************************************/
SCENE9:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "部屋の中に魔王を倒すと言", 0, 3 );
    symbol( 0, 10, "い伝えられる聖剣があった。", 0, 3 );
    symbol( 0, 20, "あなたは聖剣を手にすると、", 0, 3 );
    symbol( 0, 30, "そのまま次の扉へと進んだ。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    a = 1;  /*  フラグAセット   */
    goto    SCENE7;

/********************************************************/
/*  シーン10                                            */
/********************************************************/
SCENE10:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "階段を下りたはずなのに、", 0, 3 );
    symbol( 0, 10, "何故か塔の入り口へと戻っ", 0, 3 );
    symbol( 0, 20, "てしまった。この塔には不", 0, 3 );
    symbol( 0, 30, "思議な力が働いているよう", 0, 3 );
    symbol( 0, 40, "だ。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE4;

/********************************************************/
/*  シーン11                                            */
/********************************************************/
SCENE11:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路をそのまま進むと足元", 0, 3 );
    symbol( 0, 10, "で小さな音がした。音は罠", 0, 3 );
    symbol( 0, 20, "のスイッチだった。壁面か", 0, 3 );
    symbol( 0, 30, "ら無数の矢が飛び出しあな", 0, 3 );
    symbol( 0, 40, "たの体を貫いた。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE12;

/********************************************************/
/*  シーン12                                            */
/********************************************************/
SCENE12:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "無残な死体と化したあ", 0, 3 );
    symbol( 0, 10, "なたの頭上に、魔王の", 0, 3 );
    symbol( 0, 20, "高笑いがいつまでも響", 0, 3 );
    symbol( 0, 30, "いていた。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;

/********************************************************/
/*  シーン13                                            */
/********************************************************/
SCENE13:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "塔の2階へとやってきた。", 0, 3 );
    symbol( 0, 10, "通路は再び二手に分かれて", 0, 3 );
    symbol( 0, 20, "いる。どちらに進む。", 0, 3 );
    symbol( 0, 60, "A:右へ", 0, 3 );
    symbol( 0, 70, "B:左へ", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE14;
        if( pad() & PAD_B ) goto    SCENE17;
    }

/********************************************************/
/*  シーン14                                            */
/********************************************************/
SCENE14:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路を右に進むと右手に扉", 0, 3 );
    symbol( 0, 10, "が現れた。部屋があるよう", 0, 3 );
    symbol( 0, 20, "だ。どうする。", 0, 3 );
    symbol( 0, 60, "A:部屋に入る", 0, 3 );
    symbol( 0, 70, "B:そのまま進む", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE15;
        if( pad() & PAD_B ) goto    SCENE16;
    }

/********************************************************/
/*  シーン15                                            */
/********************************************************/
SCENE15:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "部屋の中には大きなレバー", 0, 3 );
    symbol( 0, 10, "があった。あなたがレバー", 0, 3 );
    symbol( 0, 20, "を倒すと、どこか遠い所で", 0, 3 );
    symbol( 0, 30, "カチっという音がした。あ", 0, 3 );
    symbol( 0, 40, "なたはそのまま部屋を出た。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    b = 1;  /*  フラグBセット   */
    goto    SCENE17;

/********************************************************/
/*  シーン16                                            */
/********************************************************/
SCENE16:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路は行き止まりになって", 0, 3 );
    symbol( 0, 10, "いて進めない。戻るしかな", 0, 3 );
    symbol( 0, 20, "いようだ。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE14;

/********************************************************/
/*  シーン17                                            */
/********************************************************/
SCENE17:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    if( b == 1 ) {
        symbol( 0, 0, "通路を進むと足元で小さな", 0, 3 );
        symbol( 0, 10, "音がした。罠かと思ったが、", 0, 3 );
        symbol( 0, 20, "何事も起こらないようだ。", 0, 3 );
        symbol( 0, 30, "あなたは用心しながら進ん", 0, 3 );
        symbol( 0, 40, "だ。", 0, 3 );
        symbol( 0, 70, "ANY KEY", 0, 3 );
        while( ( pad() & 0xff ) );  /*  キークリア待ち  */
        while( !( pad() & 0xff ) ); /*  キー待ち    */
        goto    SCENE19;
    }
    else {
        symbol( 0, 0, "通路を進むと足元で小さな", 0, 3 );
        symbol( 0, 10, "音がしたかと思うと、天井", 0, 3 );
        symbol( 0, 20, "が突然崩れてきた。不意を", 0, 3 );
        symbol( 0, 30, "付かれたあなたは避ける事", 0, 3 );
        symbol( 0, 40, "が出来ず、そのまま天井の", 0, 3 );
        symbol( 0, 50, "下敷きになってしまった。", 0, 3 );
        symbol( 0, 70, "ANY KEY", 0, 3 );
        while( ( pad() & 0xff ) );  /*  キークリア待ち  */
        while( !( pad() & 0xff ) ); /*  キー待ち    */
        goto    SCENE18;
    }

/********************************************************/
/*  シーン18                                            */
/********************************************************/
SCENE18:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "無残な死体と化したあなた", 0, 3 );
    symbol( 0, 10, "の頭上に、魔王の高笑いが", 0, 3 );
    symbol( 0, 20, "響いていた。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;

/********************************************************/
/*  シーン19                                            */
/********************************************************/
SCENE19:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "通路は階段へと変わる。あ", 0, 3 );
    symbol( 0, 10, "なたはためらいも無く階段", 0, 3 );
    symbol( 0, 20, "を上った。いよいよ魔王と", 0, 3 );
    symbol( 0, 30, "の対決の時が来たのだ。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE20;

/********************************************************/
/*  シーン20                                            */
/********************************************************/
SCENE20:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王「よくぞここまでたど", 0, 3 );
    symbol( 0, 10, "り着いたな。誉めてやろう。", 0, 3 );
    symbol( 0, 20, "おまえほどの力と知恵のあ", 0, 3 );
    symbol( 0, 30, "るものはワシの配下にはお", 0, 3 );
    symbol( 0, 40, "らん。」", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE21;

/********************************************************/
/*  シーン21                                            */
/********************************************************/
SCENE21:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王「どうだ、ワシに忠誠", 0, 3 );
    symbol( 0, 10, "を誓って世界を我が物にし", 0, 3 );
    symbol( 0, 20, "たいと思わないか。」", 0, 3 );
    symbol( 0, 60, "A:誘いに乗る", 0, 3 );
    symbol( 0, 70, "B:誘いに乗らない", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( 1 )  /*  キー入力待ち    */
    while( 1 ) {
        if( pad() & PAD_A ) goto    SCENE22;
        if( pad() & PAD_B ) goto    SCENE23;
    }

/********************************************************/
/*  シーン22                                            */
/********************************************************/
SCENE22:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "あなたは魔王の配下となっ", 0, 3 );
    symbol( 0, 10, "た。あなたという強力な力", 0, 3 );
    symbol( 0, 20, "を得た魔王軍はより強大と", 0, 3 );
    symbol( 0, 30, "なり、魔王の支配は永遠に", 0, 3 );
    symbol( 0, 40, "続く事になった。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;

/********************************************************/
/*  シーン23                                            */
/********************************************************/
SCENE23:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王の誘いも、あなたの正", 0, 3 );
    symbol( 0, 10, "義の心を揺るがす事はなか", 0, 3 );
    symbol( 0, 20, "った。あなたは世界を救う", 0, 3 );
    symbol( 0, 30, "ため、魔王へと戦いを挑む。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE24;

/********************************************************/
/*  シーン24                                            */
/********************************************************/
SCENE24:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    if( a == 1 ) {
        symbol( 0, 0, "偉大なる神々の力が込めら", 0, 3 );
        symbol( 0, 10, "れた聖剣を振りかざすと、", 0, 3 );
        symbol( 0, 20, "魔王は金縛りにあったよう", 0, 3 );
        symbol( 0, 30, "に動く事が出来なくなった。", 0, 3 );
        symbol( 0, 70, "ANY KEY", 0, 3 );
        while( ( pad() & 0xff ) );  /*  キークリア待ち  */
        while( !( pad() & 0xff ) ); /*  キー待ち    */
        goto    SCENE25;
    }
    else {
        symbol( 0, 0, "あなたは力の限りを尽くし", 0, 3 );
        symbol( 0, 10, "魔王と戦った。しかし、魔", 0, 3 );
        symbol( 0, 20, "王の力は強大で、ついにあ", 0, 3 );
        symbol( 0, 30, "なたは力尽きてしまった。", 0, 3 );
        symbol( 0, 70, "ANY KEY", 0, 3 );
        while( ( pad() & 0xff ) );  /*  キークリア待ち  */
        while( !( pad() & 0xff ) ); /*  キー待ち    */
        goto    SCENE27;
    }

/********************************************************/
/*  シーン25                                            */
/********************************************************/
SCENE25:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "あなたが渾身の力を込めて", 0, 3 );
    symbol( 0, 10, "振り下ろすと、魔王は断末", 0, 3 );
    symbol( 0, 20, "魔の叫びを残し滅び去った。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    SCENE26;

/********************************************************/
/*  シーン26                                            */
/********************************************************/
SCENE26:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "魔王が滅びると、配下の悪", 0, 3 );
    symbol( 0, 10, "魔はたちまち力を失った。", 0, 3 );
    symbol( 0, 20, "代わって力を取り戻した", 0, 3 );
    symbol( 0, 30, "神々と精霊により悪魔は討", 0, 3 );
    symbol( 0, 40, "伐され、再び世界は光と希", 0, 3 );
    symbol( 0, 50, "望に満ちたものとなった。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;

/********************************************************/
/*  シーン27                                            */
/********************************************************/
SCENE27:
    fill( 0, 0, 127, 87, 0 );   /*  画面クリア  */
    symbol( 0, 0, "あなたという最後の望みを", 0, 3 );
    symbol( 0, 10, "失った世界には、もはや希", 0, 3 );
    symbol( 0, 20, "望は残っていい。未来永劫、", 0, 3 );
    symbol( 0, 30, "魔王の支配する暗黒の時代", 0, 3 );
    symbol( 0, 40, "が続くのだった。", 0, 3 );
    symbol( 0, 70, "ANY KEY", 0, 3 );
    while( ( pad() & 0xff ) );  /*  キークリア待ち  */
    while( !( pad() & 0xff ) ); /*  キー待ち    */
    goto    GAMEEND;


GAMEEND:

ダウンロード

textadventure.zip

改良案

改良案…うーんと、今回はあまりいいネタが思いつきませんね。シナリオを書き換えるのはもちろんアリです。BGMを慣らしたり背景画を入れたりする事も出来ますが、シンプルライブラリだけだとちょっと苦労しそうです。

念のために書き添えておきますが、ちゃんとしたアドベンチャーゲームを作りたい人は、データとコードの分離をした方が圧倒的に楽です。あくまでもプログラム学習用の方法と割り切って見てくださいね。プログラムはあんまり出来ないって人は、P/ECE VISUALNOVEL SYSTEM(http://zurachu.net/piece/pvns/、閉鎖されています)などのツールを使った方がいいでしょう。