# チェック柄のタイルを作ろう

前の章(しま模様の大きなタイルを作ろう)

# 二重に反復してチェック柄を作ろう

前章では、for文とif文を組み合わせてしま模様のタイルを作る方法を勉強しました。本章でも、引き続きfor文とif文の組み合わせを練習していきます。今回作るのは、下のようなチェック柄のタイルです。

白と青の羊毛ブロックのチェック床

前回作ったしま模様のタイルと似ていますね。実際にコードも似ているのですが、前回と違って気をつけるポイントがあります。前回は、1つの列には全て同じ色のブロックを置けばよかったですが、このタイルはチェック柄なので、同じ列でも青と白のブロックが交互に現れないといけません。これを列ごとに交互にずらしながら設置しているようですが、どのように作っていけばよいのでしょう。

ここでは、前々章で勉強したネストの考え方を使います。for文を二重につかって、互い違いにブロックを置いていきましょう。

# 考え方

前回のしま模様タイルのプログラムを振り返ってみましょう。

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)

足元からブロックを置いていくので、高さはy - 1として、x方向に1列ずつ設置していきました。幅となるz方向は、zからz + 29の30マス分で固定していましたね。そのため、同じ列の場合は、z方向には全て同じ色のブロックが置かれていました。

今回も高さをy - 1とするところは変わりませんが、x方向に加えて、z方向のことも考えなければいけません。同じ列の中でも、青と白のブロックを交互に置かなければならないからです。例えば「x方向に0列目」のとき、その列のブロックは、0番目から、「青、白、青、白、…」というように、一つずつ交互に置かなければいけませんね。これでチェック柄を作ろうとすると、下のような形になります。

偶数奇数とブロックの色との関係

さて、バラバラに並んでいるように見えるこのタイルですが、よく見てみると下のような法則性があることがわかります。

  • xが偶数、zも偶数のとき:青色
  • xが偶数、zが奇数のとき:白色
  • xが奇数、zが偶数のとき:白色
  • xが奇数、zも奇数のとき:青色

これをまとめると、「xとzの偶・奇が同じの時は青色、異なる時は白色」のブロックを置けば良いということになります。これを上手くプログラムにするには、どうすれば良いのでしょうか。ここで、奇数と偶数のもつ性質について調べてみましょう。

# 奇数と偶数の性質

偶数同士を足し算すると、その答えは偶数になります。例えば、2 と 4 を足すと 6 になりますが、これも偶数ですね。また、奇数同士、例えば 3 と 5 を足すと 8 となり、偶数になります。

また、偶数と奇数、例えば 2 と 5 を足すと 7 となり、奇数になります。これは、2 と 5 の足す順番をひっくり返しても、同じことが言えますね。

一般的に、2つの整数について、下のような性質があります。

  • 偶数 + 偶数 = 偶数
  • 偶数 + 奇数 = 奇数
  • 奇数 + 偶数 = 奇数
  • 奇数 + 奇数 = 偶数

ここから、「2つの整数の偶・奇が同じの時、その和は偶数、異なる時は奇数」ということが言えます。

この性質は、今回の「青色か白色か」を分ける条件と、重なりそうですね。

# チェック柄を作るプログラム

それでは、実際にプログラムを書いていきましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

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

for i in range(30):
    for j in range(30):
        if (i + j) % 2 == 0:
            mc.setBlock(x + i, y - 1, z + j, 35, 11)
        else:
            mc.setBlock(x + i, y - 1, z + j, 35, 0)

for文のネストを使い、2つの変数ijで、それぞれx方向、z方向の座標をコントロールしています。とても複雑に見えるので、毎回の操作を書き並べていくと、

  • i0のとき、
    • j0

    • j1

    • j29

  • i1のとき、
    • j0

    • j1

    • j29

  • i29のとき、
    • j0

    • j1

    • j29

と、全部で30×30=90回のくりかえし操作であることがわかります。一回ごとにmc.setBlock()メソッドを使うことで、毎回異なる色のブロックを置くようにしています。

        if (i + j) % 2 == 0:
            mc.setBlock(x + i, y - 1, z + j, 35, 11)
        else:
            mc.setBlock(x + i, y - 1, z + j, 35, 0)

ここで、先ほどの奇数と偶数の性質を利用しています。(i + j) % 2で、2つの数ijを足して2でわった余りを求めています。余りが0ならば偶数、1ならば奇数でした。それぞれ、偶数ならばif節が、奇数ならばelse節が実行されます。

「○列目の×個めは何色だろう」と、自分で考えながら、プログラムとその結果を確かめてみてください。

発展

これまでと同じように、変数を上手く使うことで、より少ないメソッドでプログラムを書くことができます。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

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

for i in range(30):
    for j in range(30):
        if (i + j) % 2 == 0:
            color = 11
        else:
            color = 0
        mc.setBlock(x + i, y - 1, z + j, 35, color)

また、今回は、偶数や奇数の和の性質を使って、条件を2つだけにしましたが、この性質を知らなかったら、偶数と奇数の組み合わせ、全部で4通りの条件を考えてあげなければならず、とても面倒ですし、効率が悪そうです。

プログラミングでは、このように数の性質などを上手く利用すると、考え方がとても楽になることがあります。

# おわりに

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

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

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


練習問題