# しま模様の大きなタイルを作ろう
# 反復と分岐を上手く使おう
for
文の使い方にも慣れてきたのではないでしょうか。このテキストでは、if
文の使い方も学習しましたね。この章と次の章では、for
文とif
文を組み合わせてプログラミングをしていきます。
地面に白と青の2色でしま模様のタイルを作っていきます。前テキストでも、「カラフルなタイルをつくろう」の章で、リストを使ったタイルの作り方を学びましたが、今回はリストは使わず、for
文とif
文の組み合わせで作ります。そうすることによるメリットもありますので、追って紹介していきます。
# 奇数と偶数を判定する
プログラムを書いていく前に、「if
文を使って奇数と偶数を判定する」方法を勉強したいと思います。
奇数と偶数
「1, 3, 5, ....」といった数は、「2でわり切ることのできない数」です。これを「奇数(きすう)」と言います。 これに対して、「2, 4, 6, ....」といった「2でわり切ることのできる数」を「偶数(ぐうすう)」と言います。 なお、0も偶数に含みます。(2でわった答えが、「0あまり0」のため)
英語では、奇数を「Odd」、偶数を「Even」と言います。
今、何かの整数が代入されている変数i
があるとして、それが偶数か奇数かを判定したいと思います。
Pythonには、「わり算」の計算に使う記号(「演算子(えんざんし)」といいます)が3つあります。
演算子 | 意味 | 例 |
---|---|---|
/ | わり算の結果 | 7 / 4 == 1.75 |
// | わり算の商(整数部分) | 7 // 4 == 1 |
% | わり算のあまり(小数部分) | 7 % 4 == 3 |
ある数が奇数か偶数かを調べたいとき、「その数を2でわった余り」に注目します。余りが0ならば、2でわり切れるので偶数、そうでなくて、余りが1のときは、2で割り切れないので奇数です。上の表では、%
を使って2でわった余り、つまり、i % 2
の結果が0
ならば偶数、0
でない(1
)ならば奇数ということになります。
以上をPythonプログラムで書くとこのようになります。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
# iに代入する値を色々と変えて確かめてみましょう
i = 35
if i % 2 == 0:
# 偶数のときに実行したいプログラム 「i は偶数だよ!」
mc.postToChat("i is even!")
else:
# 奇数の時に実行したいプログラム 「i は奇数だよ!」
mc.postToChat("i is odd!")
変数i
に調べたい数字を代入して実行すると、代入した数字が偶数ならば「"i is even!"
(i は偶数だよ!)」、奇数ならば、「i is odd!
(i は奇数だよ!)」とチャットに表示するプログラムです。
if i % 2 == 0:
の部分で、i
を2
でわった余りが0
かどうか判定しています。0
ならばTrue
なので、if
文のプログラムが、そうでなければFalse
なので、else
文の部分が実行されます。
ここでは、「等しいこと」を調べる==
を使いましたが、「等しくないこと」を調べる!=
を使って、if
文から先を下のように書くこともできます。
if i % 2 != 0:
# 奇数のときに実行したいプログラム 「i は奇数だよ!」
mc.postToChat("i is Odd!")
else:
# 偶数の時に実行したいプログラム 「i は偶数だよ!」
mc.postToChat("i is Even!")
偶数と奇数の順番が入れ替わっていることを確認してみてください。
# for
文とif
文の合わせワザ
それでは、実際にしま模様のタイルを作るコードを書いてみましょう。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
x, y, z = mc.player.getPos()
for i in range(30):
if i % 2 == 0:
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, 0)
else:
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, 11)
これを実行すると、冒頭で紹介した、白と青のしま模様のタイルができあがります。for
文の中でif
文を使っているのがポイントです。羊毛ブロックを置く操作を30回繰り返しているのですが、それが偶数回目か奇数回目かによって、ブロックの色を変えています。より詳しく見ていきましょう。
for i in range(30):
まずはfor
文です。range(30)
としていますので、30回くりかえされ、そのたびにi
には0
から29
までの数値が順番に代入されていきます。
if i % 2 == 0:
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, 0)
くりかえすたびに、i
が偶数か奇数かを判定しています。i % 2 == 0
なので、「2
でわった余りが0
」、つまりi
が偶数の時に、mc.setBlocks()
を実行します。
y座標はy - 1
で変わりません。z座標も、z
からz + 29
までの幅30マスで固定しています。
変化するのはx座標だけです。これが、i
が大きくなるにつれ、x方向に1ずつ大きくなっていきます。
ブロックの番号は、羊毛ブロックの35
、ブロックの色は、白の0
を指定しています。これで、i
が偶数の時だけ、幅30マスの白色ブロックを置くことになります。
else:
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, 11)
対して、「i
を2
でわった余りが0
でない」、つまりi
が奇数の時に実行されるのが、このelse
文です。mc.setBlocks()
メソッドの中身は先ほどとほとんど変わりません。異なるのは、羊毛ブロックの色が、白の0
から青の11
となっている点のみです。
このelse
文で、i
が奇数の時だけ、幅30マスの青色ブロックを置くことになります。
以上の組み合わせで、白色と青色のブロックを交互に置くプログラムが完成です。これをリストを使って作ろうとすると、色のリストを[0, 11, 0, 11, ...]
というように、長々と準備する必要があります。なのでこうした単純な繰り返しでは、for
文とif
文の組み合わせの方が、コードもスッキリとしますね。
発展
変数を使うと、mc.setBlocks()
メソッドを書くのを1度だけで済ませることができます。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
x, y, z = mc.player.getPos()
for i in range(30):
if i % 2 == 0:
color = 0
else:
color = 11
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, color)
偶数のときと奇数のときで異なるのが、ブロックの色だけであることに注目して、変数color
の数値を代入し直しています。
行数は1行増えましたが、コード自体はよりスッキリとして見えるのではないでしょうか。また、偶数と奇数以外の条件をelif
で追加したいときも簡単です。例えばi
が3
のときだけは赤いブロック(色番号14
)にしたい時は、
for i in range(30):
if i % 2 == 0:
color = 0
# この下の2行を追加
elif i == 3:
color = 14
else:
color = 11
mc.setBlocks(x + i, y - 1, z, x + i, y - 1, z + 29, 35, color)
のように、いちいちメソッドを書く必要がありません。アレンジする時にはとても便利なので、試してみてください。
# おわりに
Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。
マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。