2019年01月21日

プチコンゲームプログラミング講座~第三回「コマンド入力ゲームを作ろう」

文 プチ太郎 氏
=-=-=-=-=-=-=-=-=-=-
最初の三回がみんな、ボタンを押して進むプログラムだったので、ちょっと講座の速度が遅くなっちゃったかな。無理しない程度に、ペースを上げて行きましょう。
 反射神経にたよるプログラムが続いたので、ここでもう一つのTVゲームの代表格である、入力するまでコンピュータが待ち続けてくれるゲーム、つまり「コマンド入力ゲーム」を作ってみましょう。代表作にはシミュレーションゲーム(スタートレック、シムシティなど)やロールプレイングゲーム(ドラクエ、プチコンのGAME2など)がありますが、今回はアドベンチャーゲーム(以下、略す場合ADV)で行くことにしました。
 ADVと言っても、当初は「サガセ ココ」と入力したり、コマンド入力式になっても「みる」「うごかす」「なぐる」とコマンドが多かったり、遊びにくいものでした。しかし、今の場面から2~3の項目どれかを選択すれば、木の枝のように展開が分かれていって、バッドエンドやグッドエンドがある…というものなら、かなり簡単です。ADVではないが近年のゲームでは、「アイドルマスター」がこれでしたね。
 ここではRPGやギャルゲー、特に最近ソーシャルゲームで目にする機会も多い、キャラクターやメッセージが出る会話システムのサンプルゲームを紹介し、プログラムを見ていきましょう。
教材プログラム 3 「ミニアドベンチャーゲーム」(ファイル名「KOZA03」)

koz03_s1.jpg

★ ゲームの内容と説明 ★
 あなたは、手に入れればプログラミングが上手くなるという、伝説の宝石「プチコン」を探して、このスマイルブームの町に来た。町にはいろんな人も住んでいるが、モンスターもいるという。無事にプチコンをゲット出来るだろうか?
 先ほども話した通り、2~3のコマンドを選んでグッドエンドを目指すゲームです。また選ぶだけではつまらないので、誰かに会ったり中間目的のアイテムを入手したかなどの、いわゆる「フラグ」も使っています。
 ADVの進み方にもいろいろありますが、今回はスタート地点から枝分かれに進むという簡単なルートにしました。しかしいつかは奥まで行きつきます。一方通行で進めないと、ハマってラストまで行けない可能性があるので、一部を除きバック出来る様にしています。
 今回から急に270行以上の量となり、驚いた方もいると思いますが、ADVという事で、過半数がそれぞれの場面の会話に使われているだけです。実際にリストを見ると、同じような処理ばかり並んでいるのが判ります。
 なおBGMは、一部のシーンを除いて流れません。現代のプログラム技術では任意に流す事など簡単なのですが、今回いろいろあって開発時間が短く(言えない…コミケで三日間つぶした後、正月三が日で急遽仕上げたなんて…w)、実装のデバッグが間に合いませんでした。ゴメンネ!

★ プログラムの説明1:初期設定 ★
 2行:DIM 変数[数字(添字:ソエジと読む)]という記述があります。これは配列(はいれつ)変数と言って、中規模上のプログラムでは避けて通れない大事な要素なので、少し字数を使って説明します。同じような変数と処理を「変数A1の処理:変数A2の処理:変数A3の処理…」と並べると、大変な量になってしまいます。そこでDIMで角カッコの中の数字を定義すると、定義した数字の分だけ、それぞれが別の変数として使えます。例えば三つの似た変数を使いたいなら「DIM A[3]」と書くと、A[0]・A[1]・A[2]がそれぞれ変数として使えます(DIMは3、添字は0~2である点に注意!)これを全部似たような処理で使うなら、「FOR I=0 TO 2:変数A[I]の処理:NEXT」と書けば、三つ全部が一ヶ所でまとまります、配列は後日さらに説明したいと思います。
 7~11行:BGで背景を作っています。本当はシーンごとに独自のキャラと背景が必要ですが、容量の関係でとても無理でした。町並みは10行のBGSCALEで大きさを二倍にし、11行で231~245番の建物用のBGをランダムに並べています。
 12~17行:冒頭の説明で、13~16行で文章を書いています。WAKUとHABは後述。
