テキストアドベンチャー
最近ですとビジュアルノベルなどと呼ばれますが、むかーしはアドベンチャーゲームと呼んでいました。特に画像が出ないものをテキストアドベンチャーと言っていましたが、中身はこんな単純なものでも出来上がるのです。
プログラム
/* フラグ初期化 */
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:
ダウンロード
改良案
改良案…うーんと、今回はあまりいいネタが思いつきませんね。シナリオを書き換えるのはもちろんアリです。BGMを慣らしたり背景画を入れたりする事も出来ますが、シンプルライブラリだけだとちょっと苦労しそうです。
念のために書き添えておきますが、ちゃんとしたアドベンチャーゲームを作りたい人は、データとコードの分離をした方が圧倒的に楽です。あくまでもプログラム学習用の方法と割り切って見てくださいね。プログラムはあんまり出来ないって人は、P/ECE VISUALNOVEL SYSTEM(http://zurachu.net/piece/pvns/、閉鎖されています)などのツールを使った方がいいでしょう。