サンプルプログラム4
1~3と少しずつやることをふやしてきたサンプルプログラムも、ついにゲームをプログラムするところまで来ました。
ここで出てくるゲームは「数当てゲーム」とか「ハイ・ロー・ゲーム」とか言われる、ものすごく短いゲームプログラムです。
ぶっちゃけそれほどおもしろいゲームじゃないんですが、その短さだけはほめてあげていいと思います。
私もいちばん最初に作ったのがこのゲームでした。何百人ものプログラマーたちが、最初にこのあんまりおもしろくはないけど、とりあえずプログラムが短くて簡単なゲームを作って自信をつけていったものです。
今回はいつもと違って、サンプルプログラムで新しく出てくる命令はほとんどありません。
どうやってゲームを作ればいいのか、そこを楽しんで読んでみてください。

サンプルプログラム4はムカシからつたわるゲーム、数当てゲームじゃ。ためしに遊んでみるとよかろう。
LOAD”SAMPLE4”
RUN
ニコチャンЖカ゛カンカ゛エタ、
0―99マテ゛ノ スウシ゛ヲ アテテクタ゛サイ
Ж:0―99マテ゛ノスウシ゛ハ?

1~100じゃなく0~99ってあたり、さっきオボエたコトがなんとなくカブってくるぜ! さては+1するのをサボりやがったな?

う、ウム。遊んだだけでBASICのクセからプログラムをスイリできるとは、ワンパク君もなかなかプログラムがワカってきたのう。よいコトじゃぞい。

なんだかゴマかされた気もするが……とにかく数字を打つゼ! 66なんてどうだ?
Ж:HINT(チイサイヨ)

アァ? ハズれたってことか!

ヒントっていうのは、ワンパク君の66がЖの考えた数字よりも小さいってことだね。

正解は66より大きい数……つまり、67~99のうちどれかってコトさ。一気にしぼりこめたね。

メンドくせーコトはヌキでいくぜ! ザックリ80でどうだ!
Ж:HINT(オオキイテ゛ス)

ということは、正解は80よりもっと小さい……

あわせて考えれば、67~79のうちどれかだね!

となると、オレのカンが72とつげているゼ!

……というカンジで、数字をしぼっていくのじゃな。3人のアツいプレーはちょっと飛ばすぞい。
Ж:アタリ!!!!

イェー! 7手目で当たりが出たぜ!

タンジュンだけど、ロンリ的と言えなくもないゲームだね。攻略法はすぐに見つかってあとは作業になるけど、ミスをへらすのはそれなりに楽しいんじゃないかな。

インテリ君、キミのコトバはあたってるだけにグサグサくるぞい……

それじゃあプログラムを見てみようか。はじめに表示されるメッセージまでは、もうプログラムをお手本にしないでも自分で書けるくらいだよね。
0001#. ’┌───────────┐
0002#. ’│SAMPLE4 │
0003#. ’│ カス゛アテケ゛-ム │
0004#. ’└───────────┘
0005#. VISIBLE 1,1,0,0,0,0
0006#. CLS:COLOR 0:BGMSTOP
0007#. PRINT”┌─────────┐”
0008#. PRINT”│カス゛アテケ゛-ム│”
0009#. PRINT”└─────────┘”
0010#. PRINT”ニコチャンЖカ゛カンカ゛エタ、”
0011#. PRINT”0―99マテ゛ノ スウシ゛ヲ アテテクタ゛サイ”

さらっと飛ばしやがったが、たしかに’(REM)文だのPRINTだの、いつものヤツってところだな。

あれ、でも1つだけ新しい命令があるよ。
0006#. CLS:COLOR 0:BGMSTOP
この
BGMSTOPはまだ習ってないよね?

フム、CLSじゃのCOLOR 0じゃの、プログラムをまっさらにしている部分のことじゃの。こういうのはプログラムでは「初期化」と言うのじゃが……

ハナシがなげェぜ! つまりコレもプログラムのジュンビってコトだな?

ま、まあそのとおりじゃ。

コレだけだとよくわからないよね。本当はBGMPLAYという命令とセットで使われる命令なんだ。

また新しいのが出てきやがった……ヤッカイなヨカンがするぜ。

そうムズカシくはないよ。ためしに、こう書きかえてみよう。
0006#. CLS:COLOR 0:BGMPLAY 1

あれ!? RUNしたら音楽が鳴りはじめたよ!

