活動内容 Agent Tree Chopper

Minecraft で木を切るのは大変な作業ですが、サバイバルモードでオブジェクトやツールを作りたいなら必要なことです。 しかし、エージェントの助けを借りて、この作業をコードで自動化することができます! エージェントに、任意の高さの木を切り倒して地面に戻る方法を教えてあげましょう。

新しい MakeCode プロジェクトを始めるとき、コーディングを始める前に、どのような手順を取るか計画するのは良いアイデアと言えます。

以下がその例です。

  1. 木の高さを把握する:
    • エージェントの前にブロックがある限り、上に移動し続けてください。
    • 木の高さを把握する:
  2. 木の高さと同じ回数だけ以下を繰り返す:
    • 目の前のブロックを破壊する:
      • 目の前のブロックを破壊する:
        • 木の高さを把握する:
        • 木が高くなったのを把握する。
        • 下に移動します。
      • すべて回収します。

前回のアクティビティでは、||logic:if then else||ステートメントを使用して条件をチェックし、思い通りの動作を実行させました。 このアクティビティでは、||loops:while||ループの中で条件文を使用します。 エージェントは、登るべき木のブロックがある限り、上に移動し続けます。

Do the activity

Make a project

  1. Chopper.

  2. Rename the existing ||player:on chat command|| to "tp" という新しい MakeCode プロジェクトを作成する。

  3. ||agent:AGENT||から||player:on chat command "tp"||の中に||agent:agent teleport to player||ブロックをドラッグします。

  4. さて、エージェントの向きを変えるための方向コマンドも作成しましょう。 ||player:on chat command "tp"|| を右クリックして、[複製] を選択してコピーを作成します。

  5. 複製を "lt" にリネームします。

  6. この新しい複製の内部ブロックを削除して、||agent:agent teleport to player||||agent:agent turn 'left'|| と置き換えます。

player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})

