この記事は一人でマイクラプログラミング Advent Calendar 202017日目の記事です。
この記事ではマインクラフトとコードコネクションを用いて、プログラミングによって市松模様を作る方法を紹介します。マインクラフトでプログラミングができるようになる環境構築については過去記事を参考にしてください。
コードコネクションを開き、新しいプロジェクトを作ります。適当に名前を付けましょう。私はcheckered_pattern
という名前にしました。
プログラムと実行例
チャットコマンド3つ作りました。それぞれ以下の通りです。
run
:市松模様を作るclear
:作った模様を消すwhite
:下敷きに白いウールを敷く
それぞれのコマンドは引数を二つとります。一つ目はwidth
で二つ目はdepth
です。
width
は幅、すなわちx方向の大きさを示します。depth
は奥行、z方向の大きさです。
プログラムと実行例は以下の通りです。
高速化したいので時間を測っています。
解説
基本は二重ループになっています。外側のループ、i
のほうがx方向、j
のほうがz方向の位置を制御しています。
初期位置p
を記憶しておいて、i
とj
を足しながらブロックを置いていきます。
幅と高さはそのままにすると一つ多くなってしまうので、最初に一つ減らします。
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でした。倍くらい早くなっていますね。