koz03_p1.jpg

★ プログラムの説明3:定義済み処理 ★
 例によって同じ処理が何度も出てくる場合、いちいち個別に書いている面倒なので、ここで定義しています。これは初心者のプログラムの行数が増えてしまう原因の一つで、初心者で1000行をこえてしまうプログラムも、うまくまとめれば、300行以内に収まったりします。3はリストの一番下に入っていますが、プログラムの説明と学習という事で、2より先に3を紹介します。
@YESNO 後述のDEF MENUを使って「はい/いいえ」の二者択一
@MONSTER 怪物遭遇の共通処理
 二ヶ所のどちらから出て全く同じ演出ですが、これは一方で怪物に遭遇した時、同じ場所にまた来たか?と混乱させるためです。実は戦いのルーチンも簡単で、どちらから来ても同じ選択ですぐ勝敗が決まってしまいます。負けたら@END_BADに飛んでいます。本当はGOSUBやFORから、GOTOで外に飛び出すのはルール違反なんですが、このゲームではバッドエンドだとすぐプログラムが終わる(そこでGOSUBやFORに入っているというループ情報が消える)ので、そのまま飛ばしちゃっています。一方ではアイテムがゲットできるが、これは@1112で処理しています。
@KOKOMADE 「この先進めない」のメッセージ表示
DEF WAKU LX1,LY1,LX2,LY2 枠線を描く
 コマンド入力ゲームでおなじみメッセージ枠です。最初は文字キャラの枠線で描いたのですが、複雑になったので、GFILLの青で塗りつぶし、GBOXの白で枠を描きました。このため座標はグラフィック単位でなく文字単位で、またLX2とLY2は右端の座標でなく、枠の横長さと縦高さを指定します。
DEF MCLS 文字とグラフィックの画面クリア
 COLOR命令をいじっていますが、これはそのままCLSをすると、「COLOR #TWHITE,#TBLU
E」すなわち青地に白字で塗りつぶされてしまうので、一度ゼロ(透明色)の背景でCLSしてからCOLORを戻しています。
DEF HELLO LS 住人登場
 LSは会話に現れる住民の姿で、SPSETの0が中央の大きな姿、1が右下の台詞の横に出ます。スプライトキャラ番号は、プチコンに標準装備されている464~1176番から、正面から見た姿を使っています。また32番は以前説明した通り空白なので、LS=32だと何も出ない上、BEEP 40のシュパッという音も出ません。
DEF MES LA,LB,L$ メッセージ表示
 L$に台詞を入れると、徐々に言葉が表示されますが、Bボタンを押していると、徐々なく一気に進みます。またL$の中に"/"(スラッシュ)を入れると文章が改行します。LAが1だと、スペース以外では一文字ごとにBEEPで音を出して喋っているように、0だと無音でト書きのようになります。LBが1だとDEF HABを呼び出す、つまり次の会話や展開に進む前に、ボタンが押されるまで待ちます。余談ですが開発中のプチコンをバージョン3.6.3にアップグレードしていなかったので、ここの実装時のフリーズして焦りました(WAITを入れずにBEEPを繰り返すとフリーズする)。現在のプログラムはバージョン3.6.2でもフリーズせず動くようになっています。
DEF MENU(LN) 選択メニュー
 実は変数の宣言または初使用は、「DEFの外でするとDEFの外でも中でも同じだが、DEFの中で使うとDEFの中だけ有効」という特徴があります。このため選択メニューの項目名に使うDIM Q$[3]だけは、外で宣言しました。LNはその時に表示する項目で、例えばMENU(2)ならQ$[0]とQ$[1]の二つを選ぶメニューを出します。
 236~238行:Q$[]に入っている項目を全て調べ、一番長い文字数をLLに入れています。このLLを使って、DEF WAKUで描く横幅を決めて、項目を出します。今回は選ぶ項目が少ないので、項目は縦一列にしか並びません。
 241~247行:変数LQがプレイヤーの選ぶ結果で、LQが-1になっている限り、このREPEATが続きます。BUTTON()の帰り値をLBに入れ、LBが上か下なら指マーク(カーソル)を上下させ、LAがAボタンなら、その位置の指マークのY座標から、選んだ項目番号を決めます。
 248~251行は指マークをいろんな色で描き、ここを選んだ事を判りやすく表示しています。
 順番が前後しますが、DEFの後ろにカッコがついていますが、これはDEFで処理した変数を、DEFを呼び出した所に「RETURN 変数」を使って返すという処理です。つまりここでは前述のLQを返しています。
