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

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

パンくずリスト

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

配列変数のことはもう大丈夫ですか?
もはやこの章ではあたりまえのように配列がFOR文といっしょに使われています。
一歩ひきかえすのもいいかもしれません。何度も読んだり、自分で打ってみて、ついでにちょっと書き換えたりしてみて、自分のものになることもあるものです。

心配のしすぎだったでしょうか。

前回はかなりプログラムっぽいことをやったので、今回はちょっと方向をかえてリアルタイムのキー入力や、十字ボタンの操作なんてやってみます。
「リアルタイム」というのは、まあいろいろ意味はあるんですが、いまは「押したらすぐ動く」みたいなものと思っていいんじゃないでしょうか。
けっこうゲームっぽいですね。

そういう意味ではけっこう大事なことをまなぶサンプルかもしれません。
けっこう長くなっているので、今回と次回の2つにわけて見ていきましょう。

あと、BEEP命令で音を出すヒントもちょっとついてますよ。

SYSBEEP変数

ハカセ

サンプルプログラム3は、まあちょっとした楽器プログラムじゃな。

  1. LOAD”SYS/EX3KEYDRUM”
  2. RUN
screenshot_exdrum.jpg
インテリくん

これを読んでいるPCなどの前のみんなも、サンプルをRUNしてためしてみよう! 前も言ったけど。
今回はプログラムリストを3DSで見ながら読むとわかりやすいよ!

神崎

ピアノ風のキーボードが1オクターブと、ドラムが4音使えるんだね。

ハカセ

実はもっとエキスパート向きのMMLという音楽機能もプチコン3号にはあるのじゃが……まあ、最初のウチはあっさり目におぼえるのがよかろう。

ワンパクくん

ツーバスやハイハットを考えてねェあたり好感がもてるぜ。だがピアノなんざ資産階級のオモチャじゃねえか! いただけねえな!

ハカセ

ワンパク君はいささか音楽的にかたよったエイキョウばかり受けている気がするんじゃが、まあピアノがイヤならプログラムを改造するというコトもできるぞい。

インテリくん

プログラムをサイショから見ていこうか。まず気になるのはどこかな?

神崎

1~21行まではだいたいおなじみの画面表示だね。8行目が引っかかるなあ。

  1. SYSBEEP=FALSE  ’システムSEをオフ

」を使ってるってことは、変数?

インテリくん

いいところに気がついたね。このSYSBEEPは「システム変数」という、変数の一種なんだ。システム変数はプチコンの動作にかかわるデータが入るようになっているよ。

ワンパクくん

ウンザリだぜ! 配列変数をやっとオボえたってのに、また変数のバリエーションかよ!

インテリくん

今はこんがらがりそうだから変数のことは考えずに、命令として丸暗記しておいた方が早いかもしれないね。
SYSBEEP=FALSE」と書くと、プチコンのシステム音が鳴らなくなるんだよ。

神崎

オボエるのがそれだけなら、まあカンタンかな。このプログラムでキーボードを打っても、いつもの「コッ」ていう音が出なかったのはSYSBEEPを使ったからなんだね。

ワンパクくん

そういやBEEPはサウンドを鳴らす命令だったな。SYSBEEPの「SYS」ってのはシステムの「シス」ってコトか?

神崎

「FALSE」は「まちがった」って意味だと思ったけど……

ハカセ

プログラムの世界ではちょっと意味が変わって「偽」などと言うのじゃが、どう見てもイッパンテキではないのう。おおざっぱなオボエかたじゃが、アリ・ナシの「ナシ」がFALSE、とオボエると今後なにかとワカりやすいぞい。

ワンパクくん

システムのBEEPが「ナシ」、つまりシステム音を鳴らさない、ってコトか……ワカりやすいが、じゃあ鳴らすようにモドすにはどうすりゃイイんだ?

ハカセ

イッキにプログラムのサイゴになるが、82行で使っておるな。

  1. SYSBEEP=TRUE

「TRUE」は「真」と言うが、これも「アリ」とオボエておけばよかろう。

ワンパクくん

ワカモノコトバをムリに使ってるカンジもするが、ワカりやすいことはタシカだな!

ハカセ(泣)

それ、ワシに言っとるのかの……?

インデント

インテリくん

24~43行は、配列とFOR~NEXT、READ・DATAを使ったおなじみのプログラムだね。

ワンパクくん

