サンプルプログラム4
プログラマーからひとこと
1~3と少しずつやることをふやしてきたサンプルプログラムも、ついにゲームをプログラムするところまで来ました。ここで出てくるゲームは「数当てゲーム」とか「ハイ・ロー・ゲーム」とか言われる、ものすごく短いゲームプログラムです。
ぶっちゃけそれほどおもしろいゲームじゃないんですが、その短さだけはほめてあげていいと思います。
私もいちばん最初に作ったのがこのゲームでした。何百人ものプログラマーたちが、最初にこのあんまりおもしろくはないけど、とりあえずプログラムが短くて簡単なゲームを作って自信をつけていったものです。
今回はいつもと違って、サンプルプログラムで新しく出てくる命令はほとんどありません。
どうやってゲームを作ればいいのか、そこを楽しんで読んでみてください。
数当てゲームを遊んでみよう
ハカセ「サンプルプログラム4はムカシからつたわるゲーム、数当てゲームじゃ。ためしに遊んでみるとよかろう。」
LOAD”SAMPLE4”
RUN
RUN
ニコチャンЖカ゛カンカ゛エタ、
0―99マテ゛ノ スウシ゛ヲ アテテクタ゛サイ
Ж:0―99マテ゛ノスウシ゛ハ?
0―99マテ゛ノ スウシ゛ヲ アテテクタ゛サイ
Ж:0―99マテ゛ノスウシ゛ハ?
ワンパク「1~100じゃなく0~99ってあたり、さっきオボエたコトがなんとなくカブってくるぜ! さては+1するのをサボりやがったな?」
ハカセ「う、ウム。遊んだだけでBASICのクセからプログラムをスイリできるとは、ワンパク君もなかなかプログラムがワカってきたのう。よいコトじゃぞい。」
ワンパク「なんだかゴマかされた気もするが……とにかく数字を打つゼ! 66なんてどうだ?」
Ж:HINT(チイサイヨ)
ワンパク「アァ? ハズれたってことか!」
神崎「ヒント っていうのは、ワンパク君の66がЖの考えた数字よりも小さいってことだね。」
インテリ「正解は66より大きい数……つまり、67~99のうちどれかってコトさ。一気にしぼりこめたね。」
ワンパク「メンドくせーコトはヌキでいくぜ! ザックリ80でどうだ!」
Ж:HINT(オオキイテ゛ス)
神崎「ということは、正解は80よりもっと小さい……」
インテリ「あわせて考えれば、67~79のうちどれかだね!」
ワンパク「となると、オレのカンが72とつげているゼ!」
ハカセ「……というカンジで、数字をしぼっていくのじゃな。3人のアツいプレーはちょっと飛ばすぞい。」
Ж:アタリ!!!!
ワンパク「イェー! 7手目で当たりが出たぜ!」
インテリ「タンジュンだけど、ロンリ的と言えなくもないゲームだね。攻略法はすぐに見つかってあとは作業になるけど、ミスをへらすのはそれなりに楽しいんじゃないかな。」
ハカセ「インテリ君、キミのコトバはあたってるだけにグサグサくるぞい……」
BGMPLAY命令、BGMSTOP命令
インテリ「それじゃあプログラムを見てみようか。はじめに表示されるメッセージまでは、もうプログラムをお手本にしないでも自分で書けるくらいだよね。」
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マテ゛ノ スウシ゛ヲ アテテクタ゛サイ”
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を鳴らす命令ってワケか?」
神崎「このプログラムで数字を変えてRUNしてもスグに曲がきけるね。」
ワンパク「それはいいが、オイちょっと待てよ? コレ曲が止まらねェぞ! マズいじゃねェか!」
神崎「BGMだから、ループして終わらない曲も多いんだね。」
インテリ「そこで使うのがBGMSTOP命令! これでBGMPLAYした曲がスグに止まるんだ。」
ハカセ「このサンプルプログラムでBGMSTOPを使っているのは、もしこれより前にBGMPLAYしていたら止めておく、というシンセツ心じゃな。
せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。
」
せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。
0006#. CLS:COLOR 0:BGMPLAY 1
0037#. BGMSTOP:END
ゲームのおわりと同時にBGMも止まるようにしておいたぞい。0037#. BGMSTOP:END
」
インテリ「これをEND:BGMSTOPと書いちゃうと、BGMを止める前にプログラムが終わっちゃうから気をつけてね!」
条件式のANDとOR
ワンパク「セイカイの数字を決めるのは14行目だな。
」
0013#. ’--- Ж:スウシ゛ヲカンカ゛エル
0014#. ANS=RND(100)
変数ANSに0~99までのどれかを入れる。ナニもムズカシいことはねェぜ!0014#. ANS=RND(100)
」
インテリ「そのあとはいよいよプログラムの中心部だね。」
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
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と書かれればイミはわかるよね。」
この行を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つは「論理積」「論理和」と言って、もっとオクのフカい使い方もあるのじゃが……さすがにムズカシすぎるのでいまは考えんでよかろう。
」
ジツはこの2つは「論理積」「論理和」と言って、もっとオクのフカい使い方もあるのじゃが……さすがにムズカシすぎるのでいまは考えんでよかろう。
」
インテリ「残りの行はこれまでのおさらいでわかるね。
0021#. IF NO==ANS THEN @BINGO
0022#. IF NO<ANS THEN @SMALL
」0022#. IF NO<ANS THEN @SMALL
神崎「21行目の入力された変数NOと答の変数ANSが同じってコトは、正解したってコトだね。この先にあるラベル@BINGOに行くんだ。」
ワンパク「22行目は入力された変数NOが答の変数ANSより小せえトキ……ま、そのマンマじゃねェの? ラベル@SMALLに行く、と。」
ハカセ「どちらの条件も数当てゲームのキホンじゃな。」
神崎「あれ? でも、答に当たった時と、答より小さい時……まだ「答より大きい時」のIF文がないよ!?」
ハカセ「ほっほっほ。これも例外処理のトキにオボエたやり方じゃぞい。
答に当たった時はラベル@BINGOに行く。答より小さければラベル@SMALLに行く。……もし、変数NOが答より大きかったら、どっちのラベルにも行かないハズじゃな?」
答に当たった時はラベル@BINGOに行く。答より小さければラベル@SMALLに行く。……もし、変数NOが答より大きかったら、どっちのラベルにも行かないハズじゃな?」
神崎「そのままプログラムの先に行くと……あっ!」
ハカセ「さよう。その2つの条件をすり抜けたということは、変数NOは答より大きいに決まっておる。じゃから、IF文を使うまでもなく、そのまま24行の@BIGまで進んでいいのじゃよ。」
3つのサブルーチン
インテリ「24~27行までは、入力された数が答より大きかった時のプログラムだね。」
0024#. @BIG
0025#. BEEP 4
0026#. PRINT”Ж:HINT(オオキイテ゛ス)”
0027#. GOTO @RETRY
0025#. BEEP 4
0026#. PRINT”Ж:HINT(オオキイテ゛ス)”
0027#. GOTO @RETRY
神崎「ムズカシイことは何もなさそうだね。音を鳴らして、文字を書いて、また入力のためにラベル@RETRYに戻る……。」
ハカセ「うむうむ。さすがにここまで来ると、みんなよくワカってきたようじゃな。」
ワンパク「29~32行目もほとんど同じだな!
」
0029#. @SMALL
0030#. BEEP 6
0031#. PRINT”Ж:HINT(チイサイヨ)”
0032#. GOTO @RETRY
入力された数が答より小さいトキはこうするってダケだぜ!0030#. BEEP 6
0031#. PRINT”Ж:HINT(チイサイヨ)”
0032#. GOTO @RETRY
」
インテリ「もう気がついてると思うけど、ラベルの名前に使ってる英語は「BIG (大きい)」「SMALL (小さい)」「RETRY (やり直し)」というふうに、ナカミをあらわしてるんだ。」
ハカセ「ラベルの名前はわかりやすいのがイチバンじゃな。
ところで29~32行はラベル@SMALLに飛んできて、ひととおり動いたらまた@RETRYに帰るワケじゃが、こういう行って帰ってくる小さなプログラムのブロックを「サブルーチン」と呼ぶのじゃぞ。豆チシキじゃ。」
ところで29~32行はラベル@SMALLに飛んできて、ひととおり動いたらまた@RETRYに帰るワケじゃが、こういう行って帰ってくる小さなプログラムのブロックを「サブルーチン」と呼ぶのじゃぞ。豆チシキじゃ。」
ワンパク「チッ! ただでさえイロイロつめこんでるサイチュウなのに、いらねえチシキまでふやされちゃタマらねーぜ!」
インテリ「まあまあ。サブルーチンの考え方は、プログラムにはダイジなものさ。これからも出てくるセンモン用語だから、オボエておいてソンはないよ。
ルーチン は日本語で「きまりきった仕事」という意味になるけど、コンピューター用語では「ひと通りのきまった処理」ってところかな。」
ワンパク「「処理 」ってコトバがスデにセンモン用語っぽいが……ヨウするに「コンピューターにやらせるコト」は全部ショリか。」
神崎「34行から終わりまでの4行は、どこかに帰るワケじゃないけど、小さなブロックだからサブルーチンと言っていいのかな?
BINGO (当たり)」っていうラベル名どおり、当たった時のプログラムだよね。
」
0034#. @BINGO
0035#. BEEP 34
0036#. PRINT”Ж:アタリ!!!!”
0037#. BGMSTOP:END
「0035#. BEEP 34
0036#. PRINT”Ж:アタリ!!!!”
0037#. BGMSTOP:END
」
ハカセ「まあ「行って帰る」のがサブルーチンとは言ったが、あまりムズカシく考えず、これもサブルーチンのひとつでいいじゃろうな。
@BIGも「行って帰る」の「行って」があるかというとビミョウじゃが、これもサブルーチンではあるしのう。」
@BIGも「行って帰る」の「行って」があるかというとビミョウじゃが、これもサブルーチンではあるしのう。」
ワンパク「ザックリしすぎて、ワカるようなワカんねえようなハナシだぜェ……。」
インテリ「こういうのはフンイキでおぼえておけばOK! もう少しあとでサブルーチンがクローズアップされるから、その時まではザックリでいこうね。」
もうひとくふう
ハカセ「さて、ここまででサンプルプログラムがどう書かれているかはゼンブ見おわったかのう。」
インテリ「RND命令で決めた答を、INPUT文で当てさせるのが中心でしたね。」
神崎「当たったかどうかはIF~THEN文でしらべて……」
ワンパク「デカいか、小せえか、当たったか、サブルーチンでケッカを出すってワケだ。
けっこうタンジュンじゃねえの?」
けっこうタンジュンじゃねえの?」
ハカセ「ここまで来たショクンなら、そうじゃろう。思えばズイブン成長したものじゃわい。
このさいじゃから、ひとつテストを出してみようかの。」
このさいじゃから、ひとつテストを出してみようかの。」
ワンパク「テ、テスト!?」
ハカセ「このゲームは少ない回数で答にたどりつくほどエラいわけじゃが、「何回使ってクリアしたか」が表示されておらん。つまりはスコアじゃな。そこで、ゲームクリアしたら「何回使ってクリアしたか」表示するようにしてもらおうかの。」
ワンパク「つ、つまりゲームとしておもしろくするためのクフウってヤツか。そういうコトならノゾむところだゼ!」
神崎「(わりとタンジュンだなあ……)」
インテリ「1回答えるたびに数字がふえていく、つまり数字がヘンカしていく……ということは、何を使えばいいかもうわかるね。」
ワンパク「オウ! 変数のデバンってワケだな!」
神崎「とりあえず、変数名はSCORE(スコア)でいいかな。」
ワンパク「ウッカリ「スコレ」と読みそうなことをのぞけば、わかりやすいぜ。」
神崎「う、うん。とりあえず、スコアを書くところだけやっておこうか。
」
0037#. PRINT SCORE;”カイテ゛クリア”
0038#. BGMSTOP:END
いまの37行をひとつ下にずらして、その上に書いておいたよ。0038#. BGMSTOP:END
」
ワンパク「まだトチュウだが、このままクリアするとどうなるんだ?」
RUN
ハカセ「ワンパク君、なかなかサエておるな。カンセイするまで待たずに、ちょっとずつテストしてみるのもプログラムにはダイジじゃぞ。」
Ж:アタリ!!!!
0カイテ゛クリア
OK
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
7カイテ゛クリア
OK
インテリ「うん。そこまではモンダイないんだけど……」
RUN
神崎「……あっ! そうか!」
ワンパク「なんのハナシだ? もう1回やっても……オ、オォ!?」
Ж:アタリ!!!!
15カイテ゛クリア
OK
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 (命令)
全部の条件式が一致したときだけ命令を実行します。