blockの立体的配置 Minecraft Programming Python

【Minecraft】Pythonでブロックを立体的に作る!!その3

今回は前回の続きをプログラムチックにピラミッドを作成しましょう!!

完成形は高さをh=5に指定したプラミッドです。

前回と異なるところは、スクリプト上でこのhを可変させてその高さに応じたピラミッドを一瞬で作成するスクリプトです。

まずは下準備。

h=5で考えてみましょう。

イメージはこんな感じ。最下段は9*9=81個のブロックが必要ですね。

で、このhを可変させて簡単にピラミッドを作成したいので、規則性をみつけます。

前提は5段なので5回、ある式を繰り返すとピラミッドができるイメージです。

1.スクリプトの作成イメージ

h=段数 #ここで段数を指定

for  i  in range(段数):#段数分繰り返し処理

mc.setBlocks(pos.x+?,pos.y+?,pos.z+?,pos.x+?,pos.y+?,pos.z+?,21) #ピラミッド1段の構築の仕方の指定

2.5段それぞれのブロック個数はどのように算出するか

5段(ピンク)だと最下段は1辺9個必要、4段(黄色)だと7個ですので、単純に「段数*2−1」ですね。

まずは ピラミッドの最下段の1辺の個数は「 段数*2−1 」となりますかね。

ここで繰り返し処理を考えますのでrange関数を使います。

range(h,0,-1)と記載すると、h=5のときは、5→4→3→2→1のように繰り返し処理の中でカウントが減っていきます。

y軸を確認すると5段ピラミッドの場合、最下段の時 h=1、2段目の時 h=2、最上段で h=5となります。

ここで段数毎の1辺の個数を求める式を考えます。

最上段(y=4):(5段−4)*2−1 = 1個 →赤ブロック1辺1個

4段目(y=3):(5段−3)*2−1 = 3個 →緑ブロック1辺3個

3段目(y=2):(5段−2)*2−1 = 5個 →青ブロック1辺5個

2段目(y=1):(5段−1)*2−1 = 7個 →黄ブロック1辺7個

最下段(y=0):(5段−0)*2−1 = 9個 →ピンクブロック1辺9個

これを式にすると (h -( i−1) )*2-1  ただし i は 5から−1ずつ減少させます。

ここで a = (h -( i−1) )*2-1  としておきます。

3.x軸とy軸のブロックの置く開始場所を考える

ピラミッドの場合は上に向かって先細りしていきますので、段数毎にブロックを置くスタート地点が異なります。

例えば下のイメージ図のように、最下段(ピンク)はx軸0の位置(x+0)から、3段目(青)はx軸2(x+2)の位置がスタート地点となり、そこからブロックを指定された個数を並べます。

具体的には・・・

最上段:x=4 から4まで    → 赤ブロック1個

4段目:x=3からx=5まで → 緑ブロック3個

3段目:x=2からx=6まで → 青ブロック5個

2段目:x=1からx=7まで → 黄ブロック7個

最下段:x=0からx=8まで → ピンクブロック9個

これを式にすると X軸のスタート地点は x+(i-1) ですね。

ここでsetBlocks関数を利用する時はスタート地点からゴール地点を決めますのでここで調整します。

そして、先ほど求めた段数毎の個数の式「a =(h -( i-1) )*2-1 」を使ってゴール地点を求めます。

スタート地点:x+(i-1)

ゴール地点:a -1

あれ?なぜ終点で −1 するんだ?

数式aは1辺の個数でした。スタート地点から終点まで並べてaの個数になるので、スタート地点に置いたブロックの数を減算しないと1個ブロックが多くなるから−1してます。

ちなみに ゴール地点は x+(i-1)  + a-1 = x+(i+a-2)になります。

ここまでのx軸の整理内容はZ軸も同じです。

ここまででスクリプトイメージは・・・

h=段数 #ここで段数を指定

for  i  in range(h,0,-1):#段数分繰り返し処理

mc.setBlocks(pos.x+(i-1) ,pos.y+?,pos.z+(i-1) ,pos.x+(i+a-2),pos.y+?,pos.z++(i+a-2),21) #ピラミッド1段の構築の仕方の指定

4.y軸について

Y軸は単純に y+(i-1) です。

for  i  in range(h,0,-1)で定義していますので、i=5~1が入力され最下段はy=0、最上段はy=4にします。

y軸の指定はsetBlocksでは同じ段では変更はしません。

ということで全て整理できました。

h=段数 #ここで段数を指定

for  i  in range(h,0,-1):#段数分繰り返し処理

mc.setBlocks(pos.x+(i-1) ,pos.y+(i-1),pos.z+(i-1) ,pos.x+(i+a-2),pos.y+(i-1),pos.z+(i+a-2),21)

さ、完成したスクリプトです。

ではh=10にしてみましょう。

ドーン!!

簡単に10段が一瞬でできました!!

では続けてh=20、そして30!!

どうだ!!

ほ〜簡単にできますね。

ただ、段数を多くすると処理速度が落ちますね。

ピラミッドが表示されるまでほんの若干時間がかかります。

まあh=5で165個、h=10で1,330個、h=20で10,660個、h=30で35,990個なんでh=20から1万個オーダーになるので処理も遅くなりますよね。

h=30の上から見るピラミッド群・・・なんかいい感じだな。

では動画でもピラミッドが出来る様子を見てみましょう!!

ということで今回は段数を指定して瞬時にピラミッドを作成するスクリプトを作りました。

ただ、私はプログラムセンスがないのでまわりくどいスクリプトを記載しています。

上手な人はもっと簡単な表記のスクリプトをかけます。

皆さんもいろいろ試してみてください。

ではまた!!

 

-blockの立体的配置, Minecraft, Programming, Python