配列変数N$[]にキーボードを左から順に入れてるのはだいたいワカったゼ。たぶん、そのウチこの変数を使うんだろ。

神崎

39行で使っている変数KCNTは何なんだろう?

  1. KCNT=18
  2. FOR I=0 TO KCNT−1
ハカセ

ケンバンの数、すなわち18コと考えてもらえばいいかの。「Kenban」の「CouNT」じゃからKCNTじゃ。変数の名前を決めるのはけっこうナヤむところじゃわい。

ワンパクくん

おっと待った、こういうコトにはオレはうるさいゼ! わざわざ変数にしなくても、FOR I=0 TO 17でいいんじゃねェか!?

ハカセ

う、ウム。このアトにも1回しか使っておらんし、そうとも言えるのう。じゃが、コレはケンバンの数をふやす改造をするトキにベンリなように作っておるのじゃよ。

ワンパクくん

まァそのヘンはいいとしてもよォ、42行で1文字スペースがあいてんのはナンかイミあんのか?

  1. FOR I=0 TO KCNT−1
  2.  READ N$[I]
  3. NEXT
ハカセ

これはプログラム用語で「インデント」というヤツじゃな。カンタンに言えば、FORやGOTOで「くり返しているナカミ」のブブンだけ、1文字スペースを空けておるのじゃ。
これはまだ1行じゃからあまりイミはないが、ナカミが何行もあったりFORの中にFORがあったりするトキには、なかなか見やすくなっててイイものじゃぞい。

インテリくん

」のコメントもそうだけど、プログラムがどう動いているのか、リストを他人が見てもすぐわかるように書くのはダイジだよね。
たとえば次の46~47行みたいに、変数のイミをコメントで書いておいたりとかね。ハンオンブンとだけ書かれても、結局イミがイマイチよくわからなかったりするけど。

  1. F=100 ’ハンオンブン
  2. V=22 ’おんしょく
ハカセ(泣)

インテリ君は上げてから落とすのがウマいのう……。

BEEP命令のピッチ

  1. F=100 ’ハンオンブン
  2. V=22 ’おんしょく
ハカセ

この変数のイミを教えるには、まずBEEP命令についてもっとクワしく説明がヒツヨウじゃな。
BEEP 22でピアノの音を鳴らす、ココまでは知っておるハズじゃな?

神崎

このプログラムでも使っている音色ですね。

インテリくん

その先はボクが説明しようか。BEEP命令にはもっとフクザツな使い方があって、ピッチを決めることもできるんだ。

ワンパクくん

ビ……?

インテリくん

「PITCH」は「音高」とも言うんだけど、カンタンに言えば音の高さのことだね。

ワンパクくん

音の……タカ……?

インテリくん

ワンパク君は音楽にはくわしいと思っていただけに、さすがにその反応にはオドロキを隠せないよ。
たとえばドレミの「ミ」の音は「ド」より「高い」という言い方をするよね。ドからレ、レからミ、ファソラシド……と先に行くほどピッチが高くなる、と思えばだいたいマチガイじゃないよ。

ワンパクくん

音楽リロンを気にしてるようじゃパンクじゃねーゼ! もっとストレートにセツメイしやがれ!

インテリくん

たとえばBEEP 22,0はピアノのドの音が鳴って、BEEP 22,200でレの音になると言えば実感できるかな?

神崎

」の後の数字がピッチになっているんだね。

ワンパクくん

それイジョウ難しいコトをさえずるようなら、オレのベースが火をふくゼ!

神崎

ワンパク君にとってのベースギターは人をナグる武器だからなあ。

インテリくん

うーん、じゃあこう説明しよう。ドレミをセイカクに言うと「ド・ド#・レ・レ#・ミ・ファ・ファ#・ソ・ソ#・ラ・ラ#・シ」だね。最初の「ド」がピッチだと考えて、ひとつ右に行くごとにピッチの数字が100ずつ増えるとおぼえるといいんじゃないかな。

ワンパクくん

フーム……まったくリクツがワカった気はしねえが、そういうモンだとわりきってオボエればいいってコトだな!

神崎

(ワンパク君のロックと、ボクらが知ってるロックは少しちがうのかもしれない……)

ハカセ

ハナシはワカったようじゃな。そこで46行目にモドるが、F=100というのはまさにピッチを増やすキジュンの数、V=22はピアノの音色の番号というワケじゃ。あとあとBEEP命令でこの変数を使っておるからオボエておいてくれい。