BGMPLAYの「BGM」はわかるよね。あえて言えば「バックグランドミュージック」、つまりこういう後ろでかかってる音楽のことだけど……

ガキあつかいのセツメイはゴメンだぜ! だが、「PLAY」はサッパリわからねーな!

わからないんだ。

プレイと読めばわかるんじゃないかな。オーディオプレイヤーにも「再生」ボタンにPLAYと書いてあったりするよね。

そもそもオーディオプレイヤーってコトバに「プレイ」って入ってるじゃねーか! つまり、BGMPLAYはBGMを鳴らす命令ってワケか?

そういうコト! プチコンには
BGMPLAY 0~
BGMPLAY 29までの30曲が入っているよ。どんな曲なのかはだいたい
ココに書いてあるかな。

このプログラムで数字を変えてRUNしてもスグに曲がきけるね。

それはいいが、オイちょっと待てよ? コレ曲が止まらねェぞ! マズいじゃねェか!

BGMだから、ループして終わらない曲も多いんだね。

そこで使うのがBGMSTOP命令! これでBGMPLAYした曲がスグに止まるんだ。

このサンプルプログラムで
BGMSTOPを使っているのは、もしこれより前に
BGMPLAYしていたら止めておく、というシンセツ心じゃな。
せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。
0006#. CLS:COLOR 0:BGMPLAY 1
0037#. BGMSTOP:END
ゲームのおわりと同時にBGMも止まるようにしておいたぞい。

これをEND:BGMSTOPと書いちゃうと、BGMを止める前にプログラムが終わっちゃうから気をつけてね!

セイカイの数字を決めるのは14行目だな。
0013#. ’--- Ж:スウシ゛ヲカンカ゛エル
0014#. ANS=RND(100)
変数
ANSに0~99までのどれかを入れる。ナニもムズカシいことはねェぜ!

そのあとはいよいよプログラムの中心部だね。
0017#. @RETRY
0018#. PRINT””
0019#. INPUT”Ж:0―99マテ゛ノスウシ゛ハ”;NO
0020#. IF NO<0 OR NO>99 THEN @RETRY
0021#. IF NO==ANS THEN @BINGO
0022#. IF NO<ANS THEN @SMALL

ラベルがあって、1行あけて、変数NOに数字を入力させて……19行目まではカンタンだね。

だが20行目のIF文の使い方は見たことがねェぜ、また新しい書き方かよチキショー!

IF NO<0 OR NO>99 THENという使い方だね。
この行を2つに分けて考えてみようか。
IF NO<0 THEN @RETRYや、IF NO>99 THEN @RETRYと書かれればイミはわかるよね。

ただのIF文じゃねえか、ラクショーだぜ! 「もしも変数NOのナカミが0より小さければ」「もしも変数NOのナカミが99より大きければ」どっちでもラベル@RETRYに行くってコトだろ?

モンダイは間に入っていたORだね。

それがカンタンなのさ。IF NO<0 OR NO>99 THEN @RETRYと書いたら、それは「もしも変数NOのナカミが0より小さければ」「もしも変数NOのナカミが99より大きければ」どっちでもラベル@RETRYに行くってコトなんだからね。

そりゃオレの言ったこととソックリ同じじゃねェか!……ハッ!?

わかってきたかな。「OR」というのは英語で「または」ってこと。「IF ~ OR ~ THEN」は「もしも~または~ならば」というイミになるね。

20行目で言えば「もしもNO<0またはNO>99ならば@RETRYに行く」ってコトだな。

0より小さくても99より多くても、ゲームには関係ない数字だから@RETRYに帰ってやりなおすんだね。そうか、前にやった「例外処理」だね!

ウム。まあ1000と入力されてもゲームが止まるワケではないが、ルールでは0~99の数字でやりくりすることになっておるからこうしとるワケじゃな。

サンプルでは使ってないけど、「IF ~ AND ~ THEN」という使い方もあるんだよ。「AND」はもうわかるよね。つまり……

「もしも~で、さらに~ならば」ってトコロだな! コトバどおりだぜ、ワカりやすいじゃねェか!

どうやらバッチリのようじゃな。IF文のORとANDは使いこなせばなかなかベンリじゃぞい。
ジツはこの2つは「論理積」「論理和」と言って、もっとオクのフカい使い方もあるのじゃが……さすがにムズカシすぎるのでいまは考えんでよかろう。

