マインクラフトプログラミングで市松模様を作る

この記事は一人でマイクラプログラミング Advent Calendar 202017日目の記事です。

この記事ではマインクラフトとコードコネクションを用いて、プログラミングによって市松模様を作る方法を紹介します。マインクラフトでプログラミングができるようになる環境構築については過去記事を参考にしてください。

コードコネクションを開き、新しいプロジェクトを作ります。適当に名前を付けましょう。私はcheckered_patternという名前にしました。

プログラムと実行例

チャットコマンド3つ作りました。それぞれ以下の通りです。

  • run:市松模様を作る
  • clear:作った模様を消す
  • white:下敷きに白いウールを敷く

それぞれのコマンドは引数を二つとります。一つ目はwidthで二つ目はdepthです。

widthは幅、すなわちx方向の大きさを示します。depthは奥行、z方向の大きさです。

プログラムと実行例は以下の通りです。

高速化したいので時間を測っています。

解説

基本は二重ループになっています。外側のループ、iのほうがx方向、jのほうがz方向の位置を制御しています。

初期位置pを記憶しておいて、ijを足しながらブロックを置いていきます。

幅と高さはそのままにすると一つ多くなってしまうので、最初に一つ減らします。

cnt変数はブロックを置くたびに1増えていきます。この値が偶数のときは緑のウールを、奇数のときは黒いウールを置くようにしています。

depthが偶数のとき、1行終わった段階でcntを1増やしてやらないと、市松模様ではなくボーダーになってしまいます。

例えば、depth=4のときを考えてみましょう。最初の処理でdepth=3になります。

普通にやると、

  • 0:緑→cnt=1
  • 1:黒→cnt=2
  • 2:緑→cnt=3
  • 3:黒→cnt=4

と置いたとき次の列に移動し、また緑をおいてしまいます。これを防ぐために、もともとのdepthが偶数(-1されたdepthが奇数)だったらcntを1増やしています。

高速化

気づいた人もいるかもしれませんが、ブロックを一つ一つ置いていると時間がかかります。簡単な高速化をしてみます。

最初に、片方の色で範囲を塗りつぶしてやり、もう片方の色だけループで置いていきます。

10x10の範囲で市松模様を作って処理時間を測ってみます。

高速化前が306だったのに対して、高速化後は159でした。倍くらい早くなっていますね。

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