1~3と少しずつやることをふやしてきたサンプルプログラムも、ついにゲームをプログラムするところまで来ました。
ここで出てくるゲームは「数当てゲーム」とか「ハイ・ロー・ゲーム」とか言われる、ものすごく短いゲームプログラムです。
ぶっちゃけそれほどおもしろいゲームじゃないんですが、その短さだけはほめてあげていいと思います。
私もいちばん最初に作ったのがこのゲームでした。何百人ものプログラマーたちが、最初にこのあんまりおもしろくはないけど、とりあえずプログラムが短くて簡単なゲームを作って自信をつけていったものです。
今回はいつもと違って、サンプルプログラムで新しく出てくる命令はほとんどありません。
どうやってゲームを作ればいいのか、そこを楽しんで読んでみてください。
サンプルプログラム4はムカシからつたわるゲーム、数当てゲームじゃ。ためしに遊んでみるとよかろう。
- LOAD”SYS/EX4NUMGAME”
- 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手目で当たりが出たぜ!
タンジュンだけど、ロンリ的と言えなくもないゲームだね。攻略法はすぐに見つかってあとは作業になるけど、ミスをへらすのはそれなりに楽しいんじゃないかな。
インテリ君、キミのコトバはあたってるだけにグサグサくるぞい……
それじゃあプログラムを見てみようか。はじめに表示されるメッセージまでは、もうプログラムをお手本にしないでも自分で書けるくらいだよね。
- ’┌──────────┐
- ’│ EXAMPLE4 │
- ’│ かずあてゲーム │
- ’└──────────┘
- XSCREEN 0
- VISIBLE 1,1,1,1
- CLS
- COLOR 15
- PRINT”┌───────┐”
- PRINT”│かずあてゲーム│”
- PRINT”└───────┘”
- PRINT”Ж:ニコチャンが かんがえた”
- PRINT”0―99までの すうじを あててください”
さらっと飛ばしやがったが、たしかに’(REM)文だのPRINTだの、いつものヤツってところだな。
フム、CLSじゃのCOLOR 15じゃの、プログラムをまっさらにしている部分のことじゃの。こういうのはプログラムでは「初期化」と言うのじゃが……
ハナシがなげェぜ! つまりコレもプログラムのジュンビってコトだな?
すっかりオナジミすぎて、シンセンミがたりねェな!
じゃあ、せっかくだから新しいことをしようか。ためしに、こう書きかえてみよう。
- CLS:BGMPLAY 1
サッソク新しいのが出てきやがった……ヤッカイなヨカンがするぜ。
そんなにムズカシくはないよ。そのままRUNしてごらん。
あれ!? 音楽が鳴りはじめたよ!
BGMPLAYの「BGM」はわかるよね。あえて言えば「バックグランドミュージック」、つまりこういう後ろでかかってる音楽のことだけど……
ガキあつかいのセツメイはゴメンだぜ! だが、「PLAY」はサッパリわからねーな!
わからないんだ。
プレイ (PLAY) と読めばわかるんじゃないかな。オーディオプレイヤーにも「再生」ボタンにPLAYと書いてあったりするよね。
そもそもオーディオプレイヤーってコトバに「プレイ」って入ってるじゃねーか! つまり、BGMPLAYはBGMを鳴らす命令ってワケか?
そういうコト! プチコンにはBGMPLAY 0~BGMPLAY 42までの43曲が入っているよ。
どんな曲があるかは、画面の下にある SMILE(スマイル)ボタンを押してスマイルツールを起動して、画面下のほうのBGMと書かれたボタンを押してみてね。
このプログラムで数字を変えてRUNしてもスグに曲がきけるね。
それはいいが、オイちょっと待てよ? コレ曲が止まらねェぞ! マズいじゃねェか!
BGMだから、ループして終わらない曲も多いんだね。
そこで使うのがBGMSTOP命令! これでBGMPLAYした曲がスグに止まるんだ。
せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。
- CLS:BGMPLAY 1
- BGMSTOP:END
ゲームのおわりと同時にBGMも止まるようにしておいたぞい。
これをEND:BGMSTOPと書いちゃうと、BGMを止める前にプログラムが終わっちゃうから気をつけてね!
セイカイの数字を決めるのは17行目だな。
- ANS=RND(100)
変数ANSに0~99までのどれかを入れる。ナニもムズカシいことはねェぜ!
そのあとはいよいよプログラムの中心部だね。
- @RETRY
- PRINT””
- INPUT”Ж:0―99までの すうじは”;NO
- IF NO<0 OR NO>99 GOTO @RETRY
- IF NO==ANS GOTO @BINGO
- IF NO<ANS GOTO @SMALL
ラベルがあって、1行あけて、変数NOに数字を入力させて……22行目まではカンタンだね。
だが23行目のIF文の使い方は見たことがねェぜ、また新しい書き方かよチキショー!
IF NO<0 OR NO>99 GOTOという使い方だね。
この行を2つに分けて考えてみようか。
IF NO<0 GOTO @RETRYや、IF NO>99 GOTO @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」は「もしも~または~ならば」というイミになるね。
23行目で言えば「もしもNO<0またはNO>99ならば@RETRYに行く」ってコトだな。
0より小さくても99より多くても、ゲームには関係ない数字だから@RETRYに帰ってやりなおすんだね。そうか、前にやった「例外処理」だね!
ウム。まあ1000と入力されてもゲームが止まるワケではないが、ルールでは0~99の数字でやりくりすることになっておるからこうしとるワケじゃな。
サンプルでは使ってないけど、「IF ~ AND ~ THEN」という使い方もあるんだよ。「AND」はもうわかるよね。つまり……
「もしも~で、さらに~ならば」ってトコロだな! コトバどおりだぜ、ワカりやすいじゃねェか!
どうやらバッチリのようじゃな。IF文のORとANDは使いこなせばなかなかベンリじゃぞい。
ジツはこの2つは「論理積」「論理和」と言って、もっとオクのフカい使い方もあるのじゃが……さすがにムズカシすぎるのでいまは考えんでよかろう。
残りの行はこれまでのおさらいでわかるね。
- IF NO==ANS GOTO @BINGO
- IF NO<ANS GOTO @SMALL
24行目の入力された変数NOと答の変数ANSが同じってコトは、正解したってコトだね。この先にあるラベル@BINGOに行くんだ。
25行目は入力された変数NOが答の変数ANSより小せえトキ……ま、そのマンマじゃねェの? ラベル@SMALLに行く、と。
どちらの条件も数当てゲームのキホンじゃな。
あれ? でも、答に当たった時と、答より小さい時……まだ「答より大きい時」のIF文がないよ!?
ほっほっほ。これも例外処理のトキにオボエたやり方じゃぞい。
答に当たった時はラベル@BINGOに行く。答より小さければラベル@SMALLに行く。……もし、変数NOが答より大きかったら、どっちのラベルにも行かないハズじゃな?
そのままプログラムの先に行くと……あっ!
さよう。その2つの条件をすり抜けたということは、変数NOは答より大きいに決まっておる。じゃから、IF文を使うまでもなく、そのまま27行の@BIGまで進んでいいのじゃよ。
27~30行までは、入力された数が答より大きかった時のプログラムだね。
- @BIG
- BEEP 4
- PRINT”Ж:HINT(おおきいです)”
- GOTO @RETRY
ムズカシイことは何もなさそうだね。音を鳴らして、文字を書いて、また入力のためにラベル@RETRYに戻る……。
うむうむ。さすがにここまで来ると、みんなよくワカってきたようじゃな。
32~35行目もほとんど同じだな!
- @SMALL
- BEEP 6
- PRINT”Ж:HINT(ちいさいよ)”
- GOTO @RETRY
入力された数が答より小さいトキはこうするってダケだぜ!
もう気がついてると思うけど、ラベルの名前に使ってる英語は「BIG(大きい)」「SMALL(小さい)」「RETRY(やり直し)」というふうに、ナカミをあらわしてるんだ。
ラベルの名前はわかりやすいのがイチバンじゃな。
ところで32~35行はラベル@SMALLに飛んできて、ひととおり動いたらまた@RETRYに帰るワケじゃが、こういう行って帰ってくる小さなプログラムのブロックを「サブルーチン」と呼ぶのじゃぞ。豆チシキじゃ。
チッ! ただでさえイロイロつめこんでるサイチュウなのに、いらねえチシキまでふやされちゃタマらねーぜ!
まあまあ。サブルーチンの考え方は、プログラムにはダイジなものさ。これからも出てくるセンモン用語だから、オボエておいてソンはないよ。
ルーチンは日本語で「きまりきった仕事」という意味になるけど、コンピューター用語では「ひと通りのきまった処理」ってところかな。
「処理」ってコトバがスデにセンモン用語っぽいが……ヨウするに「コンピューターにやらせるコト」は全部ショリか。
37行から終わりまでは、どこかに帰るワケじゃないけど、小さなブロックだからサブルーチンと言っていいのかな?
- @BINGO
- BEEP 34
- PRINT ”Ж:あたり!!!!”
- PRINT ”PUSH A BUTTON”
- WHILE (BUTTON()!=16)
- VSYNC 1
- WEND
- BGMSTOP:END
「BINGO(ビンゴ・当たり)」っていうラベル名どおり、当たった時のプログラムだよね。
ちなみに41~43行目に見慣れない命令があるけど、ここではAボタンを押すまでループして進まないようにしているんだ。でもここは、いきなりプログラムが終わらないようにアトからつけたした部分なので、今は説明をとばすよ。
まあ「行って帰る」のがサブルーチンとは言ったが、あまりムズカシく考えず、これもサブルーチンのひとつでいいじゃろうな。
@BIGも「行って帰る」の「行って」があるかというとビミョウじゃが、これもサブルーチンではあるしのう。
ザックリしすぎて、ワカるようなワカんねえようなハナシだぜェ……。
こういうのはフンイキでおぼえておけばOK! もう少しあとでサブルーチンがクローズアップされるから、その時まではザックリでいこうね。
さて、ここまででサンプルプログラムがどう書かれているかはゼンブ見おわったかのう。
RND命令で決めた答を、INPUT文で当てさせるのが中心でしたね。
当たったかどうかはIF~THEN文でしらべて……
デカいか、小せえか、当たったか、サブルーチンでケッカを出すってワケだ。
けっこうタンジュンじゃねえの?
ここまで来たショクンなら、そうじゃろう。思えばズイブン成長したものじゃわい。
このさいじゃから、ひとつテストを出してみようかの。
テ、テスト!?
このゲームは少ない回数で答にたどりつくほどエラいわけじゃが、「何回使ってクリアしたか」が表示されておらん。つまりはスコアじゃな。そこで、ゲームクリアしたら「何回使ってクリアしたか」表示するようにしてもらおうかの。
つ、つまりゲームとしておもしろくするためのクフウってヤツか。そういうコトならノゾむところだゼ!
(わりとタンジュンだなあ……)
1回答えるたびに数字がふえていく、つまり数字がヘンカしていく……ということは、何を使えばいいかもうわかるね。
オウ! 変数のデバンってワケだな!
とりあえず、変数名はSCORE(スコア)でいいかな。
ウッカリ「スコレ」と読みそうなことをのぞけば、わかりやすいぜ。
う、うん。とりあえず、スコアを書くところだけやっておこうか。
- PRINT ”Ж:あたり!!!!”
- PRINT SCORE;”かい で クリア”
- PRINT ”PUSH A BUTTON”
いまの40行をひとつ下にずらして、その上に書いておいたよ。
まだトチュウだが、このままクリアするとどうなるんだ?
- RUN
ワンパク君、なかなかサエておるな。カンセイするまで待たずに、ちょっとずつテストしてみるのもプログラムにはダイジじゃぞ。
- Ж:あたり!!!!
- 0かい で クリア
- PUSH A BUTTON
- OK
ウォオー! ハイスコアをたたき出しちまったぜ! スゲエ!
……どんだけテンネンなのじゃ。アキラカにそのケッカはおかしいぞい。
そういえば変数は、なにもしないままだとゼロになるんだったね。じゃあ、ダイジな「1回答えるたびに1増える」プログラムを足していこう。
プレイヤーが答えるというと、この行だね。
- INPUT”0―99までの すうじは”;NO
そうだね。このあとに変数SCOREを1ふやすことにしよう!
いまゼロの変数を1にふやす……ツマリSCORE=1……か?
……それだと、2にふやすことができないんじゃないかな。
この方法はサンプルプログラム3で出てきたね。SCORE=SCORE+1と書けば、1ずつふえていくハズだよ。
- @RETRY
- SCORE=SCORE+1
- PRINT””
お、オウ。オレとしたコトが、ウッカリしていたぜ。
とにかく、コレでスコアが出るようになったハズだゼ!
- RUN
フフフ。それはどうじゃろうな?
ナニをキショク悪いワラい方してやがる……。見やがれ、うまく動いてるゼ!
- Ж:あたり!!!!
- 7かい で クリア
- PUSH A BUTTON
- OK
ショクンもなかなかやるのう。よし、ではいよいよサイゴのモンダイじゃ。
いまは、クリアするとすぐにプログラムが終了するのじゃが、そのままもう一度プレイできるようにしてもらおうかのう。
まったく、しつけえジジイだぜ! そんなモンダイ、インテリにかかればあっというまにオワリだぜ!
けっきょくインテリ君にたよるんだね。
……じゃあ、はじめに画面を消す前のところにラベル@STARTをおいて、クリアしたあと、GOTO命令で戻るようにしてみようか。
- VISIBLE 1,1,1,1
- @START
- CLS:BGMPLAY 1
- WEND
- GOTO @START
- ’BGMSTOP:END
はじめとおわりにこの2行を追加してね。おわりのENDはどうせ通らないけど、ややこしいのでコメントにしておいたよ。
- RUN
ウォー! これでレンゾクでプレイできるぜ!
- Ж:あたり!!!!
- 7かい で クリア
- PUSH A BUTTON
Aボタンを押すと、プログラムが終わらずにもう一度あそべるようになったね。
うん。そこまではモンダイないんだけど……
……あっ! そうか!
なんのハナシだ? もう1回やっても……オ、オォ!?
- Ж:あたり!!!!
- 15かい で クリア
- PUSH A BUTTON
やっぱり。
な、なぜだ! いまオレはタシカに8回でクリアしたハズだぜ! サスガに15回もかけるほどねぼけちゃいねえ!
アリガチなシッパイじゃったな。変数はプログラムをRUNしたときにゼンブ消えるが、GOTO命令ではじめにもどるだけでは、前のままなのじゃよ。
……つまり、最初にクリアした7回からまた数えはじめて、1ずつプラスしちまってたのか……。 だが、ゲンインがワカればコワくねえゼ! ゲームを始めるたびにリセットすりゃいいんだろ?
- ANS=RND(100)
- SCORE=0
ゲームが始まるマエにこう書いとけば、カイケツだゼ!
ワンパク君……! イガイにもセイカイじゃぞ! これでテストはクリアーじゃ。
ヨッシャー!
プログラムをただしく動かすのも、なかなかタイヘンだったろう。
みんなも聞いたことがあると思うけど、こういったシッパイは「バグ」っていうんだ。バグのタイヘンさは、プログラムを書いてみないと、なかなかジッカンできないものだよね。
そんなの、オレのパンクスピリットにかかればどうってことねェぜ! ヘイカモーン!
このテストをといてくれたのはほとんどインテリ君じゃったけどな……。
- BGMPLAY (曲番号)
0~29の音楽を鳴らします。
- BGMSTOP
BGMPLAY命令で再生している音楽を止めます。
- IF (条件式) OR (条件式) THEN (命令)
条件式のどちらかが一致していれば命令を実行します。
- IF (条件式) AND (条件式) THEN (命令)
全部の条件式が一致したときだけ命令を実行します。
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.441 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:14 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30