プチコンmkII

プチコンmkII 初心者講座

サンプルプログラム4

プログラマーからひとこと

1~3と少しずつやることをふやしてきたサンプルプログラムも、ついにゲームをプログラムするところまで来ました。

ここで出てくるゲームは「数当てゲーム」とか「ハイ・ロー・ゲーム」とか言われる、ものすごく短いゲームプログラムです。
ぶっちゃけそれほどおもしろいゲームじゃないんですが、その短さだけはほめてあげていいと思います。
私もいちばん最初に作ったのがこのゲームでした。何百人ものプログラマーたちが、最初にこのあんまりおもしろくはないけど、とりあえずプログラムが短くて簡単なゲームを作って自信をつけていったものです。

今回はいつもと違って、サンプルプログラムで新しく出てくる命令はほとんどありません。
どうやってゲームを作ればいいのか、そこを楽しんで読んでみてください。

数当てゲームを遊んでみよう

ハカセ「サンプルプログラム4はムカシからつたわるゲーム、数当てゲームじゃ。ためしに遊んでみるとよかろう。
LOAD”SAMPLE4”
RUN
画面
ニコチャンЖカ゛カンカ゛エタ、
0―99マテ゛ノ スウシ゛ヲ アテテクタ゛サイ
Ж:0―99マテ゛ノスウシ゛ハ?
ワンパク「1~100じゃなく0~99ってあたり、さっきオボエたコトがなんとなくカブってくるぜ! さては+1するのをサボりやがったな?
ハカセ「う、ウム。遊んだだけでBASICのクセからプログラムをスイリできるとは、ワンパク君もなかなかプログラムがワカってきたのう。よいコトじゃぞい。
ワンパク「なんだかゴマかされた気もするが……とにかく数字を打つゼ! 66なんてどうだ?
Ж:HINT(チイサイヨ)
ワンパク「アァ? ハズれたってことか!
神崎「ヒント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マテ゛ノ スウシ゛ヲ アテテクタ゛サイ”
ワンパク「さらっと飛ばしやがったが、たしかに(REM)文だのPRINTだの、いつものヤツってところだな。
神崎「あれ、でも1つだけ新しい命令があるよ。
0006#. CLS:COLOR 0:BGMSTOP
このBGMSTOPはまだ習ってないよね?
ハカセ「フム、CLSじゃのCOLOR 0じゃの、プログラムをまっさらにしている部分のことじゃの。こういうのはプログラムでは「初期化しょきか」と言うのじゃが……
ワンパク「ハナシがなげェぜ! つまりコレもプログラムのジュンビってコトだな?
ハカセ「ま、まあそのとおりじゃ。
インテリ「コレだけだとよくわからないよね。本当はBGMPLAYという命令とセットで使われる命令なんだ。
ワンパク「また新しいのが出てきやがった……ヤッカイなヨカンがするぜ。
インテリ「そうムズカシくはないよ。ためしに、こう書きかえてみよう。
0006#. CLS:COLOR 0:BGMPLAY 1
神崎「あれ!? RUNしたら音楽が鳴りはじめたよ!
インテリ「BGMPLAYの「BGM」はわかるよね。あえて言えば「バックグランドミュージックBack Ground Music」、つまりこういう後ろでかかってる音楽のことだけど……
ワンパク「ガキあつかいのセツメイはゴメンだぜ! だが、「PLAY」はサッパリわからねーな!
神崎「わからないんだ。
インテリ「プレイPLAYと読めばわかるんじゃないかな。オーディオプレイヤーにも「再生」ボタンにPLAYと書いてあったりするよね。
ワンパク「そもそもオーディオプレイヤーってコトバに「プレイ」って入ってるじゃねーか! つまり、BGMPLAYはBGMを鳴らす命令ってワケか?
インテリ「そういうコト! プチコンにはBGMPLAY 0BGMPLAY 29までの30曲が入っているよ。どんな曲なのかはだいたいココに書いてあるかな。
神崎「このプログラムで数字を変えてRUNしてもスグに曲がきけるね。
ワンパク「それはいいが、オイちょっと待てよ? コレ曲が止まらねェぞ! マズいじゃねェか!
神崎「BGMだから、ループして終わらない曲も多いんだね。
インテリ「そこで使うのがBGMSTOP命令! これでBGMPLAYした曲がスグに止まるんだ。
ハカセ「このサンプルプログラムでBGMSTOPを使っているのは、もしこれより前にBGMPLAYしていたら止めておく、というシンセツ心じゃな。
せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。
0006#. CLS:COLOR 0:BGMPLAY 1

0037#. BGMSTOP:END
ゲームのおわりと同時にBGMも止まるようにしておいたぞい。
インテリ「これをEND:BGMSTOPと書いちゃうと、BGMを止める前にプログラムが終わっちゃうから気をつけてね!

条件式のANDとOR

ワンパク「セイカイの数字を決めるのは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のナカミがより小さければ」「もしも変数NOのナカミが99より大きければ」どっちでもラベル@RETRYに行くってコトだろ?
神崎「モンダイは間に入っていたORだね。
インテリ「それがカンタンなのさ。IF NO<0 OR NO>99 THEN @RETRYと書いたら、それは「もしも変数NOのナカミがより小さければ」「もしも変数NOのナカミが99より大きければ」どっちでもラベル@RETRYに行くってコトなんだからね。
ワンパク「そりゃオレの言ったこととソックリ同じじゃねェか!……ハッ!?
インテリ「わかってきたかな。「ORオア」というのは英語で「または」ってこと。「IF  OR  THEN」は「もしも~または~ならば」というイミになるね。
ワンパク「20行目で言えば「もしもNO<0またはNO>99ならば@RETRYに行く」ってコトだな。
神崎「より小さくても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行の@BIGまで進んでいいのじゃよ。

3つのサブルーチン

インテリ「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に帰るワケじゃが、こういう行って帰ってくる小さなプログラムのブロックを「サブルーチン」と呼ぶのじゃぞ。豆チシキじゃ。
ワンパク「チッ! ただでさえイロイロつめこんでるサイチュウなのに、いらねえチシキまでふやされちゃタマらねーぜ!
インテリ「まあまあ。サブルーチンの考え方は、プログラムにはダイジなものさ。これからも出てくるセンモン用語だから、オボエておいてソンはないよ。
ルーチンroutineは日本語で「きまりきった仕事」という意味になるけど、コンピューター用語では「ひと通りのきまった処理」ってところかな。
ワンパク「処理ショリ」ってコトバがスデにセンモン用語っぽいが……ヨウするに「コンピューターにやらせるコト」は全部ショリか。
神崎「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 (命令)
全部の条件式が一致したときだけ命令を実行します。