ランダムな数値を取得してブロックを建築する マイクラ&Python

マイクラPythonでランダムにブロックを設置 マインクラフト+Python
マインクラフト+Python

ランダムな数値を取得し、その値を利用していろんな方向にブロックを自動建築するプログラムを紹介します。
ただランダムで滅茶苦茶にブロックを設置するのはあまり面白くないので、今回は空を自由に泳ぐヘビのような物体を作ってみましょう。

ランダムな数値を取得する

ランダムとはくじ引きのようなもので、何が出てくるのかが分からないという物です。
このランダムの特性を利用して、

  • もし0が出たら東方向に
  • もし1が出たら上方向に
  • もし2が出たら南方向に

それぞれブロックを建築してゆくというプログラムを、繰り返し処理の中で一時停止しながらコマ送り風に動かすことで、空を泳ぐアニメーションのような効果を演出します。

今回使用する主なプログラミング技術は以下のようなものです。

  • ランダムな値を取得する
  • プログラムの実行を一時停止する
  • 指定した回数ぶん繰り返し処理をする
  • リスト型のモノ(変数)を使用する

以下にサンプルプログラムを掲載しますので、ご自身の環境で動かしてみたい場合は以下の場所に保存してください。
ファイルパス(Macの場合)
/Users/ユーザ名/Library/Application Support/minecraft/mcpipy/skysnake.py

こちらに掲載したサンプルを実行するには、チャット入力エリアに以下のコマンドを入力してください。

/py skysnake

このプログラムを実行すると、黄色いブロックがうねうねと空を飛ぶ様子が見られると思います。
そして設置したブロックが自動で消えてゆくことにも注目する必要があります。

空にブロックをランダムに設置してうねうね動かす。マイクラPython

for 繰り返し処理の中でしていること

上のPythonプログラムでは、for の繰り返し処理の中で以下のようなことがおこなわれています。
すでに現在位置は取得できているので、この現在位置を起点にものごとが進んでゆきます。

  1. ランダムな値を取得します。
  2. いまの高さを判定し、「上昇モード」または「下降モード」に振り分けます。
  3. もしランダムな値が「0」だった場合は、東方向に1を足した場所にブロックを設置します。
  4. もしランダムな値が「1」だった場合は、「上昇モード」か「下降モード」かを判定し、上下方向のどちらかに1ブロックぶんを変化させた場所にブロックを設置します。
  5. もしランダムな値が「2」だった場合は、南方向に1を足した場所にブロックを設置します。
  6. ブロックを設置した場所を記憶しておきます。
  7. もし繰り返し回数が20以上だった場合は、20回前に設置したブロックを削除(空気ブロックに置き換え)します。

このように現在有効な位置にブロック1個ぶんの位置情報をランダムに決定させ、そこにブロックを設置。
そして過去に設置したブロックを削除することで、20ブロックで構成されたヘビのような物体が空をうねうね飛ぶのですね。

ランダムな値を取得するプログラムの解説

ランダムに値を取得するには、まず random という外部のプログラムを読み込んでおく必要があります。

そして、0から2までの数字から、ランダムに値を取得している部分がこちらです。

0から2までの数字、つまり「0」「 1」「2」 の3種類の中のどれかがランダムに選択されます。
この命令を取得すれば何が出てくるか分かりませんので、「おみくじ」や「じゃんけん」などのプログラムにも使えそうですね。

ヘビの上昇・下降を設定するプログラムの解説

プログラム実行が開始されると、プレーヤがいる場所からヘビが動き出します。
プレーヤのいる場所というのは、以下のプログラムで座標が取得できましたよね。

ここからヘビが下降してしまった場合、ヘビが地中に潜ってしまうので動きを見ることができません。
なので最初はヘビが上昇するように設定しています。

でもヘビが上昇しっぱなしだと宇宙へ飛び出してしまうので、ある程度の高さまで達すると下降に切り替える必要があります。
これと同じように、下降しっぱなしだと地下に潜ってしまいますので、また上昇に切り替える必要があるのですが、その処理をしているプログラムがこちらです。

もしy座標が0以下だった場合、つまり高さが海面と同じだった場合は、上昇モードに設定します。
一方、高さが40以上だった場合は結構高い位置にいるので、下降モードに設定します。

そして、この設定した値を判断して動作分けしている部分がこちらのプログラムです。

上昇モードの場合はy座標の値をプラス1にして、
下降モードの場合は、逆にy座標の値をマイナス1にしています。
こうしてx, y, z それぞれの座標が決定したので、ブロックを設置しているんですね。

設置したブロック位置の保存

設置したブロックの位置は、以下に保存されてゆきます。

「old_x」「old_y」「old_z」というモノは、33〜35行めで最初に出てきていますよね。
こちらです。

ここでは、まずリスト(または配列)という型のモノを準備しておきます。
このリスト型のモノは、1個のモノの中にたくさんの値を保存できる便利なやつで、

  • old_x[0] = これのゼロ個めに入っている値を見るよ!
  • old_x[1] = これの1個めに入っている値を見るよ!
  • old_x[2] = これの2個めに入っている値を見るよ!
  • old_x[3] = これの3個めに入っている値を見るよ!

といったように、モノの中身は番号で分けられています。
この番号はゼロから始まることに注意してください。

そして、91行めではこの「old_x」に以下のような情報を保存しています。

  • old_x[0] = [x座標の値]
  • old_x[1] = [次のx座標の値]
  • old_x[2] = [そのまた次のx座標の値]

上記はX座標のみ解説をしていますが、Y座標やZ座標も同じような意味です。

設置したブロックを一定の条件で削除

もし繰り返し回数が20以上だった場合は、20回前に設置したブロックを削除(空気ブロックに置き換え)するプログラムがあります。
新しいブロックを設置しながら古いブロックを消してゆくことで、アニメーションのような演出で空を移動しているように見えるわけです。

  1. もし繰り返し回数を記憶している「i」が20以上だった場合
  2. index というモノに対して、i – limit の計算結果を入れます
    もし繰り返しが20回転めだった場合は、20 – 20 の計算結果、つまりゼロの数字が index に入ります。
  3. 「mc.setBlock」の命令で、指定した座標のブロックを「空気」にします。
    102行めでは「old_x[index]」「old_y[index]」「old_z[index]」の指定がありますが、[index] には(2)で計算した値が入っていると考えてください。

もしこの処理がない場合は、設置したブロックが削除されることなく、ずっと空に残っていることになりますので、もし試してみたい場合は102行めのプログラム先頭に「#」を追加(コメントアウト)して、実行してみると良いでしょう。

また、109行め以降も同じようなプログラムが書かれていますので、コメントを見ながらどのような動きになっているか考えてみましょう。


タイトルとURLをコピーしました