# 条件文で穴を掘ったりブロックを積んだりしよう

前の章(条件文を使った穴掘りプログラム)

# 条件文を使いこなそう

前回は、if文の使い方を学び、草ブロックだけを掘るプログラムを作りました。今回は、そのプログラムをさらにレベルアップさせていきます。

「足元が草ブロックだったとき」にだけ、特別なことをするために、if文を使いました。この条件はそのままに、逆に、「足元が草ブロックでなかったとき」にも別の特別なことをしたい場合、どうすればよいのでしょうか。

例えば、「草ブロック」だったときは、前回と同じく、ブロックをそのまま掘るとして、「草ブロックでなかった」ときは、そのブロックを草ブロックに変えるプログラムを考えてみましょう。

if-elseの場合の条件文の流れ

このときに用いるのが、「 if-else 」です。まずはプログラムを見てみましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

x, y, z = mc.player.getPos()

block = mc.getBlock(x, y - 1, z)

if block == 2:
    # 「草ブロックの上にいるよ!」とメッセージを送る
    mc.postToChat("On a grass block!")
    # 草ブロックを掘る
    mc.setBlock(x, y - 1, z, 0)
else:
    # 「草ブロックを作る!」というメッセージを送る
    mc.postToChat("Make a grass block!")
    # 足元のブロックを草ブロックに変える
    mc.setBlock(x, y - 1, z, 2)

このプログラムを実行すると、上の図のとおりの動きをしてくれます。足元のブロックが草ならば1マス掘りますし、そうでないならば、草ブロックに変えてしまいます。

では書いたプログラムについて説明します。

block = mc.getBlock(x, y - 1, z)の部分で、足元のブロックの番号を調べて、blockという変数に代入しておきます。

if block == 2:
    # 「草ブロックの上にいるよ!」とメッセージを送る
    mc.postToChat("On a grass block!")
    # 草ブロックを掘る
    mc.setBlock(x, y - 1, z, 0)

この部分でやっていることは、前回と同じですね。if block == 2:は、「もしblockの中身である、ブロックの番号が2だったら」という条件を表しています。この条件に当てはまるときは、:(コロン)で続くif文の中身が実行されるのでした。

if文の中では、チャットメッセージを送り、足元に空気ブロックを置く操作をしています。空気ブロックを置けば、元々あったブロックは消えるので、足元を掘ったようになりますね。

足元のブロックを掘る

次の部分を見てみましょう。ここからが新しい内容になります。

else:
    # 「草ブロックを作る!」というメッセージを送る
    mc.postToChat("Make a grass block!")
    # 足元のブロックを草ブロックに変える
    mc.setBlock(x, y - 1, z, 2)

elseとは、「そうでなければ」という意味です。つまりこの場合は、「blockの中身である、ブロック番号が2でなければ」という条件になっています。ifと同じように、:以降のインデントが下がっている部分が、その場合に実行する内容になります。

文と節

if以下のインデントが下がっている部分を ifelse以下の部分を else といいます。「節」というと、ifelseそれぞれのインデントのまとまりを指し、対応する節をまとめて「文」と表現します。

実行する内容は、

  • チャットメッセージを送る
  • 足元に草ブロックを置く

の2つです。試しに赤い砂岩ブロックの上で実行すると、下のようになります。

砂岩ブロックが草ブロックに変わる

その前のifに当てはまらない場合は、全てelseの中身が実行されるので、elseには== 2というような条件はつかないことに気をつけましょう。

# より多くの条件がある場合

if-else文で、プログラムを2つのパターンに分けることができました。さらに、「elif(else if)」を使うと、より多くの条件で操作を分けることができます。

先ほど作ったプログラムを、下のように改造していきましょう。

  1. 草ブロックの時は、掘る
  2. 土ブロックの時は、草ブロックにする
  3. それ以外のブロックの時は、土ブロックを5段積み上げる

プログラムは下のとおりです。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

x, y, z = mc.player.getPos()

block = mc.getBlock(x, y - 1, z)

if block == 2:
    mc.postToChat("On a grass block!")
    mc.setBlock(x, y - 1, z, 0)
elif block == 3:
    mc.postToChat("On a dirt block!")
    mc.setBlock(x, y - 1, z, 2)
else:
    mc.postToChat("Stand on a dirt block!")
    mc.player.setPos(x, y + 5, z)
    mc.setBlocks(x, y, z, x, y + 4, z, 3)

このプログラムも、足元のブロックの種類で動きが大きく変わりますが、連続で使っていると、最後には下の流れを繰り返すようになるはずです。

草ブロックを掘る → 土ブロックを草ブロックに変える → ... → 草でも土でもないブロックにあたったら、土ブロックを積み上げる → 土ブロックを草ブロックに変える → 草ブロックを掘る → ...

if文以下の部分を、詳しく見ていきましょう。

if block == 2:
    mc.postToChat("On a grass block!")
    mc.setBlock(x, y - 1, z, 0)

この部分は先ほどと変わりません。足元が草ブロックならば、1マス掘ります。

elif block == 3:
    mc.postToChat("On a dirt block!")
    mc.setBlock(x, y - 1, z, 2)

ここがelifを使っているポイントになります。ifで条件に当てはまらなかったときは、次にelifの条件に当てはまるかどうかをチェックすることになります。

使い方はif文とほぼ同じですが、elif節はそれだけで使うことができないことは覚えておきましょう。elif節を使うには、必ずその前にif文が必要です。

このコードの内容自体はシンプルで、ブロックが土(番号3)だったとき、それを草ブロックに置き換えています。

else:
    mc.postToChat("Stand on a dirt block!")
    mc.player.setPos(x, y + 5, z)
    mc.setBlocks(x, y, z, x, y + 4, z, 3)

ここはifにもelifにも当てはまらなかった場合の操作になります。mc.setBlocks()で土ブロックを5つ積み上げていますが、プレイヤーがいる場所にそのまま積んでしまわないように、mc.player.setPos()でプレイヤーを高い所に動かしています。


このようにelif節を使うことで、プログラムをより多くのパターンに分けることができます。

またelif節は使う回数に制限がありません。

if block == 2:
  # なにかの操作
  ...
elif block == 3:
  # なにかの操作
  ...
elif block == 4:
  # なにかの操作
  ...

...

else:
  # なにかの操作
  ...

このようにいくつも条件を分けることもできます。この先、必要なこともあるでしょう。

# おわりに

Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。

マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。

ProsenseのLINE公式アカウントと友達になる


練習問題