配列変数のことはもう大丈夫ですか?
もはやこの章ではあたりまえのように配列がFOR文といっしょに使われています。
一歩ひきかえすのもいいかもしれません。何度も読んだり、自分で打ってみて、ついでにちょっと書き換えたりしてみて、自分のものになることもあるものです。
心配のしすぎだったでしょうか。
前回はかなりプログラムっぽいことをやったので、今回はちょっと方向をかえてリアルタイムのキー入力や、十字ボタンの操作なんてやってみます。
「リアルタイム」というのは、まあいろいろ意味はあるんですが、いまは「押したらすぐ動く」みたいなものと思っていいんじゃないでしょうか。
けっこうゲームっぽいですね。
そういう意味ではけっこう大事なことをまなぶサンプルかもしれません。
けっこう長くなっているので、今回と次回の2つにわけて見ていきましょう。
あと、BEEP命令で音を出すヒントもちょっとついてますよ。
サンプルプログラム3は、まあちょっとした楽器プログラムじゃな。
- LOAD”SYS/EX3KEYDRUM”
- RUN
これを読んでいるPCなどの前のみんなも、サンプルをRUNしてためしてみよう! 前も言ったけど。
今回はプログラムリストを3DSで見ながら読むとわかりやすいよ!
ピアノ風のキーボードが1オクターブと、ドラムが4音使えるんだね。
実はもっとエキスパート向きのMMLという音楽機能もプチコン3号にはあるのじゃが……まあ、最初のウチはあっさり目におぼえるのがよかろう。
ツーバスやハイハットを考えてねェあたり好感がもてるぜ。だがピアノなんざ資産階級のオモチャじゃねえか! いただけねえな!
ワンパク君はいささか音楽的にかたよったエイキョウばかり受けている気がするんじゃが、まあピアノがイヤならプログラムを改造するというコトもできるぞい。
プログラムをサイショから見ていこうか。まず気になるのはどこかな?
1~21行まではだいたいおなじみの画面表示だね。8行目が引っかかるなあ。
- SYSBEEP=FALSE ’システムSEをオフ
「=」を使ってるってことは、変数?
いいところに気がついたね。このSYSBEEPは「システム変数」という、変数の一種なんだ。システム変数はプチコンの動作にかかわるデータが入るようになっているよ。
ウンザリだぜ! 配列変数をやっとオボえたってのに、また変数のバリエーションかよ!
今はこんがらがりそうだから変数のことは考えずに、命令として丸暗記しておいた方が早いかもしれないね。
「SYSBEEP=FALSE」と書くと、プチコンのシステム音が鳴らなくなるんだよ。
オボエるのがそれだけなら、まあカンタンかな。このプログラムでキーボードを打っても、いつもの「コッ」ていう音が出なかったのはSYSBEEPを使ったからなんだね。
そういやBEEPはサウンドを鳴らす命令だったな。SYSBEEPの「SYS」ってのはシステムの「シス」ってコトか?
「FALSE」は「まちがった」って意味だと思ったけど……
プログラムの世界ではちょっと意味が変わって「偽」などと言うのじゃが、どう見てもイッパンテキではないのう。おおざっぱなオボエかたじゃが、アリ・ナシの「ナシ」がFALSE、とオボエると今後なにかとワカりやすいぞい。
システムのBEEPが「ナシ」、つまりシステム音を鳴らさない、ってコトか……ワカりやすいが、じゃあ鳴らすようにモドすにはどうすりゃイイんだ?
イッキにプログラムのサイゴになるが、82行で使っておるな。
- SYSBEEP=TRUE
「TRUE」は「真」と言うが、これも「アリ」とオボエておけばよかろう。
ワカモノコトバをムリに使ってるカンジもするが、ワカりやすいことはタシカだな!
それ、ワシに言っとるのかの……?
24~43行は、配列とFOR~NEXT、READ・DATAを使ったおなじみのプログラムだね。
配列変数N$[]にキーボードを左から順に入れてるのはだいたいワカったゼ。たぶん、そのウチこの変数を使うんだろ。
39行で使っている変数KCNTは何なんだろう?
- KCNT=18
- FOR I=0 TO KCNT−1
ケンバンの数、すなわち18コと考えてもらえばいいかの。「Kenban」の「CouNT」じゃからKCNTじゃ。変数の名前を決めるのはけっこうナヤむところじゃわい。
おっと待った、こういうコトにはオレはうるさいゼ! わざわざ変数にしなくても、FOR I=0 TO 17でいいんじゃねェか!?
う、ウム。このアトにも1回しか使っておらんし、そうとも言えるのう。じゃが、コレはケンバンの数をふやす改造をするトキにベンリなように作っておるのじゃよ。
まァそのヘンはいいとしてもよォ、42行で1文字スペースがあいてんのはナンかイミあんのか?
- FOR I=0 TO KCNT−1
- READ N$[I]
- NEXT
これはプログラム用語で「インデント」というヤツじゃな。カンタンに言えば、FORやGOTOで「くり返しているナカミ」のブブンだけ、1文字スペースを空けておるのじゃ。
これはまだ1行じゃからあまりイミはないが、ナカミが何行もあったりFORの中にFORがあったりするトキには、なかなか見やすくなっててイイものじゃぞい。
「’」のコメントもそうだけど、プログラムがどう動いているのか、リストを他人が見てもすぐわかるように書くのはダイジだよね。
たとえば次の46~47行みたいに、変数のイミをコメントで書いておいたりとかね。ハンオンブンとだけ書かれても、結局イミがイマイチよくわからなかったりするけど。
- F=100 ’ハンオンブン
- V=22 ’おんしょく
インテリ君は上げてから落とすのがウマいのう……。
- F=100 ’ハンオンブン
- V=22 ’おんしょく
この変数のイミを教えるには、まずBEEP命令についてもっとクワしく説明がヒツヨウじゃな。
BEEP 22でピアノの音を鳴らす、ココまでは知っておるハズじゃな?
このプログラムでも使っている音色ですね。
その先はボクが説明しようか。BEEP命令にはもっとフクザツな使い方があって、ピッチを決めることもできるんだ。
ビ……?
「PITCH」は「音高」とも言うんだけど、カンタンに言えば音の高さのことだね。
音の……タカ……?
ワンパク君は音楽にはくわしいと思っていただけに、さすがにその反応にはオドロキを隠せないよ。
たとえばドレミの「ミ」の音は「ド」より「高い」という言い方をするよね。ドからレ、レからミ、ファソラシド……と先に行くほどピッチが高くなる、と思えばだいたいマチガイじゃないよ。
音楽リロンを気にしてるようじゃパンクじゃねーゼ! もっとストレートにセツメイしやがれ!
たとえばBEEP 22,0はピアノのドの音が鳴って、BEEP 22,200でレの音になると言えば実感できるかな?
「,」の後の数字がピッチになっているんだね。
それイジョウ難しいコトをさえずるようなら、オレのベースが火をふくゼ!
ワンパク君にとってのベースギターは人をナグる武器だからなあ。
うーん、じゃあこう説明しよう。ドレミをセイカクに言うと「ド・ド#・レ・レ#・ミ・ファ・ファ#・ソ・ソ#・ラ・ラ#・シ」だね。最初の「ド」がピッチ0だと考えて、ひとつ右に行くごとにピッチの数字が100ずつ増えるとおぼえるといいんじゃないかな。
フーム……まったくリクツがワカった気はしねえが、そういうモンだとわりきってオボエればいいってコトだな!
(ワンパク君のロックと、ボクらが知ってるロックは少しちがうのかもしれない……)
ハナシはワカったようじゃな。そこで46行目にモドるが、F=100というのはまさにピッチを増やすキジュンの数、V=22はピアノの音色の番号というワケじゃ。あとあとBEEP命令でこの変数を使っておるからオボエておいてくれい。
つまり変数Vの数を変えればピアノ以外の音も出せるってワケだな。V=20なんかロックでいいんじゃねェか?
ここを読んでるみんなも数字を変えてRUNしてみよう!
プログラムリストは50行からメインループに入るね。
その「メインループ」ってのはナンだ? メインなのはなんとなくオレにもワカるけどよォ、ループするってコトは無限ループになったりすんのか?
そうマチガっとるワケでもないぞい。じゃが、やってはならない無限ループとちがって、これはヒツヨウなループなのじゃ。
ちょっと実感がわかないけど、先を読むとわかってくるのかな。
まずドラムが、54~60行目か。
- ’−−− ドラム
- 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
ワカらねえコトだらけで、ドコから手をつければいいのかもワカらねえぜ!
そういうことなら、まず55行目のB=BUTTON(1)がポイントだね。こう書くと、3DSの何ボタンが押されたか、変数Bに入るようになっているんだ。
ボタンっていうと、3DSのAボタンみたいな?
3DSのボタンはだいたい全部だね。この表を見てごらん。
十字ボタン↑ | 1 | Aボタン | 16 | Lボタン | 256 |
---|---|---|---|---|---|
十字ボタン↓ | 2 | Bボタン | 32 | Rボタン | 512 |
十字ボタン← | 4 | Xボタン | 64 | ||
十字ボタン→ | 8 | Yボタン | 128 |
たとえば十字ボタンの上を押したときは、変数Bには1が入る。右ボタンなら4だね。
ナンだってこんなハンパな数なんだ? 2の次は3でいいじゃねェか! ジュンバンに数字をふれば1~12ですむハナシだろ?
じゃあ十字ボタンの左上を押したときを考えてごらん。左は4、上は1だね。だから4+1で、変数には5が入ることになるんだ。
同時押しされた時を考えて、わざと数字に間をあけてるってコト?
フツウはまずないことだけど、上と下が同時に押されれば1+2で3、さらに左も押せば3+4で7だね。こういうふうにどんな組み合わせで何個ボタンを押しても、同じ数字が出てこないようにできてるんだよ。もともとはビット演算という考えかたが……
おっと、ヤヤコシそうなハナシはゴメンだぜ! とにかくシクミはワカッたぜ。タブンその後のIF文で変数Bにあわせた音を鳴らしたりしてんだろ?
たしかにほぼそのトオリじゃ。ワンパク君のいろいろすっとばしたリカイリョクには、野生のたくましさを感じるのう。
ワシじゃよ、プチコンで会いに行けるアイドルとよばれとるハカセじゃ。
押されているボタンをとる方法はわかっても、どのボタンがどの数字に対応しているかは、ワシだってなかなか覚えられないもんじゃ。
ボタンの入力をIFで比較するとき、ジツは数字のかわりに以下の文字が使えるんじゃ。これは定数リテラルと呼ばれておるが、名前は覚えなくてもいいぞい。
十字ボタン↑ | #UP | Aボタン | #A | Lボタン | #L |
---|---|---|---|---|---|
十字ボタン↓ | #DOWN | Bボタン | #B | Rボタン | #R |
十字ボタン← | #LEFT | Xボタン | #X | ||
十字ボタン→ | #RIGHT | Yボタン | #Y |
たとえば、「十字ボタン→」の入力を知りたい場合、
- IF A AND 8 THEN ...
と書くかわりに……
- IF A AND #RIGHT THEN ...
と書くことができるぞい。覚えやすいし、読む人にもやさしいのじゃ。
- PRINT #RIGHT
- 8
- OK
この正体は、数字が入ったただのハコじゃ。こうみると変数みたいじゃが、変数とちがって中身はエイエンに変わらないんじゃ。じゃから定数とよぶのじゃな。プチコン3号には、ボタン用だけでなく、COLOR命令用など、さまざまな種類の定数リテラルが用意されているぞい。
このままプログラムリストの先に進んでもいいけど、その前にさっきもちらっと出てきた「ループ」の考え方を知っておくほうがよさそうだね。
ナンだかフクザツなハナシのヨカンを感じるぜ。
いやいや、フクザツにならないための予習さ。ちょっとDIRECTモード でNEWと打ってごらん。
- NEW
- OK
これがナンだってんだ?
あ、EDITモード にすると……
プ、プログラムリストがゼンブ消えてるじゃねェか!
プログラムリストを消すのがNEW命令なのか……マチガって使ったらコワいね。
サンプルプログラムはまたLOADしなおせばいいけど、自分のプログラムは消す前にSAVEを忘れずにね!
じゃあループの話にもどって、このプログラムを打ってみよう。プログラムのイミは分かるかな?
- INPUT”にゅうりょく”;A
- PRINT”こたえは”;A
またずいぶんシンプルな……。
オレをバカにしてんのか? ヨウするにINPUTで変数Aを入れさせて、それをPRINTしてるだけじゃねェか!
- RUN
- にゅうりょく?1
- こたえは1
- OK
その通り。じゃあ、BUTTON(1)命令を使って同じことをするにはどうすればいいかな?
1行ふえちまうが、こういうコトだな?
- PRINT”にゅうりょく”
- A=BUTTON(1)
- PRINT”こたえは”;A
- RUN
- にゅうりょく
- こたえは0
- OK
あれ? なにもしないうちにプログラムが終わっちゃったよ。
どういうコトだチクショー! ボタンを押してねェんだからそりゃ「こたえは0」だろうぜ!
そこだよ! INPUT命令とちがって、BUTTON(1)命令では「ボタンを押してない」ことも入力のウチなんだ。だからRUNしたとたんに終わっちゃうんだね。
じゃあどうすりゃボタンを押すまで待ってもらえるってんだ、ナットクできねえぞ!
何回でもBUTTON(1)命令をやり直すってことだよね。こうすればいいのかな?
- PRINT”にゅうりょく”
- @LOOP
- A=BUTTON(1)
- PRINT”こたえは”;A
- GOTO @LOOP
……あ、これじゃダメだ……。
やっぱり。PRINT文もループの中に入ってるからどんどん書き続けちゃう……
でもなかなか悪くないよ。ボタン入力の結果をPRINTするのはデキてるからね。
タシカに、ボタンを押したシュンカンだけは「こたえは」の後にちゃんと数字が入ってる……ような気がする……チクショウ、見づれえんだよ!
ボタンを押すと同時にSTARTボタンで止めてやる!
……ン?
なんだかヘンだね。ボタンは押しっぱなしなのに、これだと何度もボタンを押してるような……?
そこに気が付いたか。そう、このBUTTON(1)命令の使い方なら、本当はボタンを押したその時だけ変数に数字が入る命令だったよね。
うまく動いてねえじゃねェか!
そこで、ちゃんとBUTTON(1)命令が動くように、もう1つ命令を入れるよ。
- VSYNC 1
VSYNC……?
読みカタすらもワカらねェぜ!
タシカに読みづらいが、これは「ブイ・シンク」と読むのがイッパンテキじゃな。
もともとは「ヴァーティカル・シンクロナイゼーション (Vertical-Synchronization)」のことで……
よしワカッた、そのセツメイはいらねェ!
まあそんなトコじゃろうな……。
ザックリ言えば、プログラムを一時停止する命令じゃ。VSYNC 1なら60分の1秒だけ止まり、VSYNC 60ならピッタリ1秒止まるコトになっとるぞい。
つまり、この行でも60分の1秒だけプログラムを止めてるってこと……?
プログラムが止まると、BUTTON(1)命令がうまく動くってのが、よくワカんねェな……。
プチコンはすごいスピードでプログラムを動かしているよね。特にこんな短いループなんかは、こうしてちょっとブレーキをかけておかないと、BUTTON(1)命令がウラでやってる仕事が終わる前に、何回もBUTTON(1)命令がはじまっちゃってついていけない……ような、そんなカンジかな。
フーム……そのセツメイはわからないでもねェが、そのワリにスッキリと言いきらねえじゃねェか。
すごくおおざっぱに説明したから、プログラムにくわしい人にはツッコミどころなんだよね。まあ深く考えずに、BUTTON(1)命令のループにはVSYNCをセットで入れるようにしておくとうまく動くよ!
そう言われるとわかりやすいけど、話はすっとばしたなあ。
この命令はアクションゲームなんかによく使われておる。今はまだこのテイドしか使うところがないが、そのウチずいぶん助かる命令になるじゃろう。
そんなものかなあ……あれ? BUTTON(1)命令がうまく動くと、うまく動いてるかどうかがよく見えなくなるね……。
一瞬で通りすぎちゃうから、見づらいどころじゃないかな? BUTTON(1)命令の「1」を「0」に変えてみよう。
- PRINT”にゅうりょく”
- @LOOP
- A=BUTTON(0)
- PRINT”こたえは”;A
- VSYNC 1
- GOTO @LOOP
命令のあとの数字で動きが変わるの?
その通り。BUTTON(1)だと、ボタンを押したシュンカンだけ変数に数字が入ったよね。BUTTON(0)命令で、はとにかくボタンが押してあれば、いつでも変数に数字が入るんだ。プログラムをRUNして見てみよう!
ナルホド。ボタンを押してる間はずっと変数Aのナカミに数字が入るってワケか。
ここまででわかったけど、このタイプの命令は何回もくり返さないと思ったように動かないね。そのためにはGOTOでループを作らないといけないんだ。
さよう。こういうリアルタイムで入力を待つプログラムは、入力を待っているとアッというまに終わってしまうので、ループを作って入力を待ち続けるのがキホンじゃな。
ハハーン、それが「メインループ」になるってワケか!
ジッサイにはこれ以外にもすぐ通りすぎちゃう命令や、くり返さないとイミがないコトもプログラムにはたくさんあって、そういうのをまとめてひとつのループにするのが「メインループ」になるね。
まあ、プログラムをおぼえていくうちに自然に身につくハズさ。
今つくったプログラムは無限ループだったけど、本当にやりたかったように作るとどうなるの?
まだ見おぼえのない書き方もまじるけど、これでいいんじゃないかな。
- PRINT”にゅうりょく”
- @LOOP
- A=BUTTON(0)
- IF A!=0 THEN PRINT”こたえは”;A:END
- GOTO @LOOP
みんなも打ってみてね!
ウゥ……マジで見たことねェ書き方しやがって、ヨウシャのねえヤロウだぜ!
この行がモンダイなんだね。
- IF A!=0 THEN PRINT”こたえは”;A:END
今までの話から、これが「もしも変数Aがゼロじゃなければ~する」ってIF文だとはなんとなく分かるんだけど……
気になるのは「変数!=数字」のカタチだよね。
「==」もビックリだったけど、「!=」だって初めて見るよ!
ほっほっほ。ソコはそうムズカシいモノでもないぞ。いわゆる「≠(等号否定)」と同じイミで、まあ右と左が「ちがう」というくらいのことじゃな。
まさか、またムカシのコンピューターに「≠」の字がなかったから「!=」と書いたとか、そんなことじゃねェだろうな……。
それでだいたい合っておるそうじゃ。
コ、コンピューターにタイするゲンソウがどんどんウシナわれていくぜェ……。
ほかにも「< (小なり)」「> (大なり)」を使うこともあるが、「≦ (小なりイコール)」は「<=」、「≧ (大なりイコール)」は「>=」と書くのじゃ。
そんなのばっかりか! なんかもう、コンカイはオレもいろいろダキョウしてる気がするぜェ……。
そろそろ元気がなくなってきたかな。色々おぼえたし、いったん一休みしよう!
行の先頭に空白スペースを入れることを「インデント」といいます。プログラムの動作には関係ありませんが、リストを見やすくするのに使います。FOR~NEXTの中に使うのがいちばん一般的ですね。
- NEW
DIRECTモードで使います。プログラムが消去されます。
- SYSBEEP=FALSE
- SYSBEEP=TRUE
FALSEならシステム音を消し、TRUEならシステム音が鳴るようになります。
- BEEP (音色),(ピッチ)
ピッチ0が「ド」の音、−100だと半音下、100で半音上になります。
- 変数=BUTTON(機能)
変数に押されたボタンの情報が入ります。機能が「0」のときは押されている間、「1」のときは押した瞬間のみです。
十字ボタン↑ | 1 | Aボタン | 16 | Lボタン | 256 |
---|---|---|---|---|---|
十字ボタン↓ | 2 | Bボタン | 32 | Rボタン | 512 |
十字ボタン← | 4 | Xボタン | 64 | ||
十字ボタン→ | 8 | Yボタン | 128 |
たとえば左上に押せば4+1で5が、何も押さなければ0が入ります。
ボタンに対応した数字の代わりに、定数リテラルも使えます。
十字ボタン↑ | #UP | Aボタン | #A | Lボタン | #L |
---|---|---|---|---|---|
十字ボタン↓ | #DOWN | Bボタン | #B | Rボタン | #R |
十字ボタン← | #LEFT | Xボタン | #X | ||
十字ボタン→ | #RIGHT | Yボタン | #Y |
- VSYNC (数)
プログラムを一時停止します。VSYNC 60で1秒、VSYNC 1なら60分の1秒だけ遅くなります。
IF~THEN命令の条件文で使います。
変数AとBを比べる場合 | |
---|---|
A==B | AとBの内容が同じ |
A!=B | AとBの内容が違う |
A<B | AよりBが大きい |
A<=B | AよりBが大きいか、同じ |
A>B | AよりBが小さい |
A>=B | AよりBが小さいか、同じ |
- IF (変数)!=(数) THEN (命令)
変数と数が一致しないときだけ命令を実行します。
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.473 秒 | このページの最終更新 : 2022/09/20 (火) 12:48:47 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30