残りの行はこれまでのおさらいでわかるね。
0021#. IF NO==ANS THEN @BINGO
0022#. IF NO<ANS THEN @SMALL

21行目の入力された変数NOと答の変数ANSが同じってコトは、正解したってコトだね。この先にあるラベル@BINGOに行くんだ。

22行目は入力された変数NOが答の変数ANSより小せえトキ……ま、そのマンマじゃねェの? ラベル@SMALLに行く、と。

どちらの条件も数当てゲームのキホンじゃな。

あれ? でも、答に当たった時と、答より小さい時……まだ「答より大きい時」のIF文がないよ!?

ほっほっほ。これも例外処理のトキにオボエたやり方じゃぞい。
答に当たった時はラベル@BINGOに行く。答より小さければラベル@SMALLに行く。……もし、変数NOが答より大きかったら、どっちのラベルにも行かないハズじゃな?

そのままプログラムの先に行くと……あっ!

さよう。その2つの条件をすり抜けたということは、変数NOは答より大きいに決まっておる。じゃから、IF文を使うまでもなく、そのまま24行まで進んでいいのじゃよ。

24~27行までは、入力された数が答より大きかった時のプログラムだね。
0024#. @BIG
0025#. BEEP 4
0026#. PRINT”Ж:HINT(オオキイテ゛ス)”
0027#. GOTO @RETRY

ムズカシイことは何もなさそうだね。音を鳴らして、文字を書いて、また入力のためにラベル@RETRYに戻る……。

うむうむ。さすがにここまで来ると、みんなよくワカってきたようじゃな。

29~32行目もほとんど同じだな!
0029#. @SMALL
0030#. BEEP 6
0031#. PRINT”Ж:HINT(チイサイヨ)”
0032#. GOTO @RETRY
入力された数が答より小さいトキはこうするってダケだぜ!

もう気がついてると思うけど、ラベルの名前に使ってる英語は「BIG(大きい)」「SMALL(小さい)」「RETRY(やり直し)」というふうに、ナカミをあらわしてるんだ。

ラベルの名前はわかりやすいのがイチバンじゃな。
ところで29~32行はラベル@SMALLに飛んできて、ひととおり動いたらまた@RETRYに帰るワケじゃが、こういう行って帰ってくる小さなプログラムのブロックを「サブルーチン」と呼ぶのじゃぞ。豆チシキじゃ。

チッ! ただでさえイロイロつめこんでるサイチュウなのに、いらねえチシキまでふやされちゃタマらねーぜ!

まあまあ。サブルーチンの考え方は、プログラムにはダイジなものさ。これからも出てくるセンモン用語だから、オボエておいてソンはないよ。
ルーチン

「処理」ってコトバがスデにセンモン用語っぽいが……ヨウするに「コンピューターにやらせるコト」は全部ショリか。

34行から終わりまでの4行は、どこかに帰るワケじゃないけど、小さなブロックだからサブルーチンと言っていいのかな?
0034#. @BINGO
0035#. BEEP 34
0036#. PRINT”Ж:アタリ!!!!”
0037#. BGMSTOP:END
「
BINGO(当たり)」っていうラベル名どおり、当たった時のプログラムだよね。

まあ「行って帰る」のがサブルーチンとは言ったが、あまりムズカシく考えず、これもサブルーチンのひとつでいいじゃろうな。
@BIGも「行って帰る」の「行って」があるかというとビミョウじゃが、これもサブルーチンではあるしのう。

ザックリしすぎて、ワカるようなワカんねえようなハナシだぜェ……。

こういうのはフンイキでおぼえておけばOK! もう少しあとでサブルーチンがクローズアップされるから、その時まではザックリでいこうね。

さて、ここまででサンプルプログラムがどう書かれているかはゼンブ見おわったかのう。

RND命令で決めた答を、INPUT文で当てさせるのが中心でしたね。

当たったかどうかはIF~THEN文でしらべて……

デカいか、小せえか、当たったか、サブルーチンでケッカを出すってワケだ。
けっこうタンジュンじゃねえの?

ここまで来たショクンなら、そうじゃろう。思えばズイブン成長したものじゃわい。
このさいじゃから、ひとつテストを出してみようかの。

テ、テスト!?

このゲームは少ない回数で答にたどりつくほどエラいわけじゃが、「何回使ってクリアしたか」がヒョウジされておらん。そこで、ゲームクリアしたら回数をヒョウジするようにしてもらおうかの。