Create the height variable

  1. ||player:PLAYER||から||player:on chat command||ブロックをコーディング作業領域にドラッグし、"chop".

  2. に名前を変更し、木の高さを記録しておく変数を使用することにします。 ||variables:VARIABLES|| ツールボックスのドロワーで、[変数を作成] ボタンをクリックします。

  3. 新しい変数に height という名前を付けます。

    高さを 0

    1. ||variables:VARIABLES||||variables:set|| をドラッグアウトして ||player:on chat command "chop"|| 内にスナップします。

    2. ||variables:set||ブロックで、ドロップダウンメニューを使って変数としてheightを選択し、height0に設定します。

    let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0})

    木の根本から始める

    チョップのコマンドが与えられたときにエージェントが木の根本に向けて配置されていると仮定します。 "tp""lt"のコマンドを使ってエージェントを配置し、最後に"chop"を使います。

    条件文に||loops:repeat||ループを組み合わせたような||loops:while||ループを使用します。 ここでは、エージェントの前にブロックがある限り、コードは続行されます。

    1. ||loops:LOOPS|| から ||loops:while|| ループをドラッグして ||variables:set 'height'|| の下にドロップします。 これは ||player:on chat command "chop"|| の内部になります。

    2. ||agent:AGENT|| から ||agent:agent detect 'block' 'forward'|| をドラッグして、||logic:true|| を置き換える ||loops:while|| ループの中にドロップしてください。

    let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { }})

    Move up the tree and chop

    最後に、刻むことができます(少なくともエージェントはできます!

    1. ||variables:VARIABLES||から ||variables:change|| ブロックを ||loops:while|| ループ内に配置します。

    2. 新しいブロックは ||variables:change 'height' by 1|| を読みます。 これはエージェントが上に移動するたびに、height変数を1ずつ増加させる。 こうして木の高さを把握することができます。

    3. 葉や枝がエージェントの頭上にある場合、エージェントを上に移動するために、それらを破壊する必要があります。 ||agent:AGENT||から||agent:agent destroy||||variables:change 'height' by 1||の下に配置します。 このブロックは、ドロップダウンメニューから方向としてupを選択して、調整する必要があります。

    4. 最後に、エージェントを上に移動させます。

    let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) }})

    Come back down

    エージェントが木のてっぺんに到達したら(前にブロックがなくなったら)、木の高さが変数heightに格納されることになる。 次に、エージェントが下に移動するときに、エージェントの前のブロック (木の幹) を破壊する別のループが必要でしょう。 このループは、木の高さと同じ回数だけ実行する必要があります。

    1. ||loops:LOOPS||から||loops:repeat||ループをドラッグして、||player:on chat command "chop"||||loops:while||ループの後にドロップしてください。

    2. ||variables:VARIABLES||からheightをドラッグして、||loops:repeat||ループの4を入れ替えます。

    let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) } for (let i = 0; i < height; i++) { }})

    Chop while you drop

    この時点でエージェントは木のてっぺんに立っていると思われます。

    1. ||agent:AGENT||から||agent:move||||agent:destroy||||loops:repeat||ループの中に配置します。 エージェントは下に移動する必要があり、目の前にある木の各パーツを切り刻みます。
      1. ||agent:move||ブロックで、方向としてdownを選択します。 エージェントが下に移動します。 そして、エージェントが手前にある木のブロックを破壊するはずです。 ||agent:destroy||はデフォルトの設定でOKです。

      最後に、刻んだ木材をすべて回収します。

      1. ||agent:AGENT||から、||loops:repeat||ループの後に||agent:agent collect all||を配置します。 これで、"chop"に対する||player:on chat command||の最後のブロックになりました。

      プログラムの完成

      let height = 0player.onChat("tp", function () { agent.teleportToPlayer()})player.onChat("lt", function () { agent.turn(TurnDirection.Left)})player.onChat("chop", function () { height = 0 while (agent.detect(AgentDetection.Block, FORWARD)) { height += 1 agent.destroy(UP) agent.move(UP, 1) } for (let i = 0; i < height; i++) { agent.move(DOWN, 1) agent.destroy(FORWARD) } agent.collectAll()})

      共有プログラムです。 https://makecode.com/_1hFLi6X1qPcJ

      Agent - Tree Chop Start Prep

      Agent - Tree Chop Start Correct Facing

      Agent - Tree Chop Finish

      課題

      ||player:on chat command "chop"|| としてエージェントにテレポートさせると良いのではと思うのですけれども。 エージェントをテレポートさせた後、エージェントがどの方向を向いているか予測するのは難しいです。 方向コマンド(”tp “と “lt”)は機能しますが、1つのコマンドの方が効率的です。

      これを自動化することはできますか? この2つの課題をクリアすると、実現できるはずです。

    2. エージェントを木の根元を見つけるまで回す。
    3. 登り始め、すでに作成したコードを実行する。 低い枝は取り除く必要があるかもしれません。

      Challenge 1 – Teleport Agent and Get Some Things Set Up for Challenge 2

      1. ||player:on chat command "chop"|| の一部としてエージェントをテレポートさせることはできますか?

      その後、Challenge 2 を達成するためにいくつかのものが必要になるでしょう。 以下を作成してください:

      1. TurnToTreeという変数を作成し、これをtrueに設定します。

      2. エージェントを左または右に旋回させるwhileループを作成する。

      コードをテストしてください!

      何が起こったのでしょうか? いやはや、また無限ループに陥っていますね。 TurnToTreetrue ですので、新しい while ループが延々と続いているのです。 したがって、あなたのエージェントは、ただひたすら回転し続けます。

      Stop Code

      これを停止する方法を以下でお読みください。

      無限ループに捕まった場合は、コード接続ウィンドウからコードを停止する必要があります。

      1. コード接続ウィンドウの左下にある停止ボタンをクリックします。

      コードの停止

      1. コーディング環境を再スタートします。 再生ボタンをクリックします。 再生ボタンがついていない場合、あなたのコードは Minecraft で実行されません。

      Play

      1. 再びコードを保存すると、コードも再開できるので、念のためそうしておいてください。 もう一回保存して、警告メッセージに「はい」と答えてください。

      Save

      Save Confirm

      これでチャレンジ2の準備はOKですが、エージェントが木を見て停止する方法を考えなければなりません。

      チャレンジ2 – エージェントを自動的に木に向かわせる

      これで2番目の課題を解く準備ができました。

      1. エージェントを木の根元を見つけるまで回す

      これを行うには while ループ内で TurnToTreefalse にする必要がありますが、このためには条件を設定する必要があります。 エージェントは木を見つけたら停止するようにしたいのです。

      エージェントにfindブロックはありませんが、detectブロックはあります。 これは便利かもしれませんね。

      Save Confirm

      このブロックは、エージェントが指示した方向のブロックを検出したり見つけたりするとtrueまたはfalseを返します。

      この状態をテストして、エージェントの旋回を停止するにはどうしたらよいでしょうか。 TurnToTreefalse にする必要がありますが、どこでどのようにするのでしょうか?

      実験

      ここでは、ルールはありません…それぞれの実験のコードをコピーして、どんな結果が得られるかいろいろ変えてみてください。 提案はされていますが、好きなようにやってください!

      実験1 穴を大きくする

      エージェントはあなたのためにがんばってくれる! あなたのために掘ってもらうこともできます。 チャットでdig 4と入力すると、このコードが表示されます。

      エージェントに掘らせると同時に、何かを置くことができますか? 穴の大きさを大きくすることはできますか? 今は2×2ですが、エージェントに4×4の穴を掘らせ、下に行くほど金を並べることができるかもしれません。

      Agent - Dig 4

      実験2 – 迷路を作る

      この実験コードは、トンネル型ロボットを作るためのコードをどう作るかを考えてもらうことが目的です。 エージェントは今回、2つの番号を受け付けます。 まず、下に掘り、次に水平に掘ります。

      このコードを試すために、オンチャットコマンドdig 5 4を入力します。

      どのようにしてエージェントに地下迷路を作らせることができたのでしょうか? この地下の穴を掘ることで、他にどんなことができるでしょうか? 溶岩で埋めたり、モブを置いたり、地下に家を作ったりすることもできます。 このようなことを行うために、他にどのようなコードがありますか。

      Agent Digs Down and Horizontally

コメントを残す

メールアドレスが公開されることはありません。