# より複雑な建物をつくろう
このテキストでは、大きく下のようなことを勉強してきました。
- 座標の考え方
- 変数の使い方
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座標を変数x
、y
、z
に代入するのはいつもどおりですが、そのあとにx += 12
という操作をしています。
x += 12
は、x = x + 12
と同じ意味で、「x
の中の数値に、12
を足して、x
に代入し直す」操作になります。なので例えばx
に8
が代入されている場合、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 + 0
、x - 7 + 1
、...つまり、x - 7
、x - 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色のピラミッドの完成です。
# 応用編:ピラミッドの大きさを簡単に変える
ここからは、作ったプログラムをアレンジして、大きさを簡単に変えられるようにしていきたいと思います。今のプログラムでは、ピラミッドの大きさを変えようとするならば、
- 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マス離れた所に、幅15マスのピラミッドを作る」ということが決まりました。
あとは、ブロックをfor
文で積み上げるだけです。前のコードと異なる点は、下のとおりです。
range()
の中身を色の数colors_count
に置き換える- 幅の数値を、変数
w
に置き換える
これで、16色ピラミッドの完成です。
このプログラムの強みは、色の数によって変わってしまう数値を全て変数にしているところです。これによって、ピラミッド色の数・大きさを変えたい場合は、colors
リストの中身を変更するだけで修正が終わってしまいます。リストの中身を好きな色の並びにして、試してみてください。
# おわりに
以上で本テキストの内容は終わりです。
Pythonを使えば、マインクラフトの遊びの幅がどんどん広がっていくことが、わかっていただけたのではないでしょうか。
続編では、前章で紹介した格子模様のタイルなど、さらに発展的な内容を取り扱っていきます。
Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。
マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。