プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第10章 サンプルプログラム4

パンくずリスト

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

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

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

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

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

ハカセ

サンプルプログラム4はムカシからつたわるゲーム、数当てゲームじゃ。ためしに遊んでみるとよかろう。

  1. LOAD”SYS/EX4NUMGAME”
  2. RUN
screenshot_kazuate.jpg
  1. Ж:ニコチャンが かんがえた、
  2. 0―99までの すうじを あててください
  3.  
  4. 0―99までの すうじは?
ワンパクくん

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

ハカセ

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

ワンパクくん

なんだかゴマかされた気もするが……とにかく数字を打つゼ! 66なんてどうだ?

  1. Ж:HINT(ちいさいよ)
ワンパクくん

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

神崎

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

インテリくん

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

ワンパクくん

メンドくせーコトはヌキでいくぜ! ザックリ80でどうだ!

  1. Ж:HINT(おおきいです)
神崎

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

インテリくん

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

ワンパクくん

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

ハカセ

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

  1. Ж:あたり!!!!
ワンパクくん

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

インテリくん

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

ハカセ(泣)

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

BGMPLAY命令、BGMSTOP命令

インテリくん

それじゃあプログラムを見てみようか。はじめに表示されるメッセージまでは、もうプログラムをお手本にしないでも自分で書けるくらいだよね。

  1. ’┌──────────┐
  2. ’│ EXAMPLE4 │
  3. ’│ かずあてゲーム  │
  4. ’└──────────┘
  5. XSCREEN 0
  6. VISIBLE 1,1,1,1
  7. CLS
  8. COLOR 15
  9. PRINT”┌───────┐”
  10. PRINT”│かずあてゲーム│”
  11. PRINT”└───────┘”
  12. PRINT”Ж:ニコチャンが かんがえた”
  13. PRINT”0―99までの すうじを あててください”
ワンパクくん

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

ハカセ

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

ワンパクくん

ハナシがなげェぜ! つまりコレもプログラムのジュンビってコトだな?
すっかりオナジミすぎて、シンセンミがたりねェな!

インテリくん

じゃあ、せっかくだから新しいことをしようか。ためしに、こう書きかえてみよう。

  1. CLS:BGMPLAY 1
ワンパクくん

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

インテリくん

そんなにムズカシくはないよ。そのままRUNしてごらん。

神崎

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

インテリくん

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

ワンパクくん

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

神崎

わからないんだ。

インテリくん

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

ワンパクくん

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

インテリくん

そういうコト! プチコンにはBGMPLAY 0BGMPLAY 42までの43曲が入っているよ。
どんな曲があるかは、画面の下にある key_smile.png SMILE(スマイル)ボタンを押してスマイルツールを起動して、画面下のほうのBGMと書かれたボタンを押してみてね。

神崎

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

ワンパクくん

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

神崎

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

インテリくん

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

ハカセ

せっかくじゃから、今回はプログラムをちょっと書きかえて、ゲーム中にBGMをかけるようにしてみようかの。

  1. CLS:BGMPLAY 1
  1. BGMSTOP:END

ゲームのおわりと同時にBGMも止まるようにしておいたぞい。

インテリくん

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

条件式のANDとOR

ワンパクくん

セイカイの数字を決めるのは17行目だな。

  1. ANS=RND(100)
ワンパクくん

変数ANSに0〜99までのどれかを入れる。ナニもムズカシいことはねェぜ!

インテリくん

そのあとはいよいよプログラムの中心部だね。

  1. @RETRY
  2. PRINT””
  3. INPUT”Ж:0―99までの すうじは”;NO
  4. IF NO<0 OR NO>99 GOTO @RETRY
  5. IF NO==ANS GOTO @BINGO
  6. 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のナカミがより小さければ」「もしも変数NOのナカミが99より大きければ」どっちでもラベル@RETRYに行くってコトだろ?

神崎

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

インテリくん

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

ワンパクくん

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

インテリくん

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

ワンパクくん

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

神崎

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

ハカセ

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

インテリくん

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

ワンパクくん

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

ハカセ

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

インテリくん

残りの行はこれまでのおさらいでわかるね。

  1. IF NO==ANS GOTO @BINGO
  2. IF NO<ANS GOTO @SMALL
神崎

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

ワンパクくん

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

ハカセ

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

神崎

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

ハカセ

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

神崎

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

ハカセ

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

3つのサブルーチン

神崎

27〜30行までは、入力された数が答より大きかった時のプログラムだね。

  1. @BIG
  2. BEEP 4
  3. PRINT”Ж:HINT(おおきいです)”
  4. GOTO @RETRY
神崎

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

ハカセ

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

ワンパクくん

32〜35行目もほとんど同じだな!

  1. @SMALL
  2. BEEP 6
  3. PRINT”Ж:HINT(ちいさいよ)”
  4. GOTO @RETRY

入力された数が答より小さいトキはこうするってダケだぜ!

インテリくん

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

ハカセ

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

ワンパクくん

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

インテリくん

まあまあ。サブルーチンの考え方は、プログラムにはダイジなものさ。これからも出てくるセンモン用語だから、オボエておいてソンはないよ。
ルーチンは日本語で「きまりきった仕事」という意味になるけど、コンピューター用語では「ひと通りのきまった処理」ってところかな。

ワンパクくん

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

インテリくん