@LR 「左に行く」「右に行く」「戻る」のメニュー項目を代入する
DEF GETITEM L$ アイテムを入手のメッセージ表示
DEF HAB ボタンが押されるまで待つ
@BAD_END バッドエンド
 END命令を入れればプログラムは終わりますが、一番後に置いて、END命令がなくても終了にしています。
koz03_p2.jpg

★ プログラムの説明2:各場面での会話処理 ★
 ネタバレの意味もあるので、大切な所だけ解説します。それぞれのシーンは枝分かれという事で、トップを@1、次の分岐は@11と@12、その分岐は@12なら@121と@122…と関連づけています。
@111 若い男の家
 アイテムの入手で、一番変化がある場所です。ここではクリアに必要なアイテム(K$[0])とは別に、QFというミニクエストのフラグを設定しており、0=初対面時/1=クエスト依頼中/2=クエスト達成/3=達成の後の4種類を、IF命令とELSEIF命令を使った「多重分岐命令」で処理しています。
@1122 盗賊風の女性の家
 ここも独自の選択をしているが、一方を選ぶとバッドエンドになります。
@12 老人の家
 特に苦労もせず、重要アイテム(K$[1])をゲットできます。アイテムをゲットすると台詞が変わります。
@121 若い女の家
 @111から続くイベントです。QFが0=@111でクエストも起きてないので進展なし/1=クエスト依頼なのでQFを2にする/2か3=クエスト達成なのでその後のセリフと変わります。
koz03_s3.jpg

@1212 王様の家
 何か月かかってもクリア出来ない本格ADVではないので、グッドエンドは簡単に作りました。KF[0]とKF[1]とKF[2]を三つ掛けてゼロになる、つまりどれか一つでもフラグがまだゼロなら「三つ無いか」、そうでなければ三つとも持っているのでグッドエンドとなります。この時演出として「SPCHR 0,24」で王様の姿を宝石にしてみました。
@122 ジャンケン騎士の家
 ADVの中には理づくめだけでなく、運にたよらないとクリアできないゲームもあるので、ここで入れてみました。DEF MENUでジャンケンをし、勝敗結果で@KATI/@MAKE/@AIKOにそれぞれ飛ばしています。ジャンプ先はもっと簡単にも書けるのですが、わかり易さを考えてこうしました。
koz03_s2.jpg

★ 最後に ★
 B-Magaさんからは、学習しやすいミニゲームをと頼まれているのですが、今回はADVなら簡単だと思ったら、別の意味で単調かつ難しいゲームになってしまったような…私自身、プログラム講座を書くのは初めてで、試行錯誤してやっております。ご勘弁ください(汗)
 実はどれくらい苦労してグッドエンドまで行けるか、検討していないんですが(^^;、完成品で手づまりせず、グッドエンドに行ける事は確認済みです。ぜひ挑戦してみて下さい!
(第四回につづく 次回はまたアクションゲームに戻ります)
★今回の教材プログラムは、サーバにアップしてありますので、サーバからダウンロードしてご覧下さい。
公開キー  :KFDRXT3(連載が進んで新しい教材プログラムが追加されると、公開キーも変わります。この公開キーでダウンロード出来ない場合は、連載の一番新しい回の公開キーをご利用下さい)
プロジェクト:KOZA
ファイル名 :上の教材プログラムの見出しをご覧下さい。
=-=-=-=-=-=-=-=-=-=-
次の更新は、1月24日、『フリーゲームレビュー』の予定です。お楽しみに!