# 条件文を使った穴掘りプログラム
本テキストは、『マインクラフトではじめるプログラミング』(前テキスト)の続編です。
前テキストでは、マインクラフトで学べるPythonプログラムの基本的な部分を勉強してきました。
- Pythonプログラムとマインクラフトの接続
- 座標の考え方
- 変数と代入
- ブロックの置き方
for
文によるくりかえし- データをまとめるリスト
本テキストでは、これらを踏まえて、さらに発展的な内容に取り組んでいきます。
前回以上に、マインクラフトでできることがグッと広がるので、頑張って勉強していきましょう。
もし上の内容でわからないものがあれば、焦らずに前テキストに戻って復習しながら、じっくり進めていきましょう。
# プログラムの3つの基本
プログラムの実行には、3つの基本法則があります。
- 順次(じゅんじ)
- 反復(はんぷく)
- 分岐(ぶんき)
どんな複雑なプログラムも、この3つを組み合わせることでできていますので、まずはここから勉強していきましょう。
# 順次
上から下へ順番に実行する ことを言います。プログラムは上から下に進むということで、当たり前に思うかもしれませんね。今まで書いてきたコードも、ほとんどがこれに含まれます。
# 反復
ある操作を決められた回数繰り返すことです。
Pythonでは、前テキストで学習したfor
文と、while
文というものが、これにあたります。
# 分岐
ある条件を満たす場合にのみ実行することを言います。「条件を満たすか、満たさないのか」で進み方が分かれるので、「分岐」と表現します。
Pythonでは、if
文 と呼ばれるものになります。この章では、このif
文の使い方を勉強していきましょう。
# True
とFalse
if
文を理解するためには、 True
と False
という値のことを知らなければなりません。それぞれ日本語では、「真(しん)」、「偽(ぎ)」と表現します。
例えば、「100は10よりも大きい」という文があったとします。この内容は、正しいことが分かりますね。この時、「この『100は10よりも大きい』という命題(めいだい)は真である。」と言われます。
Pythonでは、「100は10よりも大きい」というのを、100 > 10
と書きます。このように書いた時、100 > 10
は True
という値になります。
逆に、「100は10よりも小さい」という文はどうでしょう。明らかに、誤りであると分かります。この時、「この『100は10よりも小さい』という命題は偽である。」と言われます。
Pythonでは、「100は10よりも小さい」というのを、100 < 10
と書きますので、この時、100 < 10
はFalse
という値になります。
True
とFalse
は対になる値です。逆と考えても良いでしょう。この2つを合わせて、 「真偽値(しんぎち)」、または「Boolean(ブーリアン)」、「Bool値(ブールち)」と言ったりします。
データ型
「数値型」や「文字列型」といったデータ型があるように、「真偽値」も、「Bool型」というデータ型の値です。「数値」や「文字列」とは、扱いが異なることに注意しましょう。
なお、「Bool値型」の値は、True
とFalse
の2つだけです。
# if
文の使い方を覚えよう
それではいよいよif
文を勉強しましょう。まずは簡単なプログラムを見てみたいと思います。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
mc.postToChat("Start.")
if 100 > 10:
mc.postToChat("True!!")
mc.postToChat("End.")
結果は下のとおりです。
今度はこれとよく似たプログラムと、その結果を見てみましょう。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
mc.postToChat("Start.")
if 100 < 10:
mc.postToChat("True!!")
mc.postToChat("End.")
先ほどのものとは、微妙に結果がちがいますね。
それぞれのプログラムを見比べてみましょう。
どちらも、
- 最初に
"Start."
- 最後に
"End."
を、それぞれチャットに表示しています。
間にある、if
で始まる部分がif
文です。下の行のmc.postToChat("True!!)
は、行頭が下がっていますね。これをインデントというのでした。このインデントがある行が、if
文の中身になります。
if
文は、下のような流れで実行されます。
これを、1つ目のプログラムで見てみましょう。
if 100 > 10:
mc.postToChat("True!!")
if 100 > 10:
が、図の「もし○○なら」にあたる部分です。if
と:
の間に挟まれた部分がTrue
ならば、if
文の中身である、mc.postToChat("True!!")
を実行するよ、という意味になります。
実際に、100 > 10
はTrue
でしたので、if
文の中身が実行され、無事、画面にTrue!!
と表示されました。
対して、2つ目のプログラムのif
文は下のとおりです。
if 100 < 10:
mc.postToChat("True!!")
1つ目とちがうのは、100 < 10
の部分ですね。この<
や>
のことを 不等号 といいますが、ここでは「100は10より小さい」という意味を表しています。これは明らかに誤り、False
になります。
if
と:
との間がTrue
でない、すなわちFalse
のとき、if
文の中身は実行されずに、スキップされます。 画面にTrue!!
と表示されなかったのは、そのためです。
このように、if
文は、「あたえられた条件が真(True)であれば、中身を実行する」というはたらきをしています。
# 等号と不等号
if
文の条件として使われる記号として、よく使われるものを下に紹介します。
記号 | 使い方 | 意味 |
---|---|---|
> | a > b | aはbよりも大きい |
>= | a >= b | aはb以上 |
< | a < b | aはb未満、bよりも小さい |
<= | a <= b | aはb以下 |
== | a == b | aとbは等しい |
!= | a != b | aとbは等しくない |
特に等号の扱いに注意してください。Pythonでは、=
は変数への「代入」を意味するため、「等しい」を表すには、==
を使います。計算の結果を比較することもできるので、たとえば100 == 10 + 90
はTrue
、100 == 120 - 30
はFalse
になります。
# 穴掘りプログラム
if
文の練習として、下のようなプログラムに取り組んでみましょう。
ファイル名:「dig.py」
- プレイヤーが乗っているブロックを調べる
- 調べた結果、「草ブロック」だった場合、「On a grass block!(草ブロックに乗ってる!)」と表示し、そのブロックを消す
- 「草ブロック」でない場合、何もしない
草ブロックの上で実行すると、乗っているブロックが消えるので、あたかも足元に穴をほったようになります。
英単語
「dig」は英語で「掘る」という意味です。
# 乗っているブロックを調べる
mc.getBlock()
というメソッドを使います。このメソッドは、指定した座標のブロックを調べて、その番号を数値で教えてくれます。例えば、石ブロックならば1
、砂岩ブロックならば24
という結果になります。草ブロックの番号は2
です。
付録0:『ブロックの種類番号表』
調べた数値は後でif
文の中で使うので、block
という変数を作って、その中に代入しておきましょう。
# ブロックが草ブロックかどうか判定する
「草ブロックかどうか」を判定するというのは、「そのブロックの番号が2
かどうか」を判定するのと同じことです。
ブロックの番号は、block
に保存してあるので、「block
と2
が等しいか」を判定してあげると良いでしょう。判定には、この章で勉強したif
文を使います。
# 草ブロックの場合
if
文の:
に続いて、インデントをつけてコードを書いていきましょう。
「ブロックを消す」というのは、「その座標に空気ブロックを置く」のと同じことです。mc.setBlock()
メソッドを使って、空気ブロックを置きましょう。(空気ブロックの番号は0
です。)
# 草ブロックでない場合
草ブロックでない場合、条件にあてはまらないので、特になにかする必要はありません。プログラム終了です。
以上をまとめると、プログラムは下のようになります。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
# プレイヤーの座標を調べて
x, y, z = mc.player.getPos()
# 足元のブロックの番号を調べる
block = mc.getBlock(x, y - 1, z)
# ブロックが草(2)かどうか判定
if block == 2:
mc.postToChat("On a grass block!")
mc.setBlock(x, y - 1, z, 0)
if
文で何をやっているのか、しっかりと確認しましょう。
# おわりに
Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。
マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。