# しま模様の大きなタイルを作ろう

前の章(ドット絵作成プログラムを作ろう)

# 反復と分岐を上手く使おう

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:の部分で、i2でわった余りが0かどうか判定しています。0ならばTrueなので、if文のプログラムが、そうでなければFalseなので、else文の部分が実行されます。

偶数と奇数をPythonで判定

ここでは、「等しいこと」を調べる==を使いましたが、「等しくないこと」を調べる!=を使って、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)

対して、「i2でわった余りが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で追加したいときも簡単です。例えばi3のときだけは赤いブロック(色番号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公式アカウントに登録ください。

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


練習問題