![見出し画像](https://assets.st-note.com/production/uploads/images/160089918/rectangle_large_type_2_c7f8f6c6c4183ca3db022f3aa4b9646b.png?width=1200)
(7)M5GOとUIFlowでプログラミング - 分岐
最後は、「分岐」処理です。プログラムにおいて(5)や(6)でやった「順次」「反復」に加えて「分岐」の3要素が基本になります。この3要素で原理的には世の中にある全てのプログラムが実現できます。
分岐
プログラムでは、条件によって処理を分けることができます。これを分岐、といいます。(6)では、「ずっと」ブロックの中で処理が繰り返され、スピーカーが鳴り続けていました。これを、M5GOに搭載されている「ボタンが押された」か「ボタンが押されていない」かによって処理を分けるようにしてみましょう。そうすれば、「ボタンが押されているときだけ」音がなるようにすることができます。
ボタンの押下の取得
イベントの中に「ボタンAがpressedである」ブロックがあります。
![](https://assets.st-note.com/img/1730387239-y6TIg8kRBcaFZJDwf4vu9iWj.png)
赤い文字列の手前のブロックです。
![](https://assets.st-note.com/img/1730387206-9lkmwJ6zrLETjUNcbg5hVPDH.png?width=1200)
まずは、ラベルを設置して、ブロックの中身を表示させてみます。
スピーカーを鳴らすブロックは、一旦外しておきます。
![](https://assets.st-note.com/img/1730387328-lmhud9VTkxSXAptOBra14fRJ.png)
プログラムを実行すると「False」が表示されると思います。
![](https://assets.st-note.com/img/1730387530-f4eGct81Ya2PUKuLzAZpBbSI.png)
ここで、ボタンA(左のボタン)を押すと、押している間だけ、表示が「True」に変わると思います。
![](https://assets.st-note.com/img/1730387459-o5VkYFyUwWaM0HZiebXI9T2N.png)
「True」は「真」、「False」は「偽」を表し、ある条件に当てはまっているときは「True(真)」、当てはまっていないときは「False(偽)」になります。
この変化を利用して処理を分岐させてみましょう。
![](https://assets.st-note.com/img/1730387649-V728Gp4LkvyH3AfXg0OUZ1or.png)
「論理」の中に、分岐用のブロックがあります。①が基本のブロックです。
「もし(条件)であれば(処理)」の
「もし(条件)」の「(条件)」の部分に条件が入ります。
「であれば(処理)」の「(処理)」の部分にその「条件」を満たしたとき(Trueのとき)の処理が入ります。
![](https://assets.st-note.com/img/1730387668-Opo794zDe3fwK6V0nB2sgxPm.png)
② が条件用のブロックです。右辺と左辺を比較して正しければ「True」を、違っていれば「 False」を返します。
例えば、今回の条件であれば、③ と組み合わせて、
![](https://assets.st-note.com/img/1730388052-EiC6eB84WIDALPc25HTFYSpj.png)
のように使います。「ボタンAがpressedである」 と「true」を比較して同じ(「=」)のとき、「true」が返され、処理が行われます。
処理は、何でも良いのですが、前回の「スピーカーを鳴らす」ブロックにしてみます。ラベルはひとまず外しておきます。
![](https://assets.st-note.com/img/1730388793-ju7OYA9mpgHNziWr1J6c2n4Q.png)
すると、ボタンAを押しているときだけ、スピーカーが鳴るようになります。
ボタン押下の検出ブロックの違い
また、よく似たブロックに、「ボタンAがwasPressedである」というブロックがあります。
「wasPressed」は、「押された」、であり、「pressed」は、「押されている」に相当します。動作の違いは、ブロックを変えて実行してみると分かると思います。
![](https://assets.st-note.com/img/1730388288-6CiU1QvuDazngKZsEIxtlpFA.png)
LEDバーを点灯させてみる
スピーカーの代わりにLEDバーを使用してみます。
![](https://assets.st-note.com/img/1730388843-Oo9YyIEP7NBtrdqj0pQRUsgG.png?width=1200)
LEDバーは、ハードウェアの中のRGBカラーで操作可能です。
スピーカーを鳴らすブロックと入れ替えてみます。ついでに、ラベルの表示ブロックを復活させておきます。ラベルの表示ブロックは、位置に注意してください。「もし」ブロックの外、「ずっと」ブロックの中です。
![](https://assets.st-note.com/img/1730389046-vzL62M1ZDikNcdrAFp9qneXu.png)
プログラムを転送後、押したり押すのをやめたりしてみてください。
![](https://assets.st-note.com/production/uploads/images/160094000/picture_pc_4d1611886d51be581be738bfcddb936a.gif?width=1200)
何か気づくでしょうか?
この状態で書き込んでみると、確かにボタンを押すとLEDが点灯します。しかし、ボタンを押すのをやめても、ディスプレイには「False」と表示されるものの、LEDは点灯したままになってしまっています。ボタンを押すのをやめたら、LEDが消灯するのが直感的な操作なのですが、これは、なぜでしょうか。
これは、条件に「ボタンを押した場合」しかないためです。ボタンを押すのをやめた場合にLEDを消灯するためには「ボタンを押すのをやめた」場合についても書かなくてはいけません。
このように、コンピュータに命令をする上では、あらかじめすべて動作を定義しておく必要があります。定義しておいたものは確実に行ってくれますが、定義されてないことはしません。
これが「プログラム」の本質であり「プロ(pr-)」「グラム(gram)」と呼ぶ所以です。つまり「あらかじめ(pr-)」「書いておいたもの(gram)」です。運動会や文化祭のプログラムなんかも、その日やることを「あらかじめ書いておいたもの」ですね。
さて、この問題を解決するにはどうすればよいでしょうか。
一番簡単なのは、「もし~」ブロックをもう1つ作ることです。このパターンは2つ考えられ、1つは、1つ目の「もし」ブロックの条件が「=true」2つ目の「もし」ブロックの条件を「=false」にするパターンで、
![](https://assets.st-note.com/img/1730390182-ezdxEyPcrsC5qfhVABDXwuao.png)
もう1つのパターンは、2つ目の「もし」ブロックの条件を「≠ true」にするパターンです。「= false」と「≠true」では、多少論理的な意味は違いますが動作としては同じになります。
![](https://assets.st-note.com/img/1730390224-jAtF2pGasSNKf1eQIxYTn6c7.png)
「≠」は、「ノットイコール」と呼ばれ、「同じではない」という条件です。「≠」は条件用ブロックの「=」の部分をクリックすることでリストから選べます。
![](https://assets.st-note.com/img/1730390255-egZPi0lda2D4mqvMLYH9SXCE.png)
また、「もし」ブロックの左の「歯車」マークを押すことで出るウインドウから、「もし」ブロックの種類を変えられます。標準は「もし」(if)ブロックのみですが、「でなければもし」(else if)、「そうでなければ」(else)と、1つの「もし」ブロックに複数条件を設定することができます。ちなみに、ここは日本語に翻訳されていません。
![](https://assets.st-note.com/production/uploads/images/160094043/picture_pc_1d875bd4b8bbf9172a6ce0ed575ed7aa.gif)
「もし」ブロックの種類を変えて、「if - else if」のタイプのブロックにしたもので、上のプログラムと同等に書くと、このようになります。
![](https://assets.st-note.com/img/1730510741-6kpNt1KXE0FCWUb4hgzaZcyd.png)
もちろん、「そうでなくもし」の条件は「≠ true」のパターンも考えられます。
![](https://assets.st-note.com/img/1730390315-4u6kQawAnRPVIOq1liNTg9Yf.png)
そして、これらは書き方は違いますが、プログラム的には(ほぼ)等価です。
さらに、「if - else」タイプでも同じ動作は実現できます。
![](https://assets.st-note.com/img/1730390358-qMSrvYRLVaDTb4BGf6duFyQA.png)
ちょっと高度な話
もっというと、そもそも、「もし」ブロックは(条件)がtrueだったら(処理)をするというブロックです。
この(条件)に「ボタンAがpressedである = true」を当てはめました。
つまり「ボタンAがpressedである = true」全体が「もし」ブロックに対して「True」もしくは「False」を返します。
![](https://assets.st-note.com/img/1730388052-EiC6eB84WIDALPc25HTFYSpj.png)
つまり、ブロック全体はこういうことになります。
![](https://assets.st-note.com/img/1730511075-KixjeH1MpwXcCB07FrbRhEVP.png)
「ボタンAがpressedである」ブロックはボタンが押されていれば「True」、押されてなければ「False」を返すので、条件に直接「ボタンAがpressedである」を当てはめても同じことになります。
![](https://assets.st-note.com/img/1730511152-82bNTOWqeCKzP1vcBlAgoyai.png)
![](https://assets.st-note.com/img/1730390403-Q5lYL9sMBh4gVuznqZOySfmX.png)
このように、同じ機能を実現するにしても、書き方はいろいろあります。したがって、動きが同じでも、プログラムを書く人によって書き方は違ってきたりします。「この書き方が妥当かなぁ」というのはあっても、「この書き方が正解!」というものはないのです。
ちなみに、個人的には一番最後のパターンがプログラム的にはすっきりしていてよいかなぁと思います。あくまで個人的には、ですが。
どの書き方でもよいので、プログラムを転送すると、ボタンを押すとLEDが赤く点灯し、押すのを止めるとLEDが消灯すると思います。