ワンパクくん

つまり変数の数を変えればピアノ以外の音も出せるってワケだな。V=20なんかロックでいいんじゃねェか?

インテリくん

ここを読んでるみんなも数字を変えてRUNしてみよう!

BUTTON()命令

インテリくん

プログラムリストは50行からメインループに入るね。

ワンパクくん

その「メインループ」ってのはナンだ? メインなのはなんとなくオレにもワカるけどよォ、ループするってコトは無限ループになったりすんのか?

ハカセ

そうマチガっとるワケでもないぞい。じゃが、やってはならない無限ループとちがって、これはヒツヨウなループなのじゃ。

神崎

ちょっと実感がわかないけど、先を読むとわかってくるのかな。

ワンパクくん

まずドラムが、54~60行目か。

  1. ’−−− ドラム
  2. B=BUTTON(1)
  3. IF B AND 1 THEN BEEP 52
  4. IF B AND 2 THEN BEEP 53
  5. IF B AND 4 THEN BEEP 62
  6. IF B AND 8 THEN BEEP 25
  7. IF B==64 GOTO @EXIT

ワカらねえコトだらけで、ドコから手をつければいいのかもワカらねえぜ!

インテリくん

そういうことなら、まず55行目のB=BUTTON(1)がポイントだね。こう書くと、3DSの何ボタンが押されたか、変数に入るようになっているんだ。

神崎

ボタンっていうと、3DSのAボタンみたいな?

インテリくん

3DSのボタンはだいたい全部だね。この表を見てごらん。

十字ボタン↑1Aボタン16Lボタン256
十字ボタン↓2Bボタン32Rボタン512
十字ボタン←4Xボタン64
十字ボタン→8Yボタン128

たとえば十字ボタンの上を押したときは、変数にはが入る。右ボタンならだね。

ワンパクくん

ナンだってこんなハンパな数なんだ? の次はでいいじゃねェか! ジュンバンに数字をふれば1~12ですむハナシだろ?

インテリくん

じゃあ十字ボタンの左上を押したときを考えてごらん。左は、上はだね。だから4+1で、変数にはが入ることになるんだ。

神崎

同時押しされた時を考えて、わざと数字に間をあけてるってコト?

インテリくん

フツウはまずないことだけど、上と下が同時に押されれば1+2、さらに左も押せば3+4だね。こういうふうにどんな組み合わせで何個ボタンを押しても、同じ数字が出てこないようにできてるんだよ。もともとはビット演算という考えかたが……

ワンパクくん

おっと、ヤヤコシそうなハナシはゴメンだぜ! とにかくシクミはワカッたぜ。タブンその後のIF文で変数にあわせた音を鳴らしたりしてんだろ?

ハカセ

たしかにほぼそのトオリじゃ。ワンパク君のいろいろすっとばしたリカイリョクには、野生のたくましさを感じるのう。

ボタンの定数リテラル

ハカセ

ワシじゃよ、プチコンで会いに行けるアイドルとよばれとるハカセじゃ。
押されているボタンをとる方法はわかっても、どのボタンがどの数字に対応しているかは、ワシだってなかなか覚えられないもんじゃ。

定数リテラル

ボタンの入力をIFで比較するとき、ジツは数字のかわりに以下の文字が使えるんじゃ。これは定数リテラルと呼ばれておるが、名前は覚えなくてもいいぞい。

十字ボタン↑#UPAボタン#ALボタン#L
十字ボタン↓#DOWNBボタン#BRボタン#R
十字ボタン←#LEFTXボタン#X
十字ボタン→#RIGHTYボタン#Y

たとえば、「十字ボタン→」の入力を知りたい場合、

  1. IF A AND 8 THEN ...

と書くかわりに……

  1. IF A AND #RIGHT THEN ...

と書くことができるぞい。覚えやすいし、読む人にもやさしいのじゃ。

  1. PRINT #RIGHT
  2. OK

この正体は、数字が入ったただのハコじゃ。こうみると変数みたいじゃが、変数とちがって中身はエイエンに変わらないんじゃ。じゃから定数とよぶのじゃな。プチコン3号には、ボタン用だけでなく、COLOR命令用など、さまざまな種類の定数リテラルが用意されているぞい。

メインループ

インテリくん

このままプログラムリストの先に進んでもいいけど、その前にさっきもちらっと出てきた「ループ」の考え方を知っておくほうがよさそうだね。

