# 条件文を使った穴掘りプログラム

本テキストは、『マインクラフトではじめるプログラミング』(前テキスト)の続編です。

前テキストでは、マインクラフトで学べるPythonプログラムの基本的な部分を勉強してきました。

  • Pythonプログラムとマインクラフトの接続
  • 座標の考え方
  • 変数と代入
  • ブロックの置き方
  • for文によるくりかえし
  • データをまとめるリスト

本テキストでは、これらを踏まえて、さらに発展的な内容に取り組んでいきます。

前回以上に、マインクラフトでできることがグッと広がるので、頑張って勉強していきましょう。

もし上の内容でわからないものがあれば、焦らずに前テキストに戻って復習しながら、じっくり進めていきましょう。

# プログラムの3つの基本

プログラムの実行には、3つの基本法則があります。

  1. 順次(じゅんじ)
  2. 反復(はんぷく)
  3. 分岐(ぶんき)

どんな複雑なプログラムも、この3つを組み合わせることでできていますので、まずはここから勉強していきましょう。

# 順次

上から下へ順番に実行する ことを言います。プログラムは上から下に進むということで、当たり前に思うかもしれませんね。今まで書いてきたコードも、ほとんどがこれに含まれます。

順次のプログラム

# 反復

ある操作を決められた回数繰り返すことです。

反復のプログラム

Pythonでは、前テキストで学習したfor文と、while文というものが、これにあたります。

# 分岐

ある条件を満たす場合にのみ実行することを言います。「条件を満たすか、満たさないのか」で進み方が分かれるので、「分岐」と表現します。

分岐のプログラム

Pythonでは、if と呼ばれるものになります。この章では、このif文の使い方を勉強していきましょう。

# TrueFalse

if文を理解するためには、 TrueFalse という値のことを知らなければなりません。それぞれ日本語では、「真(しん)」、「偽(ぎ)」と表現します。

例えば、「100は10よりも大きい」という文があったとします。この内容は、正しいことが分かりますね。この時、「この『100は10よりも大きい』という命題(めいだい)は真である。」と言われます。

Pythonでは、「100は10よりも大きい」というのを、100 > 10と書きます。このように書いた時、100 > 10True という値になります。

逆に、「100は10よりも小さい」という文はどうでしょう。明らかに、誤りであると分かります。この時、「この『100は10よりも小さい』という命題は偽である。」と言われます。

Pythonでは、「100は10よりも小さい」というのを、100 < 10と書きますので、この時、100 < 10Falseという値になります。

TrueFalseは対になる値です。逆と考えても良いでしょう。この2つを合わせて、 「真偽値(しんぎち)」、または「Boolean(ブーリアン)」、「Bool値(ブールち)」と言ったりします。

データ型

「数値型」や「文字列型」といったデータ型があるように、「真偽値」も、「Bool型」というデータ型の値です。「数値」や「文字列」とは、扱いが異なることに注意しましょう。

なお、「Bool値型」の値は、TrueFalseの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文は、下のような流れで実行されます。

if文の流れ

これを、1つ目のプログラムで見てみましょう。

if 100 > 10:
    mc.postToChat("True!!")

if 100 > 10:が、図の「もし○○なら」にあたる部分です。if:の間に挟まれた部分がTrueならば、if文の中身である、mc.postToChat("True!!")を実行するよ、という意味になります。

実際に、100 > 10Trueでしたので、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 + 90True100 == 120 - 30Falseになります。

# 穴掘りプログラム

if文の練習として、下のようなプログラムに取り組んでみましょう。

ファイル名:「dig.py」

  1. プレイヤーが乗っているブロックを調べる
  2. 調べた結果、「草ブロック」だった場合、「On a grass block!(草ブロックに乗ってる!)」と表示し、そのブロックを消す
  3. 「草ブロック」でない場合、何もしない

草ブロックの上で実行すると、乗っているブロックが消えるので、あたかも足元に穴をほったようになります。

草ブロックに空けられた穴

英単語

「dig」は英語で「掘る」という意味です。

# 乗っているブロックを調べる

mc.getBlock()というメソッドを使います。このメソッドは、指定した座標のブロックを調べて、その番号を数値で教えてくれます。例えば、石ブロックならば1、砂岩ブロックならば24という結果になります。草ブロックの番号は2です。

付録0:『ブロックの種類番号表』

調べた数値は後でif文の中で使うので、blockという変数を作って、その中に代入しておきましょう。

# ブロックが草ブロックかどうか判定する

「草ブロックかどうか」を判定するというのは、「そのブロックの番号が2かどうか」を判定するのと同じことです。

ブロックの番号は、blockに保存してあるので、「block2が等しいか」を判定してあげると良いでしょう。判定には、この章で勉強した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公式アカウントに登録ください。

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


練習問題