# より複雑な建物をつくろう

前の章(カラフルなタイルをつくろう)


このテキストでは、大きく下のようなことを勉強してきました。

  • 座標の考え方
  • 変数の使い方
  • for文でのくりかえし
  • データをまとめるリスト

この章では、今まで学習したことを組み合わせて、さらに複雑で大規模なものをつくっていきます。やや難しい内容を含んでいますが、要点以外の詳しい説明は「発展」という項目でまとめていますので、一旦読み飛ばして進み、詳しく知りたくなったときに読み直す、という進め方で構いません。

# ピラミッドをつくる

今回作るのは、下のようなピラミッドになります。

ピラミッド上にカラフルな羊毛ブロックを積む

色と大きさのちがう羊毛ブロックを8段重ねた、カラフルな見た目になっています。変数を今まで以上にフル活用していくプログラムになります。

まずは、「pyramid.py」というファイルを作って、いつもどおり準備をしていきましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

これで、Pythonでマインクラフトを操作する準備をしました。

次にこれもいつものように、プレイヤーの位置情報(座標)を調べるのですが、少しだけ工夫をしたいと思います。

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

x += 12

プレイヤーのx座標、y座標、z座標を変数xyzに代入するのはいつもどおりですが、そのあとにx += 12という操作をしています。

x += 12は、x = x + 12と同じ意味で、「xの中の数値に、12を足して、xに代入し直す」操作になります。なので例えばx8が代入されている場合、x += 12によって、xの中身の数値は20になります。

発展

なぜこんなことをしているかというと、これからのブロックを設置する操作を簡単にするためです。ピラミッドは、ある座標を中心としてつくっていきたいのですが、プレイヤーの位置そのままを中心にしてしまうと、プレイヤーがブロックに埋もれて死んでしまいます。なので、あらかじめx座標をずらしておくことで、少し離れた所に、安全にピラミッドをつくることができるのです。

ここから、ピラミッドを1段1段作っていくのですが、ここでもfor文が活用できます。「ブロックの大きさが一つ一つちがうじゃないか」と思うかもしれませんが、上から下にいくにつれて、ブロックが一回りずつ大きくなる規則性があるので、実はfor文でくりかえすのに向いています。

とはいえ、まずは大きな流れを掴むために、for文を使わずに何段かブロックを重ねてみましょう。

mc.setBlocks(x - 7, y, z - 7, x + 7, y, z + 7, 35, 0)
mc.setBlocks(x - 6, y + 1, z - 6, x + 6, y + 1, z + 6, 35, 0)
mc.setBlocks(x - 5, y + 2, z - 5, x + 5, y + 2, z + 5, 35, 0)

三層のピラミッド上の羊毛ブロック

一番上の行が、一番下のブロックを積んでいます。このように積み上げていくと、ブロックの規則性が見えてきます。y座標が1増える、つまり1マス高くなるたびに、x座標は、スタートとゴールがそれぞれ1マスずつ短くなっていきます。z座標も、x座標と同じです。

ピラミッドの断面図

これをfor文で書くとすると、下のようになります。

for i in range(8):
    mc.setBlocks(x - 7 + i, y + i, z - 7 + i, x + 7 - i, y + i, z + 7 - i, 35, 0)

変数iの中身は0から7まで増えていくので、例えばx - 7 + iならば、x - 7 + 0x - 7 + 1、...つまり、x - 7x - 6、...というように変化していきます。その他の引数についても同じです。実際の数字のときに、どのようなコードになるか考えてから書くと、for文は上手く書きやすいです。

白い羊毛ブロックで作るピラミッド

あとは、それぞれの段の色を決めてあげれば良いですね。前回と同じように、要素が8つのcolorsリストを作って、for文の中で呼び出してあげましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

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

x += 12

colors = [2, 5, 10, 1, 7, 3, 14, 9]

for i in range(8):
    mc.setBlocks(x - 7 + i, y + i, z - 7 + i, x + 7 - i, y + i, z + 7 - i, 35, colors[i])

8色の羊毛ブロックで作るピラミッド

これで、8色のピラミッドの完成です。

# 応用編:ピラミッドの大きさを簡単に変える

ここからは、作ったプログラムをアレンジして、大きさを簡単に変えられるようにしていきたいと思います。今のプログラムでは、ピラミッドの大きさを変えようとするならば、

  • colorsリストに色の番号を加える(減らす)
  • range(8)の中身の数を変える
  • mc.setBlocks()メソッドに引数にある、すべての7を、適切な数値に変更する
  • ピラミッドの中心の座標を調整している、x += 12の数値を変える

と、やるべきことが4つもあります。全てを適切に変えていかないと、ピラミッドは上手く作れません。

しかし、これらの変更点全てに共通しているポイントを見つけられれば、上手く変数を使って、変更しやすいプログラムに改造することが可能です。そのポイントは、「色の数(colorsリストの要素の数)」です。まずは、修正後のプログラムを見てみましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

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

colors = [2, 5, 10, 1, 7, 3, 14, 9, 0, 4, 8, 15, 13, 6, 12, 11]

colors_count = len(colors)

w = colors_count - 1

x += colors_count

for i in range(colors_count):
    mc.setBlocks(x - w + i, y + i, z - w + i, x + w - i, y + i, z + w - i, 35, colors[i])

ブロックの色を、16種類全て使っています。

まず注目してほしいのが、色の数である16といった数値が、プログラムのどこにも使われていないということです。今までは、色の数である8や、ピラミッドの片幅である7といった数値をプログラム内で使っていました。

その代わりに、colors_count = len(colors) というコードで、colorsリストの要素の数をcolors_countという変数に代入しています。

len(): 長さを調べる

「length」(長さ)の略で、()内のリストの要素数を教えてくれる命令です。この他にも、文字列に使えば、その文字数を知ることができます。

英単語

「count」は、「数」や、「数える」といった意味を持ちます。今回は、colors_count、「色の数」という意味合いで使っています。

このプログラムでは、colorsリストの要素数、すなわち色の数は16ですので、colors_countの中身も16になります。colors色の数が変われば、もちろんcolors_countの数値も変わります。

w = colors_count - 1

x += colors_count

ここでは、colors_countの数値を使って、「ピラミッドの幅w」と「中心のx座標」を決めています。中心からどれだけの幅が必要か、そして作ったときにプレイヤーがブロックで死なないように、中心をどれだけ話たら良いかを考える必要があります。

16色の羊毛ブロックで作るピラミッド

ここまでで、「色の数は16。プレーヤーから16マス離れた所に、幅15マスのピラミッドを作る」ということが決まりました。

あとは、ブロックをfor文で積み上げるだけです。前のコードと異なる点は、下のとおりです。

  • range()の中身を色の数colors_countに置き換える
  • 幅の数値を、変数wに置き換える

これで、16色ピラミッドの完成です。

このプログラムの強みは、色の数によって変わってしまう数値を全て変数にしているところです。これによって、ピラミッド色の数・大きさを変えたい場合は、colorsリストの中身を変更するだけで修正が終わってしまいます。リストの中身を好きな色の並びにして、試してみてください。

# おわりに

以上で本テキストの内容は終わりです。

Pythonを使えば、マインクラフトの遊びの幅がどんどん広がっていくことが、わかっていただけたのではないでしょうか。

続編では、前章で紹介した格子模様のタイルなど、さらに発展的な内容を取り扱っていきます。

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

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

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


練習問題