MakeCode for Minecraftでプログラミング学習その3:水源付き農場を作成する
MakeCodeじゃなくてMakeCadeになっている部分あるじゃないか…!と、実は記事アップするたびに修正しています。何故かPCでは何度見ても分からないに、スマホで確認すると気づく不思議。今回はもう懲りたぞ。気合を入れなおして、今回は繰り返しパーツをメインに使用していきます。
事前情報
完全にコード殴り書き学習記録と化しているのでご了承ください。
繰り返しパーツとは
初回のChicken Rainから使用しているのでお馴染みのパーツですが、JavaScriptで言うとfor文やwhile文に相当する機能を持つパーツです。指定した回数分だけ同じ作業を何度も繰り返してくれるのが特徴ですね。今回は繰り返しパーツの中に繰り返しパーツを入れる使用方法をしています。
カウンター付き繰り返しパーツを使う
普通の繰り返しパーツよりもちょっと高機能。
カウンター付き繰り返しパーツの基本
今まで使ってきたのは『○回繰り返す』というパーツでしたが、今回はカウンター付きパーツを使用してみます。これはfor文に近いタイプで、設定した変数のリセットと繰り返し回数のカウントをしてくれます。
こんな風に、普通の繰り返しパーツでも表現することが可能です。なんとなく、こっちの方が分かりやすい気もする。
カウント数が取れると、繰り返し回数によって値を変更したい場合に便利。例えば、さっきのコードだと繰り返し回数×(間隔指定の引数p+1)をx座標に設定しているので、〇マスおきにブロックを置いていくことができます。1を足しているのはブロック自身の幅ですね。
繰り返しパーツの中に繰り返しパーツ
これをz方向にも繰り返したいというときに、繰り返しパーツの中に繰り返しパーツを入れることで可能になるのですが…ちょっと何やっているか分かりづらいですね。
See the Pen RjKQLZ by itaru (@mazuaru) on CodePen.
JavaScriptで表現するとこんな感じ。外の繰り返し1回につき、中の繰り返しを全部行っていると言えばいいのだろうか。まあ、実際触ってみた方が体感的に分かると思います。
さっきのコードを多分引数10,1で打ってます。綺麗にx・z方向に整列したブロックの一群が完成。
繰り返しパーツの中に繰り返しパーツの中に繰り返しパーツ
さらに繰り返し文を突っ込んでy座標も操作すれば立体の配置ができるのですが、繰り返し数が多くなるため時間がかかるのがちょっと難点。自分の位置を基準にしていると位置ずれを起こしやすいので、ワールド座標に変更してみました。
ワールド座標を毎回手入力するのも面倒なので、このコードで矢を打ったときの自分の位置を変数に格納しています。座標はposition型(オブジェクト型の中の一種?)として変数に入れることができますが、今回はそれぞれの座標を操作するので、値を取り出して別の変数に入れています。
ちなみに、値そのままで良い時はポジションパーツの代わりにそのまま変数をあてることができます。これは余計なパーツ使わなくていいので便利。
1マス間隔で7つずつのブロック配置をしてみました。
これは5,4かな。
フェンス・水源付き農場を作成
繰り返しパーツの操作に慣れてきたところで本題。
フェンスと地形を作る
農場についてググると、9×9マスを1セットとして考えるのがよさそう。前回フェンス付き牧場を作っているので、今回もフェンス付きにしたいですね。
まずは「埋める」パーツで地形を作成。9×繰り返し数を基準として、フェンスで囲いたいので+2マスを足します。分かりづらくて申し訳ありませんが、画像では終点を0にしているので+1。x,zは自分側の座標を1,1にすると位置ずれがないし数字的にも分かりやすい…と後で気づいたけどスクショ取り直すの面倒だったんだ。
引数1で打ってみました。うんうん。
今度は2で。繰り返し数をx,z方向一緒にしているので正方形の地形ができあがります。水を配置するところに穴をあけて確認してみましたが、計算通り。
水源やその他の配置
水は繰り返しパーツの中に繰り返しパーツを入れることで配置していきます。5マス目の5マス目でしょ、と思うところですが、フェンスのあるブロックから数えていくので+1。ただし画像では地形0地点から始まっているので(以下略)
水に落ちないように水の上にカーペットを敷いて、グロウストーンで光源も確保。
えーでもこんなの耕して種植えるの面倒だしー。ってブロック探していたらありました。
種植えまで終了した巨大農地の完成!収穫大変そうです。
コード全体図。全部耕地で埋めれば土ブロックはいらなくなるのですが、どうも耕地か作物のところでフリーズしやすいんですよね。なので、一応最小限の置き換えにしています。引数も限度5,6あたり、つまり50×50マス前後が地形作成の目安ですかね。あまりにも大きい設定にすると落ちます(何度も体験済)。
番外編:JavaScriptのsetTimeoutの考え方
記事に埋めている、JavaScriptで一定時間遅らせて繰り返しをするというコードを作るときにものすごく悩みました。MakeCodeの一時停止みたいなのがないのでfor文で回そうと思っても無理だということに気づくまでが長かった。JavaScriptでの時間操作は、一定時間おきに繰り返すsetIntervalか一回だけ繰り返すsetTimeout。上のコードではsetIntervalを使っていますが、setTimeoutで繰り返すには自身を関数として呼び出す…?ちょっと何言ってるか分からない。
でもMakeCodeで作ってみたら、なにこれ、すげー分かりやすい。if文の使い方はあってるか分からないけど。
See the Pen JOEpJG by itaru (@mazuaru) on CodePen.
なんとなく理解できたので、setTimeoutで作ってみました。
今回作ったその他コード
See the Pen KyaQNr by itaru (@mazuaru) on CodePen.
HTML5のフォームがいろいろあって面白い。
See the Pen yPNjXV by itaru (@mazuaru) on CodePen.
シンプルに書けてるけど、この中では一番初めに作ったコードなので一番苦労しています。
まとめ
分かってきた…分かってきたんだけども言葉にしようと思うとすごく難しいということも分かった。プログラミング「言語」だし、言語を言語で理解するのに限界があるんだろうなあ。さて、すっかり放置してるけど、そろそろエージェントを使ってみたいところです。では、また。