37行から終わりまでは、どこかに帰るワケじゃないけど、小さなブロックだからサブルーチンと言っていいのかな?

  1. @BINGO
  2. BEEP 34
  3. PRINT ”Ж:あたり!!!!”
  4. PRINT ”PUSH A BUTTON”
  5. WHILE (BUTTON()!=16)
  6.  VSYNC 1
  7. WEND
  8. BGMSTOP:END

「BINGO(ビンゴ・当たり)」っていうラベル名どおり、当たった時のプログラムだよね。
ちなみに41〜43行目に見慣れない命令があるけど、ここではAボタンを押すまでループして進まないようにしているんだ。でもここは、いきなりプログラムが終わらないようにアトからつけたした部分なので、今は説明をとばすよ。

ハカセ

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

ワンパクくん

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

インテリくん

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

もうひとくふう

ハカセ

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

インテリくん

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

神崎

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

ワンパクくん

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

ハカセ

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

ワンパクくん

テ、テスト!?

ハカセ

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

ワンパクくん

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

神崎

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

インテリくん

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

ワンパクくん

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

神崎

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

ワンパクくん

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

インテリくん

う、うん。とりあえず、スコアを書くところだけやっておこうか。

  1. PRINT ”Ж:あたり!!!!”
  2. PRINT SCORE;”かい で クリア”
  3. PRINT ”PUSH A BUTTON”

いまの40行をひとつ下にずらして、その上に書いておいたよ。

ワンパクくん

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

  1. RUN
ハカセ

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

  1. Ж:あたり!!!!
  2. 0かい で クリア
  3. PUSH A BUTTON
  4. OK
ワンパクくん

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

ハカセ

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

インテリくん

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

神崎

プレイヤーが答えるというと、この行だね。

  1. INPUT”0―99までの すうじは”;NO
インテリくん

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

ワンパクくん

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

神崎

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

インテリくん

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

  1. @RETRY
  2. SCORE=SCORE+1
  3. PRINT””
ワンパクくん

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

  1. RUN
ハカセ

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

ワンパクくん

ナニをキショク悪いワラい方してやがる……。見やがれ、うまく動いてるゼ!

  1. Ж:あたり!!!!
  2. 7かい で クリア
  3. PUSH A BUTTON
  4. OK
ハカセ

ショクンもなかなかやるのう。よし、ではいよいよサイゴのモンダイじゃ。
いまは、クリアするとすぐにプログラムが終了するのじゃが、そのままもう一度プレイできるようにしてもらおうかのう。

ワンパクくん

まったく、しつけえジジイだぜ! そんなモンダイ、インテリにかかればあっというまにオワリだぜ!

神崎

けっきょくインテリ君にたよるんだね。

インテリくん

……じゃあ、はじめに画面を消す前のところにラベル@STARTをおいて、クリアしたあと、GOTO命令で戻るようにしてみようか。

  1. VISIBLE 1,1,1,1
  2. @START
  3. CLS:BGMPLAY 1
  1. WEND
  2. GOTO @START
  3. ’BGMSTOP:END

はじめとおわりにこの2行を追加してね。おわりのENDはどうせ通らないけど、ややこしいのでコメントにしておいたよ。

  1. RUN
ワンパクくん

ウォー! これでレンゾクでプレイできるぜ!

  1. Ж:あたり!!!!
  2. 7かい で クリア
  3. PUSH A BUTTON
神崎

Aボタンを押すと、プログラムが終わらずにもう一度あそべるようになったね。

インテリくん

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

神崎

……あっ! そうか!

ワンパクくん

なんのハナシだ? もう1回やっても……オ、オォ!?

  1. Ж:あたり!!!!
  2. 15かい で クリア
  3. PUSH A BUTTON
神崎

やっぱり。

ワンパクくん

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

ハカセ

アリガチなシッパイじゃったな。変数はプログラムをRUNしたときにゼンブ消えるが、GOTO命令ではじめにもどるだけでは、前のままなのじゃよ。

ワンパクくん

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

  1. ANS=RND(100)
  2. SCORE=0

ゲームが始まるマエにこう書いとけば、カイケツだゼ!

ハカセ

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

ワンパクくん

ヨッシャー!

インテリくん

プログラムをただしく動かすのも、なかなかタイヘンだったろう。
みんなも聞いたことがあると思うけど、こういったシッパイは「バグ」っていうんだ。バグのタイヘンさは、プログラムを書いてみないと、なかなかジッカンできないものだよね。

ワンパクくん

そんなの、オレのパンクスピリットにかかればどうってことねェぜ! ヘイカモーン!

ハカセ(泣)

このテストをといてくれたのはほとんどインテリ君じゃったけどな……。

今回のまとめ

BGMPLAY命令、BGMSTOP命令

  1. BGMPLAY (曲番号)

0〜29の音楽を鳴らします。

  1. BGMSTOP

BGMPLAY命令で再生している音楽を止めます。

条件式のANDとOR

  1. IF (条件式) OR (条件式) THEN (命令)

条件式のどちらかが一致していれば命令を実行します。

  1. IF (条件式) AND (条件式) THEN (命令)

全部の条件式が一致したときだけ命令を実行します。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 5 人がこのサイトを見ています
  • このページはこれまでに 2234 回、本日は 2 回、昨日は 2 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.095 秒 | このページの最終更新 : 2019/08/17 (土) 16:06:50 (225d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30