お知らせ

『プログラミング能力検定(11月検定)』参加者募集中!

詳細はこちら

【12】条件によって違う動作をする

あったら壊すのイメージ マイクラ(Python)

この項では「目の前にサトウキビがあったら壊す、なかったら新しく植える」といったように条件によって違う動作をさせるプログラムを作ります。このような処理を「条件分岐」といいます。

条件に合っていれば「True」、間違っていれば「False」

if 条件式 :
    動作1
else:
    動作2

これが条件分岐の構文です。ifイフ は「もし~」という意味の英語で、elseエルス は「そうでなければ~」という意味です。それぞれ、コロン(:)を忘れないように注意しましょう。そして動作1動作2の部分は右にインデント(字下げ)します。

「もし天気が晴れなら学校へ行く、そうでなければ学校を休む」というプログラムであれば以下のような形になります。

if 天気が晴れ :
    学校へ行く
else:
    学校を休む

まず「天気が晴れ」というのが条件式になります。

今の天気がもし晴れだとしたら「天気が晴れ」というのは本当のことなので、この結果をプログラミングの世界では「しんTrueトゥルー」といいます。

逆に今の天気がもし雨だとしたら「天気が晴れ」というはウソになりますので、この結果をプログラミングの世界では「Falseフォールス」といいます。

そして True のときにやってもらいたい動作を if の次の行に、 False のときにやってもらいたいときの動作を else の次の行に書きます。

False のときにやってもらいたいことが特になければ else 以下のコードは省略することもできます。

では実際にプログラムを作っていきましょう。

もしブロックあれば壊す、なければ置く

もしブロックあれば壊す、なければ置くの図

今回は「もしエージェントの前にブロックがあったら壊す、なかったらブロックを置く」というプログラムを作っていきます。

まず「エージェントの前にブロックがある」という条件式を作ります。

agent.detect( 検知させるものの種類, 方向 )

ここで使うのが detectディテクト という命令です。detect とは「見つける・検知する」という意味の英語です。そして ( ) の中に以下の要素を選んで入れます。

検知させるものの種類
AgentDetection.BLOCK・・・・・ブロック
AgentDetection.REDSTONE・・・・・レッドストーン

方向
FORWARD・・・・・前
BACK・・・・・後ろ
LEFT・・・・・左
RIGHT・・・・・右
UP・・・・・上
DOWN・・・・・下

今回はブロックにあるかどうか調べたいので条件式は以下のようになります。

agent.detect(AgentDetection.BLOCK, FORWARD)

これで「エージェントがブロックを前方に見つける」という意味になります。

実際にエージェントの前にブロックがあればこれは本当ということで結果は True になりますし、なければウソ= False ということになります。

ではこの条件式を if文に組み込みましょう。

if agent.detect(AgentDetection.BLOCK, FORWARD):
    動作1
else
    動作2

あとは簡単です。動作1には True のとき(ブロックがあったとき)にやってもらいたい動作、動作2には False のとき(ブロックがなかったとき)にやってもらいたい動作をそれぞれ入れます。

if agent.detect(AgentDetection.BLOCK, FORWARD):
    agent.destroy(FORWARD)
else:
    agent.place(FORWARD)

これで完成です。プログラムを実行するたびにブロックが壊されたり置かれたりという動作が繰り返されれば成功です。

not で True と False を入れ替える

下にブロックがあったら特になにもしない、なかったらブロックを置く

例えば「もし下にブロックがあったら特になにもしない、そうでなければブロックを置く」というプログラムを作るとします。この場合、True だったときの動作は書くことがないので空白になってしまいます。

if agent.detect(AgentDetection.BLOCK, DOWN):
    
else:
    agent.place(DOWN)

このような場合は「なにもしない」という意味の passパス を入れてもいいのですが、

if agent.detect(AgentDetection.BLOCK, DOWN):
    pass
else:
    agent.place(DOWN)

条件文の前に notノット をつけて条件を反対の意味にすることもできます。

if not agent.detect(AgentDetection.BLOCK, DOWN):
    agent.place(DOWN)

これで「もし下にブロックがなかったらブロックを置く」という構文になります。ブロックがあった場合は特に何もしないので else 以下は省略しても大丈夫です。この方が行数が少なくできますね。