つ、つまりゲームとしておもしろくするためのクフウってヤツか。そういうコトならノゾむところだゼ!

(わりとタンジュンだなあ……)

1回答えるたびに数字がふえていく、つまり数字がヘンカしていく……ということは、何を使えばいいかもうわかるね。

オウ! 変数のデバンってワケだな!

とりあえず、変数名はSCORE(スコア)でいいかな。

ウッカリ「スコレ」と読みそうなことをのぞけば、わかりやすいぜ。

う、うん。とりあえず、スコアを書くところだけやっておこうか。
0037#. PRINT SCORE;”カイテ゛クリア”
0038#. BGMSTOP:END
いまの37行をひとつ下にずらして、その上に書いておいたよ。

まだトチュウだが、このままクリアするとどうなるんだ?
RUN

ワンパク君、なかなかサエておるな。カンセイするまで待たずに、ちょっとずつテストしてみるのもプログラムにはダイジじゃぞ。
Ж:アタリ!!!!
0カイテ゛クリア
OK

ウォオー! ハイスコアをたたき出しちまったぜ! スゲエ!

……どんだけテンネンなのじゃ。アキラカにそのケッカはおかしいぞい。

そういえば変数は、なにもしないままだとゼロになるんだったね。じゃあ、ダイジな「1回答えるたびに1増える」プログラムを足していこう。

プレイヤーが答えるというと、この行だね。
0019#. INPUT”Ж:0―99マテ゛ノスウシ゛ハ”;NO

そうだね。このあとに変数SCOREを1ふやすことにしよう!

いまゼロの変数を1にふやす……ツマリSCORE=1……か?

……それだと、2にふやすことができないんじゃないかな。

この方法はサンプルプログラム3で出てきたね。
SCORE=SCORE+1と書けば、1ずつふえていくハズだよ。
0020#. SCORE=SCORE+1

お、オウ。オレとしたコトが、ウッカリしていたぜ。
とにかく、コレでスコアが出るようになったハズだゼ!
RUN

フフフ。それはどうじゃろうな?

ナニをキショク悪いワラい方してやがる……。見やがれ、うまく動いてるゼ!
Ж:アタリ!!!!
7カイテ゛クリア
OK

うん。そこまではモンダイないんだけど……
RUN

……あっ! そうか!

なんのハナシだ? もう1回やっても……オ、オォ!?
Ж:アタリ!!!!
15カイテ゛クリア
OK

な、なぜだ! いまオレはタシカに8回でクリアしたハズだぜ! サスガに15回もかけるほどねぼけちゃいねえ!

アリガチなシッパイじゃったな。変数はプログラムがENDで終わっても、変わらずにプチコンの中にノコっているのじゃよ。

……つまり、最初にクリアした7回からまた数えはじめて、1ずつプラスしちまってたのか……。
だが、ゲンインがワカればコワくねえゼ! ゲームを始めるたびにリセットすりゃいいんだろ?
0015#. SCORE=0
ゲームが始まるマエにこう書いとけば、カイケツだゼ!

ワンパク君……! イガイにもセイカイじゃぞ! これでテストはクリアーじゃ。

もっともボクのシュミとしては、プログラムのはじめに
CLEAR命令を使って、変数をまるごとリセットする方が好きかな。
0006#. CLS:COLOR 0:BGMPLAY 1:CLEAR

インテリ君……! どっちかと言えば、そっちの方がなおセイカイじゃ!

ナットクいかねェー!!

ウーム……。このチョウシでプログラムにまた何か書きたしていくと、変数が増えるたびにリセットの命令を書くのがメンドウじゃからな。CLEARと1回書いておけば、もうシンパイないというコトじゃ。

チッ……、フロントマンのおカブをウバわれちまったぜ。こうなったらもうブンなぐるしかねェか?

キミのパンクスピリットはかたよってると思うぞい……。
- BGMPLAY命令、BGMSTOP命令
- BGMPLAY (曲番号)
0~29の音楽を鳴らします。
BGMSTOP
BGMPLAY命令で再生している音楽を止めます。
- 条件式のANDとOR
- IF (条件式) OR (条件式) THEN (命令)
条件式のどちらかが一致していれば命令を実行します。
IF (条件式) AND (条件式) THEN (命令)
全部の条件式が一致したときだけ命令を実行します。