まずある日記

人は入れ物なしに物を所有できるか?

MakeCode for Minecraftでプログラミング学習その2:引数を操って大量の帯電クリーパー作成

引数。変換できねえな、と思ってはいたのですが「いんすう」ではなく「ひきすう」であることにようやく気付きました。そんなプログラミング日和です。さて、今回は最初のチュートリアルで触れたChicken Rainを改造しながら引数の使用方法を探ります。最終的に任意の大きさの牧場を作ったり、大量の帯電クリーパーを作成することができるようになりました。

 

f:id:hayaita:20171102144036p:plain

事前情報


注意:お手本みたいなシンプルなコードを書いていくつもりだったんだ。前回まではʅ( ՞ਊ՞)ʃ≡。無謀だということが分かったので、とりあえず表現したいものを作るという方向にシフトしました。綺麗なコードを書くことは今のところあきらめているJavaScript学習者です。MakeCodeの方はまともなのを心がけていますが、後で見ると直したところがいいなあという部分が多々ある。

 

引数とは?

関数を実行するときに変数の値も渡せるというものですが、MakeCodeでいえば、コマンドを打つときに一緒に入力する数値のことです。JavaScriptでの引数の使い方はいまいち分かっていませんが、コマンドを打つことが多いMakecodeでは重宝するし、自然に使えるようになります。JavaScriptでは"hogehoge"という形で文字列も引数として渡せますが、MakeCodeではそもそも変数に文字列を入れられないので引数でも使用不可。コマンド&スペース&数字で入力するものと覚えてしまって良いと思います。

 

Chicken Rainの改造

Chicken Rainのコードに手を加えてよりChicken Rainらしくしてみます。

 

リアルChicken Rain

f:id:hayaita:20171102024439p:plain
まずは準備。「行動不能にする」は、大量のスポーンを行うときには必ず設置しておきたいコマンドです。カクカクになったり、下手するとフリーズするからね。こだわりなければ、「すべてのエンティティ」に設定することで、その辺一体にいるすべての生き物を行動不能にすることができます。

 

f:id:hayaita:20171102024525p:plain

むやみな殺生は好まぬというお方は、このパーツを使用すると良いですね。特定のMobを指定できます。

 

f:id:hayaita:20171102024352p:plain

まずは、簡単な引数設定。繰り返し回数に変数を設定したので、好きな数のニワトリをスポーンさせることができます。コマンドの後にスペースを挟んで数値を入力。例えば「s 100」と打つと、ニワトリが100羽スポーンします。

 

f:id:hayaita:20171102024644p:plain

引数は複数設定が可能なので、数に続いて範囲を指定してみました。コマンドを打つときは「s 100 20」といった感じ。スクショでは高さが一定になっていますが、ここはちょっと幅を持たせたほうが良いです。

 

f:id:hayaita:20171102024811p:plain

これこそ本当のChiken rainでしょ。

 

Javascriptで表現

See the Pen gXOBdv by itaru (@mazuaru) on CodePen.

ひ、引数ってなに?

 

ニワトリ以外のスポーンを指定する

f:id:hayaita:20171102024852p:plain

MakeCodeでは引数を3つまで設定できるので、3つめの引数でスポーンする対象を指定してみました。0でニワトリ、1でクリーパー、それ以外の数字で落雷。基本的に設定した引数は入力が想定されていますが、MakeCodeでは引数を入力しない場合は0とみなされます。たとえば、「S 100」と打つと後の引数は0になるため、ニワトリが自分の頭上ピンポイントで降ってくる。ちなみにJavaScriptでは0ではなく、未定義のundefinedになります。

 

Javascriptで表現

See the Pen gXOEbj by itaru (@mazuaru) on CodePen.

書き殴ってコピペ乱用する人間に自動インデントは鬼門だけど、CodePenではどうしても入ってしまうらしい。ちなみにこれ、雷とか鳥は見えなくしているだけなので、リセットしない限り無限に要素が増えて処理が重くなります。うん、canvasでやるべきだね。

 

フェンスで囲まれた牧場を作成

自由にニワトリが召喚できるようになったら、牧場が欲しくなってくるところです。ただ大地を書き出すだけなら簡単ですが、フェンスで囲うとなるとプログラミングらしくなってきますね。

 

フェンス設置方法を考える

f:id:hayaita:20171102025114p:plain

思いついた方法はふたつですが、違いはフェンス。結果は同じですが、直線パーツを使って4つの辺を指定する方法と、一度面積をフェンスで埋めてしまってから、ひとまわり小さい面積を空気に入れ替えるという方法でフェンスに囲まれた場所を作っています。

 

f:id:hayaita:20171102144508p:plain

座標が訳分らなかった頃なのでスクショではめちゃめちゃな設定してますが、北を向いてみると分かりやすいです。コンパスは常に持ち歩きましょう。

 

f:id:hayaita:20171102025306p:plain

コマンドと引数を打つと、その大きさのフェンスで囲まれた大地が出来上がります。これ書きながら気づいたけど、なんでわざわざ自分を中心に作成することにこだわっているのだろうか。まあ、いいか。

 

f:id:hayaita:20171102025335p:plain

大きい面積の牧場も作れるけど、そもそもPCスペック的に大量のMobを呼び出せないのでほどほどに。夢の大規模ニワトリ牧場の完成。

 

Javascriptで表現

 

See the Pen bYNeGQ by itaru (@mazuaru) on CodePen.

おおお!css3のcalcが便利すぎる。これは覚えておくべき。

 

 円形の牧場を作成

f:id:hayaita:20171102025520p:plain

lineパーツと同じところに入っているcircleパーツでは円形を書き出せるので使ってみました。こういった地形は手作業では難しいので、すげー!って感じになりますね。

 

f:id:hayaita:20171102025403p:plain

綺麗に1本のフェンスで囲うことができないので、2マスの範囲を残して空気に置き換えています。こだわるなら他の方法を考える必要がありそう。まあまあ、このくらいなら及第点でしょう。

 

f:id:hayaita:20171102025419p:plain

平面を書き出すパーツなので、ループすることで地面を3層分重ねています。これで農場作成もばっちり。

 

f:id:hayaita:20171102025436p:plain

早速クリーパーを召喚して、落雷をバリバリ当てる。落雷の高さを0にしていると、地表に着火してしまうので、高さ調節するか、自分が飛んだ状態で発動すると良い感じです。

 

f:id:hayaita:20171102025459p:plain

という感じで、帯電クリーパー島がいくつもできあがりました。

Javascriptおさらい

See the Pen KypdKJ by itaru (@mazuaru) on CodePen.

今回作成したコードの総まとめ。クリックイベントの設置に何時間かかったか分からないくらい苦労しました。移動先の大きさ判定していないことに気づいたけど気づかなかったことにしておこう。結局、引数はよく分かってないけど、関数が増えてくると使わざるを得ないんじゃないだろうか。多分。

 

まとめ

まだどうやって使うのか分からないパーツもありますが、操作には大体慣れてきたかなぁというところです。JavaScriptの理解も進んできたのでプログラミングが楽しくなりつつある。さて、牧場ときたら、農場ですね。水の配置が大きな違いになってきますが、繰り返しパーツで実現できそうなので、次回挑戦してみたいと思います。では、また。