ワンパクくん

ナンだかフクザツなハナシのヨカンを感じるぜ。

インテリくん

いやいや、フクザツにならないための予習さ。ちょっとDIRECTモード key_direct.pngNEWと打ってごらん。

  1. NEW
  2. OK
ワンパクくん

これがナンだってんだ?

神崎

あ、EDITモード key_edit.png にすると……

screenshot_edit.jpg
ワンパクくん

プ、プログラムリストがゼンブ消えてるじゃねェか!

神崎

プログラムリストを消すのがNEW命令なのか……マチガって使ったらコワいね。

インテリくん

サンプルプログラムはまたLOADしなおせばいいけど、自分のプログラムは消す前にSAVEを忘れずにね!
じゃあループの話にもどって、このプログラムを打ってみよう。プログラムのイミは分かるかな?

  1. INPUT”にゅうりょく”;A
  2. PRINT”こたえは”;A
神崎

またずいぶんシンプルな……。

ワンパクくん

オレをバカにしてんのか? ヨウするにINPUTで変数を入れさせて、それをPRINTしてるだけじゃねェか!

  1. RUN
  2. にゅうりょく?1
  3. こたえは1
  4. OK
インテリくん

その通り。じゃあ、BUTTON(1)命令を使って同じことをするにはどうすればいいかな?

ワンパクくん

1行ふえちまうが、こういうコトだな?

  1. PRINT”にゅうりょく”
  2. A=BUTTON(1)
  3. PRINT”こたえは”;A
  1. RUN
  2. にゅうりょく
  3. こたえは0
  4. OK
神崎

あれ? なにもしないうちにプログラムが終わっちゃったよ。

ワンパクくん

どういうコトだチクショー! ボタンを押してねェんだからそりゃ「こたえは0」だろうぜ!

インテリくん

そこだよ! INPUT命令とちがって、BUTTON(1)命令では「ボタンを押してない」ことも入力のウチなんだ。だからRUNしたとたんに終わっちゃうんだね。

ワンパクくん

じゃあどうすりゃボタンを押すまで待ってもらえるってんだ、ナットクできねえぞ!

神崎

何回でもBUTTON(1)命令をやり直すってことだよね。こうすればいいのかな?

  1. PRINT”にゅうりょく”
  2. @LOOP
  3. A=BUTTON(1)
  4. PRINT”こたえは”;A
  5. GOTO @LOOP

……あ、これじゃダメだ……。

screenshot_button1.jpg
神崎

やっぱり。PRINT文もループの中に入ってるからどんどん書き続けちゃう……

インテリくん

でもなかなか悪くないよ。ボタン入力の結果をPRINTするのはデキてるからね。

ワンパクくん

タシカに、ボタンを押したシュンカンだけは「こたえは」の後にちゃんと数字が入ってる……ような気がする……チクショウ、見づれえんだよ!
ボタンを押すと同時にSTARTボタンで止めてやる!

screenshot_button2.jpg
ワンパクくん

……ン?

神崎

なんだかヘンだね。ボタンは押しっぱなしなのに、これだと何度もボタンを押してるような……?

インテリくん

そこに気が付いたか。そう、このBUTTON(1)命令の使い方なら、本当はボタンを押したその時だけ変数に数字が入る命令だったよね。

ワンパクくん

うまく動いてねえじゃねェか!

インテリくん

そこで、ちゃんとBUTTON(1)命令が動くように、もう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. PRINT”にゅうりょく”
  2. @LOOP
  3. A=BUTTON(0)
  4. PRINT”こたえは”;A
  5. VSYNC 1
  6. GOTO @LOOP
神崎

命令のあとの数字で動きが変わるの?

インテリくん

その通り。BUTTON(1)だと、ボタンを押したシュンカンだけ変数に数字が入ったよね。BUTTON(0)命令で、はとにかくボタンが押してあれば、いつでも変数に数字が入るんだ。プログラムをRUNして見てみよう!

screenshot_button3.jpg
ワンパクくん

ナルホド。ボタンを押してる間はずっと変数Aのナカミに数字が入るってワケか。

神崎

ここまででわかったけど、このタイプの命令は何回もくり返さないと思ったように動かないね。そのためにはGOTOでループを作らないといけないんだ。

ハカセ

さよう。こういうリアルタイムで入力を待つプログラムは、入力を待っているとアッというまに終わってしまうので、ループを作って入力を待ち続けるのがキホンじゃな。

