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

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

パンくずリスト

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

サンプルプログラム3を見ていくのも後半になりました。
と言っても、前回までで難しいところはだいたいおさえたので、今回はわりとスルスルいくような気がします。

中にはかなりおおざっぱな説明も出てきますが、リクツ付けはそのうち、レベルが上がってきたころにやるので、それまでは「こーゆーもんなんだな」という感じでおぼえてください。
ないしょですが、プログラマーでもそうやっておぼえた事というのは、けっこうあります。
ちなみに私も前回ここで指摘されるまで、「フォールス」または「フォルス」と読む「False」を「ファルス」と間違って読みつづけていました。あんがいそういうものです。

ビット演算子

ハカセ

さて、メインループの話からダイブずれてしまったようじゃな。そろそろLOAD”SYS/EX3KEYDRUM”でサンプルプログラムにモドるとするかの。
前回は、ドラムを鳴らすこのあたりで止まっていたんじゃったな。

  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
ワンパクくん

ケッキョク、ここに出てくるIF文の使い方はワカんねえまんまだぜ!

インテリくん

いちばん多く使われてるのは、このタイプの文だね。

  1. IF B AND 1 THEN BEEP 52
神崎

今まで習ったことのフンイキから、「上ボタンを押したら52番の音色でBEEP」ということはわかるけど……

ワンパクくん

IF B AND 1 THEN」ってナンだよコンチクショー! おかしいにもホドがあるじゃねえか!

インテリくん

これはリクツは気にせず丸ごとおぼえた方が早いかなあ。BUTTON(1)したバアイ、「IF B AND 1」と書くと、「の中にがまじっている」というイミになるんだ。

神崎

「まじっている」?

インテリくん

とくに十字ボタンの入力なんかにベンリな使いかただね。たとえば押されたボタンが右上だったとしよう。すると変数に入る数字は1+8だよね。

十字ボタン↑1
十字ボタン↓2
十字ボタン←4
十字ボタン→8

そうなるとコマるのは、「IF B==1」じゃヒットしないことだね。
ところが「IF B AND 1」や「IF B AND 8」と書くと、ちゃんとヒットするんだ。フシギだね。

ハカセ(泣)

これをセツメイするには、まず「ビット演算」についてセツメイせねばならん。ならんのじゃが、あんまりムズカしいので人に教えづらいのじゃあああああ

ワンパクくん

初心者向きのサンプルプログラムなのに、ちょくちょくフクザツなコトをしようとするよな。セツメイできねェなら、サイショからやるなよ!

インテリくん

まあまあ。こういうベンリな使いかたがあるんだから、ふかく考えずに使えばいいのさ。

ワンパクくん

テメーのワリキリもなんだかスゲエな……。

連続入力を止めるために

神崎

まだ61行目が残ってるね。

  1. VSYNC 1

前の章でおぼえた命令だね。

ワンパクくん

ツマリ、BUTTON(1)命令をマトモに動かすために……エート……60分の1秒だけプログラムを止めてるんだったか。

インテリくん

もっとくわしく言うと、VSYNCで止まっている間でも、BEEPの音は鳴りつづけるのがポイントだね。

神崎

ということは、VSYNCの直前で鳴らしたBEEPの音が、60分の1秒間は何があっても鳴りつづける……?

ワンパクくん

言い方はスゴそうでも、イマイチたいしたことが起きてねえぞ?

神崎

実際にためしてみるのが早いかな。ためしに61行の先頭に「」をつけてみよう。

  1. ’VSYNC 1

これでVSYNC命令は使われなくなったよね。RUNしてドラムを一度に鳴らしてごらん。

ワンパクくん

ウォオー! 鳴らしまくってやるゼェー!

インテリくん

みんなもワンパク君と一緒にためしてみてね!

神崎

ワンパク君のロックはデタラメに音をならせばとにかくロックだからなあ。……あれ? なんだか今までより音が大きいような……?

インテリくん

そうなんだよね。VSYNCがないと、BUTTON(1)が「何度もボタンを押してる」ようなことになるのはおぼえてるかな? つまり、人間に出せないようなスピードで何度もBEEPが鳴ってるってコトさ。

ワンパクくん

格闘ゲームっぽく言うと技を出した瞬間に、同じ技でキャンセルしてるってコトか。ナルホド……「ドカーン」の「ド」だけくり返し聞こえると、なんだか大きな音に感じるワケだな。

インテリくん

ワンパク君らしいけど、ナカナカわかりやすいたとえだね。じゃあ、さっきの「」は消して、フツウに鳴るようにしておこう。

ハカセ

先頭に「」をつけてとりあえずテストしてみる、というのはタンジュンじゃが、ダイジなテクニックじゃな。
プログラム用語では「コメントアウト」と言うのじゃが、このキカイにおぼえておくといいぞい。

INKEY$()命令

ハカセ

ひとまず、この65行に注目してもらおうかの。

  1. K$=INKEY$()
神崎

カタチはなんとなくBUTTON()命令と似ているね。

インテリくん

