サンプルプログラム3を見ていくのも後半になりました。
と言っても、前回までで難しいところはだいたいおさえたので、今回はわりとスルスルいくような気がします。
中にはかなりおおざっぱな説明も出てきますが、リクツ付けはそのうち、レベルが上がってきたころにやるので、それまでは「こーゆーもんなんだな」という感じでおぼえてください。
ないしょですが、プログラマーでもそうやっておぼえた事というのは、けっこうあります。
ちなみに私も前回ここで指摘されるまで、「フォールス」または「フォルス」と読む「False」を「ファルス」と間違って読みつづけていました。あんがいそういうものです。
さて、メインループの話からダイブずれてしまったようじゃな。そろそろLOAD”SYS/EX3KEYDRUM”でサンプルプログラムにモドるとするかの。
前回は、ドラムを鳴らすこのあたりで止まっていたんじゃったな。
- ’−−− ドラム
- B=BUTTON(1)
- IF B AND 1 THEN BEEP 52
- IF B AND 2 THEN BEEP 53
- IF B AND 4 THEN BEEP 62
- IF B AND 8 THEN BEEP 25
- IF B==64 GOTO @EXIT
ケッキョク、ここに出てくるIF文の使い方はワカんねえまんまだぜ!
いちばん多く使われてるのは、このタイプの文だね。
- IF B AND 1 THEN BEEP 52
今まで習ったことのフンイキから、「上ボタンを押したら52番の音色でBEEP」ということはわかるけど……
「IF B AND 1 THEN」ってナンだよコンチクショー! おかしいにもホドがあるじゃねえか!
これはリクツは気にせず丸ごとおぼえた方が早いかなあ。BUTTON(1)したバアイ、「IF B AND 1」と書くと、「Bの中に1がまじっている」というイミになるんだ。
「まじっている」?
とくに十字ボタンの入力なんかにベンリな使いかただね。たとえば押されたボタンが右上だったとしよう。すると変数に入る数字は1+8で9だよね。
十字ボタン↑ | 1 |
---|---|
十字ボタン↓ | 2 |
十字ボタン← | 4 |
十字ボタン→ | 8 |
そうなるとコマるのは、「IF B==1」じゃヒットしないことだね。
ところが「IF B AND 1」や「IF B AND 8」と書くと、ちゃんとヒットするんだ。フシギだね。
これをセツメイするには、まず「ビット演算」についてセツメイせねばならん。ならんのじゃが、あんまりムズカしいので人に教えづらいのじゃあああああ
初心者向きのサンプルプログラムなのに、ちょくちょくフクザツなコトをしようとするよな。セツメイできねェなら、サイショからやるなよ!
まあまあ。こういうベンリな使いかたがあるんだから、ふかく考えずに使えばいいのさ。
テメーのワリキリもなんだかスゲエな……。
まだ61行目が残ってるね。
- VSYNC 1
前の章でおぼえた命令だね。
ツマリ、BUTTON(1)命令をマトモに動かすために……エート……60分の1秒だけプログラムを止めてるんだったか。
もっとくわしく言うと、VSYNCで止まっている間でも、BEEPの音は鳴りつづけるのがポイントだね。
ということは、VSYNCの直前で鳴らしたBEEPの音が、60分の1秒間は何があっても鳴りつづける……?
言い方はスゴそうでも、イマイチたいしたことが起きてねえぞ?
実際にためしてみるのが早いかな。ためしに61行の先頭に「’」をつけてみよう。
- ’VSYNC 1
これでVSYNC命令は使われなくなったよね。RUNしてドラムを一度に鳴らしてごらん。
ウォオー! 鳴らしまくってやるゼェー!
みんなもワンパク君と一緒にためしてみてね!
ワンパク君のロックはデタラメに音をならせばとにかくロックだからなあ。……あれ? なんだか今までより音が大きいような……?
そうなんだよね。VSYNCがないと、BUTTON(1)が「何度もボタンを押してる」ようなことになるのはおぼえてるかな? つまり、人間に出せないようなスピードで何度もBEEPが鳴ってるってコトさ。
格闘ゲームっぽく言うと技を出した瞬間に、同じ技でキャンセルしてるってコトか。ナルホド……「ドカーン」の「ド」だけくり返し聞こえると、なんだか大きな音に感じるワケだな。
ワンパク君らしいけど、ナカナカわかりやすいたとえだね。じゃあ、さっきの「’」は消して、フツウに鳴るようにしておこう。
先頭に「’」をつけてとりあえずテストしてみる、というのはタンジュンじゃが、ダイジなテクニックじゃな。
プログラム用語では「コメントアウト」と言うのじゃが、このキカイにおぼえておくといいぞい。
ひとまず、この65行に注目してもらおうかの。
- K$=INKEY$()
カタチはなんとなくBUTTON()命令と似ているね。
そう! INKEY$()命令は、BUTTON()命令のキーボードバージョンだと考えていいだろうね。「IN KEY」つまりキー入力というコトだね。
ツマリ、65行だと変数K$に押したキーの……ナニが入るんだ?
あ、それはBUTTON()命令よりカンタンだね。押した文字がそのまま変数に入るんだ。キーボードの「A」を押していたら、K$にはAという文字が入るよ。
チッ、フカヨミしすぎたか! しかし、おかげで66行目のやってるコトはよくワカッたぜ。
- IF K$==”” GOTO @LOOP
変数K$がカラ……つまりキーが押されてなければ、おなじみの@LOOPに飛んでくり返しってことだな!
このあたりまではBUTTON()命令と本当によく似ているね。
さて、次のこの部分じゃが、これまでBASICをベンキョウしてきたショクンには、ギモンに感じるプログラムではないじゃろうか?
- I=0
- @KLOOP
- IF K$==N$[I] GOTO @PLAY
- I=I+1
- IF I<KCNT GOTO @KLOOP
- GOTO @LOOP
……たしかに、フクザツで、マワリクドそうで、モヤモヤする気がするぜ。
変数Iに0を入れて、Iを1ずつ足しながらGOTO命令でループしている……?
これってもしかして、前にならったFOR~NEXT命令を使えば、もっとスッキリできそうかな?
おお、その通りじゃ。では、FOR~NEXTでカンタンに書き直したプログラムの方を見てもらおうかの。
- FOR I=0 TO KCNT−1
- IF K$==N$[I] GOTO @PLAY
- NEXT
これを読めば、ナニをしとる行かはワカるはずじゃの?
……たしか配列変数N$[]には[0]~[19]まで、ケンバンに使う字が入ってたハズだな。
変数KCNT−1はケンバンの数をコンピューター風に数えて、17のはずだよね。
変数K$に入ってるのは押されたキー。つまり……18回ブンN$[]を変えながらくり返しチェックして、どこかで押されたキーがケンバンのキーと同じだったら@PLAYに飛ぶ、ってコトだな!
おお……ワンパク君、すっかりリッパになったのう……。
そりゃいいんだけどよォ、ジッサイのサンプルはこうじゃねェよな。またしくじったのか?
うーん、ヒトコトで言えば、FOR~NEXTを使わないといろいろメンドウクサイぞい、というミホンじゃろうかの。
……ホントウのことを言うと、前のプチコンのサンプルを修正しわすれただけなんだ。
プチコン3号では賢くなったから大丈夫なんだけど、古いプチコンではFOR~NEXTのトチュウでぬけると、パンクしてエラーになっていたんだよ。それをさけていたナゴリだね。
(インテリ君……! それだけはナイショにしてほしかった……!)
イミなかったのかよ! ケッキョクしくじってたんじゃねェか!
……まぁ、プチコン3号が賢いというだけで、プチコン以外のBASICでも、FOR~NEXTのトチュウで抜けてしまうとイロイロとマズいことがあったんじゃよ。じゃから、これは昔からよく使われていたホウホウのひとつじゃな。
えっと、70行目の「I=I+1」というのが初めて見るけど……変数のルールにそって考えると、なんとなく分かるな。バケツIに、それまでのIの中身プラス1を入れるってことでしょ?
そういうこと。こういうふうに変数の中では、同じ変数を使った計算もできるんだけど、なれないとピンとこないかもね。
もしも変数Iのナカミが2だったときにI=I+1すると、I=2+1というわけで、3が変数Iのナカミになるね。
FOR~NEXT文も、変数に1ずつプラスしてくワケだしな。
この部分だけでも、FOR~NEXTを使わないとメンドウなことはよく分かったじゃろう。
サンプルプログラムじゃし、ときにはハンメンキョウシにもなるんじゃよ。
(うーん、うまくまとめたようで、ゴマカシきれてないな……)
81行目からは、ラベル@EXITだね。
- @EXIT
- SYSBEEP=TRUE
- END
@EXIT……。そんなラベル、どっかで見たような……見てねェような……
ははは。BUTTON(1)命令を使ったところで、ボタン判定をしていたじゃないか。
- IF B==64 GOTO @EXIT
オゥ、これだ! そういやあの時はドラムのコトばっかり考えてて、このGOTOのコトはすっかり忘れてたぜ! オレとしたことが!
BUTTON(1)命令で64が入ったということは、たしかXボタンを押したってことだったよね。
さよう。このプログラムでは、Xボタンでプログラム終了じゃったな。と言えばあとはワカるじゃろう
さすがにラクショーだぜ! 82行でSYSBEEP=TRUEして音を元にモドして、83行でENDだな!
ポイントは、Xボタンを押すことで、52~72行目の間をグルグル回っていたメインループからぬけ出しているコトだね。
そういうコト! ハッキリ言えば83行目のENDはなくてもいいんだけど、ループから飛びだしてプログラムを終わらせるにはピッタリだね。
それはモチロンじゃし、この後にラベルを増やして新しいキノウを増やすときにはますますENDがダイジになるじゃろうな。
- @EXIT
- SYSBEEP=TRUE
- END
- @USO
- SYSBEEP=FALSE
たとえばこういうプログラムじゃと、83行目にENDがなければ84行から先まで勝手に進んでしまうわい。
フーム……。ラベルでループを使ったプログラムじゃ、VSYNCでブレーキしつつ、そこでENDするのがダイジになるワケだな……。
ワ、ワンパク君! どうしたんじゃそのリッパなまとめぶりは……!
さすがに長びいたからよォ、このヘンでENDっぽく終わらせるのがイイ気がしたんだゼ。ノーフューチャー!
いつも通りだったね。
行の先頭に「’」と書くだけで(あたりまえですが)その行がなかったことになります。プログラムの動作テストのときなどに便利です。
- (文字変数)=INKEY$()
変数に押されたキーが入ります。
むずかしいので、使い方だけおぼえましょう。BUTTON()命令で使う変数なら、この形が使えます。
- IF (変数) AND (数) THEN (命令)
変数がボタンに対応した数を含んでいるときだけ、命令を実行します。
BUTTON()命令以外でもこれが使えると思ったら大まちがいです。
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.321 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:08 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30