ワンパクくん

ハハーン、それが「メインループ」になるってワケか!

インテリくん

ジッサイにはこれ以外にもすぐ通りすぎちゃう命令や、くり返さないとイミがないコトもプログラムにはたくさんあって、そういうのをまとめてひとつのループにするのが「メインループ」になるね。
まあ、プログラムをおぼえていくうちに自然に身につくハズさ。

神崎

今つくったプログラムは無限ループだったけど、本当にやりたかったように作るとどうなるの?

インテリくん

まだ見おぼえのない書き方もまじるけど、これでいいんじゃないかな。

  1. PRINT”にゅうりょく”
  2. @LOOP
  3. A=BUTTON(0)
  4. IF A!=0 THEN PRINT”こたえは”;A:END
  5. GOTO @LOOP

みんなも打ってみてね!

ワンパクくん

ウゥ……マジで見たことねェ書き方しやがって、ヨウシャのねえヤロウだぜ!

比較演算子

神崎

この行がモンダイなんだね。

  1. IF A!=0 THEN PRINT”こたえは”;A:END

今までの話から、これが「もしも変数がゼロじゃなければ~する」ってIF文だとはなんとなく分かるんだけど……

インテリくん

気になるのは「変数!=数字」のカタチだよね。

神崎

==」もビックリだったけど、「!=」だって初めて見るよ!

ハカセ

ほっほっほ。ソコはそうムズカシいモノでもないぞ。いわゆる「≠(等号否定)」と同じイミで、まあ右と左が「ちがう」というくらいのことじゃな。

ワンパクくん

まさか、またムカシのコンピューターに「≠」の字がなかったから「!=」と書いたとか、そんなことじゃねェだろうな……。

ハカセ

それでだいたい合っておるそうじゃ。

ワンパクくん

コ、コンピューターにタイするゲンソウがどんどんウシナわれていくぜェ……。

ハカセ

ほかにも「 (小なり)」「 (大なり)」を使うこともあるが、「≦ (小なりイコール)」は「<=」、「≧ (大なりイコール)」は「>=」と書くのじゃ。

ワンパクくん

そんなのばっかりか! なんかもう、コンカイはオレもいろいろダキョウしてる気がするぜェ……。

インテリくん

そろそろ元気がなくなってきたかな。色々おぼえたし、いったん一休みしよう!

今回のまとめ

インデント

行の先頭に空白スペースを入れることを「インデント」といいます。プログラムの動作には関係ありませんが、リストを見やすくするのに使います。FOR~NEXTの中に使うのがいちばん一般的ですね。

NEW命令

  1. NEW

DIRECTモードで使います。プログラムが消去されます。

SYSBEEP変数

  1. SYSBEEP=FALSE
  2. SYSBEEP=TRUE

FALSEならシステム音を消し、TRUEならシステム音が鳴るようになります。

BEEP命令のピッチ

  1. BEEP (音色),(ピッチ)

ピッチが「ド」の音、−100だと半音下、100で半音上になります。

BUTTON()命令

  1. 変数=BUTTON(機能)

変数に押されたボタンの情報が入ります。機能が「」のときは押されている間、「」のときは押した瞬間のみです。

十字ボタン↑1Aボタン16Lボタン256
十字ボタン↓2Bボタン32Rボタン512
十字ボタン←4Xボタン64
十字ボタン→8Yボタン128

たとえば左上に押せば4+1でが、何も押さなければが入ります。

ボタンに対応した数字の代わりに、定数リテラルも使えます。

十字ボタン↑#UPAボタン#ALボタン#L
十字ボタン↓#DOWNBボタン#BRボタン#R
十字ボタン←#LEFTXボタン#X
十字ボタン→#RIGHTYボタン#Y

VSYNC命令

  1. VSYNC (数)

プログラムを一時停止します。VSYNC 60で1秒、VSYNC 1なら60分の1秒だけ遅くなります。

比較演算子

IF~THEN命令の条件文で使います。

変数AとBを比べる場合
A==BAとBの内容が同じ
A!=BAとBの内容が違う
A<BAよりBが大きい
A<=BAよりBが大きいか、同じ
A>BAよりBが小さい
A>=BAよりBが小さいか、同じ
  1. IF (変数)!=(数) THEN (命令)

変数と数が一致しないときだけ命令を実行します。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

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

ページの先頭に戻る

表示モード : [ スマホ・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