そう! INKEY$()命令は、BUTTON()命令のキーボードバージョンだと考えていいだろうね。「IN KEY」つまりキー入力というコトだね。

ワンパクくん

ツマリ、65行だと変数K$に押したキーの……ナニが入るんだ?

インテリくん

あ、それはBUTTON()命令よりカンタンだね。押した文字がそのまま変数に入るんだ。キーボードの「」を押していたら、K$にはという文字が入るよ。

ワンパクくん

チッ、フカヨミしすぎたか! しかし、おかげで66行目のやってるコトはよくワカッたぜ。

  1. IF K$==”” GOTO @LOOP

変数K$がカラ……つまりキーが押されてなければ、おなじみの@LOOPに飛んでくり返しってことだな!

神崎

このあたりまではBUTTON()命令と本当によく似ているね。

FOR~NEXT のおさらい

ハカセ

さて、次のこの部分じゃが、これまでBASICをベンキョウしてきたショクンには、ギモンに感じるプログラムではないじゃろうか?

  1. I=0
  2. @KLOOP
  3.  IF K$==N$[I] GOTO @PLAY
  4.  I=I+1
  5. IF I<KCNT GOTO @KLOOP
  6. GOTO @LOOP
ワンパクくん

……たしかに、フクザツで、マワリクドそうで、モヤモヤする気がするぜ。

神崎

変数を入れて、ずつ足しながらGOTO命令でループしている……?
これってもしかして、前にならったFOR~NEXT命令を使えば、もっとスッキリできそうかな?

ハカセ

おお、その通りじゃ。では、FOR~NEXTでカンタンに書き直したプログラムの方を見てもらおうかの。

  1. FOR I=0 TO KCNT−1
  2.  IF K$==N$[I] GOTO @PLAY
  3. 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+1というわけで、が変数のナカミになるね。

ワンパクくん

FOR~NEXT文も、変数にずつプラスしてくワケだしな。

ハカセ

この部分だけでも、FOR~NEXTを使わないとメンドウなことはよく分かったじゃろう。
サンプルプログラムじゃし、ときにはハンメンキョウシにもなるんじゃよ。

神崎

(うーん、うまくまとめたようで、ゴマカシきれてないな……)

ループ脱出とEND命令

神崎

81行目からは、ラベル@EXITだね。

  1. @EXIT
  2. SYSBEEP=TRUE
  3. END
ワンパクくん

@EXIT……。そんなラベル、どっかで見たような……見てねェような……

インテリくん

ははは。BUTTON(1)命令を使ったところで、ボタン判定をしていたじゃないか。

  1. IF B==64 GOTO @EXIT
ワンパクくん

オゥ、これだ! そういやあの時はドラムのコトばっかり考えてて、このGOTOのコトはすっかり忘れてたぜ! オレとしたことが!

神崎

BUTTON(1)命令で64が入ったということは、たしかXボタンを押したってことだったよね。

ハカセ

さよう。このプログラムでは、Xボタンでプログラム終了じゃったな。と言えばあとはワカるじゃろう

ワンパクくん

さすがにラクショーだぜ! 82行でSYSBEEP=TRUEして音を元にモドして、83行でENDだな!

神崎

ポイントは、Xボタンを押すことで、52~72行目の間をグルグル回っていたメインループからぬけ出しているコトだね。

インテリくん

そういうコト! ハッキリ言えば83行目のENDはなくてもいいんだけど、ループから飛びだしてプログラムを終わらせるにはピッタリだね。

ハカセ

それはモチロンじゃし、この後にラベルを増やして新しいキノウを増やすときにはますますENDがダイジになるじゃろうな。

  1. @EXIT
  2. SYSBEEP=TRUE
  3. END
  4. @USO
  5. SYSBEEP=FALSE

たとえばこういうプログラムじゃと、83行目にENDがなければ84行から先まで勝手に進んでしまうわい。

ワンパクくん

フーム……。ラベルでループを使ったプログラムじゃ、VSYNCでブレーキしつつ、そこでENDするのがダイジになるワケだな……。

ハカセ(泣)

ワ、ワンパク君! どうしたんじゃそのリッパなまとめぶりは……!

ワンパクくん

さすがに長びいたからよォ、このヘンでENDっぽく終わらせるのがイイ気がしたんだゼ。ノーフューチャー!

インテリくん

いつも通りだったね。

今回のまとめ

コメントアウト

行の先頭に「」と書くだけで(あたりまえですが)その行がなかったことになります。プログラムの動作テストのときなどに便利です。

INKEY$()命令

  1. (文字変数)=INKEY$()

変数に押されたキーが入ります。

ビット演算子

むずかしいので、使い方だけおぼえましょう。BUTTON()命令で使う変数なら、この形が使えます。

  1. IF (変数) AND (数) THEN (命令)

変数がボタンに対応した数を含んでいるときだけ、命令を実行します。
BUTTON()命令以外でもこれが使えると思ったら大まちがいです。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 1 人がこのサイトを見ています
  • このページはこれまでに 6335 回、本日は 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.321 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:08 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30