投稿
おちゃめ ochame_nako
初心者の人の贈るボタン入力判定の基本型 1つ目 IF BUTTON()==16 THEN (ボタンを押したときの処理)のように比較演算子(==)を省略せずに書く 2つ目 @ラベル~GOTO @ラベル、WHILE~WEND、REPEAT~UNTILなどを使いボタン入力待ちの繰り返し処理を行う 3つ目 ボタン入力待ちループの中に「VSYNC 1」を入れる 「IF B AND 16 THEN ~」のような比較演算子無しの書き方は「IF B==16 THEN ~」を比較演算子無しで書けるようになってからでも遅くはないです。
8そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
「自分は初心者ではない」という人はIF B==16 THEN ~を比較演算(==)無しで記述できるかを考えてみましょう!(瞬時に分かれば中~上級者レベルかも)
1そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
1つ目は比較演算子をちゃんと書くというのは後からビット演算による判定を行おうとした際に理解しやすくなります。(IF B AND 16 THEN ~のように比較演算子を付けない書き方を行うとビット演算と同時に論理演算も理解しなくてはならないため一気にハードルが上がってしまいます) あとBUTTON()が羅列する場合にはB=BUTTON()のように一旦変数に入れる方が見た目ですっきりします。(メインループが1フレーム以内の処理時間ならば一旦変数に入れても入れなくても処理は全く変わらない) 2つ目はBUTTON()は実行した時点でのボタン情報しか分からないため繰り返し処理が必要です。 3つ目はBUTTON()関数の情報はVSYNCのタイミングで更新されているためVSYNC無しだと誤動作の可能性があります。
1そうだね
プレイ済み
返信[3]
親投稿
pinfu ANNAININ
ふーむ。 他の方も投稿するのでは・・・と思い(笑) 初心者なりでも解答・・・ ==を使わず、Aを押した時のみ。なら (B AND 16) && !(B AND 『16以外の合計』) で行ける!? うん。もっとスマートな方法があるんだろうなぁ・・・
1そうだね
プレイ済み
返信[4]
親投稿
た™¿¼³ takumasandesu
1つ目 B=BUTTON() IF B*2-32 THEN ELSE ?"あ" 一応動きましたがもっといい方法が…
0そうだね
プレイ済み
返信[5]
親投稿
pinfu ANNAININ
Takuさん、 なるほど!!そんな方法もあるのか! しかし、何故に素直に-16ではならないのかが初心者故に分からない。 (´・ω・`)
1そうだね
プレイ済み
返信[6]
親投稿
た™¿¼³ takumasandesu
pinfuさん、 B=BUTTON() IF B-16 THEN ELSE ?"あ" でよかったです。。 (でもなんでわざわざ二倍に…)
1そうだね
プレイ済み
返信[7]
親投稿
pinfu ANNAININ
Takuさん、 コメントでの返答ありがとうございます! 解答を見た時、はっー!!なるほど!と、思い。思わずコメントしました(笑)
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
pinfuさんへ 正解です。 ただし、Aボタン以外の情報というのが少し難しいですね。 IF B==16 THEN ~という処理と同等にするためには拡張スライドパッドのボタンが押されてないかも考えないといけないし、STARTやSELECTボタンが押されてないかも考えないと行けないです。 したがって、それらをすべて合計して16を引いた値にする必要があります。(ちなみにSTARTやSELECTは8192で取得可能) Taku™¿¼³さんへ 正解です。 ただし、その方法ではELSEによって処理が入れ替わっているため実際にコードを書く場合にはその点だけは気を付ける必要があります。
2そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
正解例はこちらです。↓
1そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
プチコン3号では0以外がtrue、0がfalseとして処理されます。 したがって、比較演算子が省略できるのは「0以外」か「0」かという場合で判断が可能な場合に限られます。 (BにBUTTON()関数の戻り値が入っている場合) IF B==16 THEN ~ これは次のようにしても全く同じであることは分かるでしょう。 IF B-16==0 THEN ~ 「0」か「0以外」かで判断可能なので比較演算を省略します。 IF B-16 THEN ~ ただし、この状態だと元のB==16と比べてtrueとfalseが反転していますので論理反転を行います。 IF !(B-16) THEN ~ これで完璧! 簡単でしたが、これがすぐに分かるレベルでないと比較演算子の省略はしない方が無難です。
3そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
IF B AND 16 THEN ~のように比較演算子のない記述はIF B==16 THEN ~を比較演算子なしで簡単に記述できるくらいの人でないと複数ボタンの入力判定を行う場合に誤動作をするコードを書いてしまう可能性があります。 したがって、100%確実に動く IF (B AND 16)==16 という書き方を私は推奨しています。 これはIF B==16 THEN ~の「B」が「B AND 16」に変わっただけなので論理演算に対する知識は要求されずビット演算に対する知識のみで理解できます。
1そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
それだけではなくAボタンとBボタンの両方を押した場合という判定も簡単に記述が可能になるというメリットがあります。 AボタンとBボタンの両方を押した場合はBUTTON()関数の戻り値は16+32であるため IF B==48 THEN ~と記述が可能です。 A、Bボタン以外のボタンが押された場合のことを考えるとビット演算が必要になります。 IF B==48 THEN ~ → (B AND 48)==48 THEN ~ 初心者が段階的に理解できる IF B==48 THEN ~ → IF B AND 16 && B AND 32 THEN ~ ボタン判定の書き方が急に変わるので理解が難しくなる
3そうだね
プレイ済み
返信[13]
親投稿
た™¿¼³ takumasandesu
おちゃめさん、 なるほど。 !()を使えば反転出来たんですね。知りませんでした…OTZ pinfuさん、 こちらこそありがとうございました。 自分も何故32なのか疑問を持っていたので解決してよかったです(笑)
1そうだね
プレイ済み
返信[14]
親投稿
けい kei0baisoku
「Aだけ押している」の判定なら実際には「B==16」と書くと思いますが、==を使わずになら多分自分ならこう書くかな、という例です。 IF (B AND 16) && !(B AND NOT 16) THEN 左のカッコが「Aを押している」、右の!とカッコが「A以外をどれも押してない」を意味します。
1そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
右側が、pinfuさんが書こうとしていた部分かなと思います。 「NOT」はビットを全部反転させる演算子です。 00000000000000000000000000010000(16) 11111111111111111111111111101111(NOT 16) A以外のビットが1つでも立っていたら !(B AND NOT 16) の部分が偽になります。 おちゃめさんはこの説明は伏せられてるようでしたので、いきなりビットの反転まで踏み込むとややこしいのと、本題の正解例からも離れるから判断されたのかなと思っています。 覚えるとビットの操作で便利ではありますが、慣れないと混乱するとも思いますので、まずはシンプルな論理演算やビットの判定を覚えるのが良いと思います。
1そうだね
プレイ済み
返信[16]
親投稿
そうですね〜。結局は形で覚えてしまう人は、おちゃめさんの言うやり方でやるのがベターだと思います。(その方が間違えが起こりにくいので) そこから進化したり、ちゃんと理論(?)でわかってる人は、どう書いてもいい(ただし自己責任?)って事かなって思いますね。 てか少なくともビット演算がよくわからない人は、おちゃめさん式の方がいいのかもしれませんね。
1そうだね
プレイ済み
返信[17]
親投稿
ツララ LongIceSword
比較演算無しは、例えば!(B-16)みたいな書き方になるのかな? 多重のIF文を論理演算を絡めた数式に変換すると意外と入れ子の勉強にもなりますよね。
1そうだね
プレイ済み
返信[18]
親投稿
pinfu ANNAININ
おぉ!けいさん、ありがとうございます♪1つ学びました。 こういった、ちょっと試してみるきっかけになる投稿&コメントは、やはりありがたいですなぁ!
1そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
>pinfuさん おお、伝わったようで良かったです(^O^) ==を使わないシンプルな方法をもう一つ思い付いたので、空気を読まず半分冗談で投下。 IF !(B!=16)THEN 一休さんかよ(・ω・)
1そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
Taku™¿¼³さんへ 使う機会がないとなかなか分からないから仕方ないと思いますよ。 論理反転の演算子「!」はプチコンmkIIからすでにあったのでmkIIを使っている人ならば知っている人は多いと思います。 あとC言語経験者ならば分かると思います。
1そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
けいさんへ NOTの補足ありがとうございます。 pinfuさんの回答を尊重したというのと先日論理反転とビット反転(NOT)を使い分ける意味が分からないという人が居たので意図的にNOTを避けていました(笑) 日本語で書くならば「Aボタンを押している」かつ「Aボタン以外を押してない」となるため「Aボタン以外」というのをどのように行うかという部分になりますね。 NOTを使うのが最も確実ですが、プチコン3号の仕様であればAボタン以外のボタン情報である15354という数値を直接指定しても同じ意味になります。 私のサイトのプチコン3号入門講座のビット演算の回では2進数が分からなくても理解できるビット演算超入門から始まってANDやORだけではなくNOTやXORまで使いこなせるレベルまで書く予定です。
2そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
でんぺんさんへ B==16とB AND 16は「==」が「AND」に変わったという認識(「Bが16の時」という意味と思っている)の人も初心者の中には多いし、初心者に説明する場合にもそのように説明している人を見かけますが、実際はIF (B AND 16)==16 THEN ~の「==16」を省略したものであるということを知っておかないと誤動作をするコードを書く可能性が極めて高くなってしまいますからね。 IF B AND 16 THEN ~は分かって使うならば問題ないですが、そうでないのならば比較演算子を書いておけば誤動作の心配はほぼありません。 比較演算子を省略するならば論理演算を理解しておくのが必要不可欠になると私は考えています。
1そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
ツララさんへ !(B-16)に関しては私のネタバレコメントでも解説しています。比較演算子もビット演算子も無しで記述するならば必然的にこのようになってしまいます。 昔のBASICではANDやORが使えないものもありましたが「*」や「+」で代用していました。 速度やリスト短縮のメリットがあるためポケコンやプチコン(初代やmkII)では「*」や「+」を使い条件式の結合でANDやORはあまり使いません(複雑な判定ならばかなり短縮可能)
1そうだね
プレイ済み
返信[24]
親投稿
けい kei0baisoku
>おちゃめさん そうですね。「Aボタン以外」って言葉にすると簡単ですが、プログラムにしようとすると知らないと迷いますね。 そうそう、NOTの説明、自分の回答の説明をし始めてから「あ、これこの前自分がイチャモン付けたところだ」と気付いて必要以上に丁寧に書きました(^^; 初心者のpinfuさんにも伝わったようで良かったです。
0そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
けいさんへ 「Aボタン以外のボタン」というのは「Aボタンではないボタン」というわけで否定的な表現になるわけですよね。 したがって、NOTはビット演算において否定となるわけです。(別トピの話題ですが) あと上記の15354は計算間違いで正しくは15343です。(偶数の時点で間違っていることに気づくべきだった)
0そうだね
プレイ済み
返信[26]
親投稿
けい kei0baisoku
>おちゃめさん ラジャーです。「ビット演算において、ビット反転は否定の意味」には特に異論ありません。 既に伝わってましたら繰り返しになるので恐縮ですが、私がまずいと感じてるのは「否定を意味する英単語の演算子を使っても否定にならない」という現状です。ここで最後の「否定」は、論理的な真⇔偽の反転の事です。 NOTを論理反転だと認識している人をこのコミュでもちょくちょく見かけるのですが、この名前の付け方が一番大きな原因かなと思っています。 これは想像なのですが、もしかしておちゃめさんは「NOT演算子と言えばビットの反転でしょう」というくらい体に染み付いてるので、違和感も全く無かったりしますでしょうか?(^^; 私はさすがにそこまで直結しないので違和感を覚えてますです(´ω`)
1そうだね
プレイ済み
返信[27]
親投稿
おちゃめ ochame_nako
まぁBASICを30年以上使っているのでNOTがビット反転というのは身体に染みついているのも確かですが、分からなければヘルプやマニュアルで見るからビット演算の項目に書かれていれば論理演算の否定(反転)ではなくてビット演算の演算子と思うのが普通だと思いますよ。 と思ってマニュアル(命令表)やヘルプを見たら・・・ NOTが載っとらん(笑)
2そうだね
プレイ済み
返信[28]
親投稿
けい kei0baisoku
NOTが載っとらん………とφ(..) まあ、もしちゃんと載ってたとしても「機能が想像付かないけど調べたら分かった」はまだいいと思うのですが、「調べたら思ってたのと全然違う機能だった」はマズイと主張したい訳なのです。 マニュアル見る→存在を知った、の順番なら確かに問題は起きないと思いますし正攻法だと思いますが、そうとは限らないので。 私はもう覚えてはないですが勘違いしたということは、私もsayさんも勘違いしてたほかの人も、なにか違うルートでNOTの存在を知ったんじゃないかと思います。
0そうだね
プレイ済み
返信[29]
親投稿
pinfu ANNAININ
なるほど、 !、NOT、&&、AND、¦¦、OR、問題・・・ 最初勘違いしちゃうのは、仕方なさそう・・・実際、はじた頃はANDも&&も同じだと思っていたし・・・うん。同じ呼び方だと厄介。
0そうだね
プレイ済み
返信[30]
親投稿
おちゃめ ochame_nako
けいさんへ NOTに限らず、ANDやORも同様ですが、これにについては旧来のBASICを十分に使ったことあるか否かで反応が大きく変わるでしょうね。 私はすでにAND、OR、NOTを完全に理解した状態で&&、||、!を覚えたのでそういった誤解をした経験は全くありませんでしたが、新規に両方を覚える人は混乱する可能性がありそうですね。 もっとも上記コメントにあるように高速化やリスト短縮のため四則演算の算術演算子で代用していたので条件判断の結合としてANDやORを使う機会は少なかったでしたが(笑) pinfuさんへ そもそも論理演算やビット演算について完全に理解すること自体が初心者にはハードルが高いし、似たような意味をもつものが2つあればどのように違うのかが分からなくても当然だと思いますよ。
0そうだね
プレイ済み
返信[31]
親投稿
おちゃめ ochame_nako
AND、OR、NOTがビット演算子ではなく論理演算子であったらそれはそれで旧来のBASICとは変わってしまうので誤解がありそうですが、比較演算が=ではなく==、<>ではなく!=になっている時点で旧来のBASICとは異なっているので初代プチコンからAND、OR、NOTが論理演算子であったらけいさんが言うような誤解をする人が現れることは無かったかもしれませんね。 ビット演算子はC言語と同じ&、|、~で問題はないですし初心者に分かりやすいモダンな要素を取り入れたBASICを主張するならばそれで良かったかもしれません。
0そうだね
プレイ済み
返信[32]
親投稿
おちゃめ ochame_nako
したがって、私のサイトのプチコン3号入門講座では目に付きやすいANDやORを&&や||よりも先に採り上げて、ANDと&&、ORと||は違うものというのを強調しています。 どのように違うかは少しずつ覚えていけばいいので「違うもの」という認識さえあれば問題ないと思います。
1そうだね
プレイ済み
返信[33]
親投稿
けい kei0baisoku
>NOTに限らず、ANDやORも同様ですが、これにについては旧来のBASICを十分に使ったことあるか否かで反応が大きく変わるでしょうね。 ↑ それです!全くおっしゃる通りだと思います(^O^) おちゃめさんと私で違和感の有無が違うのは、ここの、何に慣れてきたかの違いに尽きるかなと。 それに加えて、多分私は少し強めに初心者の人優先の考えをしてるからだと思います。 従来の習慣から変わるのは慣れ親しんだ方たちには申し訳ないなとは思いつつ、別にほかの言語と同じでなくても良いので、とにかく初めてプログラムに触れる人にとって入りやすいのがいいな、と。 ビット演算の方は仕組みを理解するのはハードル高いですが、まず「違うもの」であるのを伝えるのは簡単だし大事ですね。 私も初心者の人にこの部分で教えることがあったら意識してみます(´ω`)/
0そうだね
プレイ済み