マインクラフト JavaScript

やりたいこと  
1.エージョンがいるポジションに三つのブロックを縦に並べる  
2.二歩進んで、再度同じブロックをエージョンとの位置に縦に並べる  
3.2を繰り返しながら四角5×5になるように一周したい

□□□□□  
□ □  
□ □  
□ □  
□□□□□  
上記のような形にしたい  
なぜかエージェントが途中までで止まってしまう。  
なぜかわかるかたご教授ください。

```

    let l_stones: number[] = []
    let index = 0
    let A0: Position = null
    player.onChat("comehere", function () {
        agent.teleportToPlayer()
    })
    player.onChat("1", function () {
        for (let index2 = 0; index2 < 4; index2++) {
            _1()
        }
    })
    function _1 () {
        l_stones = [STONE, GRASS, WOOL]
        for (let index2 = 0; index2 < 5; index2++) {
            index = 0
            A0 = agent.getPosition()
            for (let index2 = 0; index2 < l_stones.length; index2++) {
                blocks.place(l_stones[index], positions.add(
                A0,
                pos(0, index, 0)
                ))
                index += 1
            }
            agent.move(FORWARD, 2)
        }
        agent.turn(RIGHT_TURN)
    }
    
```
CC BY-SA 4.0
2022-11-11T13:20:20.933
92167
2022-11-12T10:45:55.323
51199
question
javascript
マインクラフトで５×５の縦ブロックポールを作りたい
[Code Connection for Minecraft](https://apps.microsoft.com/store/detail/code-
connection-for-minecraft/9PPFPG2FG2QB)([Microsoft
MakeCode](https://www.microsoft.com/ja-jp/makecode)) の質問だという前提で回答します。

大きく2つの問題

  * アルゴリズムの問題
  * Minecraft実行環境上の問題

があるようです。

* * *

まず1つめの、正方形を作るアルゴリズムについてですが、1辺を作る作業は、

  * 2歩進んで、そこにブロックを3つ積む

というのを(5回ではなく)4回繰り返すことになります。  
その後、右を向いて同じ作業を行う、これを4辺分行えば完成です。

つまり、今回行う手続きは次の通りです。  
(紙に書きながら考えてみると理解しやすいかと思います)

  * 次の作業を4回(4辺分)繰り返す 
    * 次の作業を4回(4柱分)繰り返す 
      * 2歩進み、ブロックを3個積む
    * 右を向く

JavaScript に変換すると、次のような感じになります。

```

    player.onChat("1", function () {
      // 4辺分繰り返す
      for (let side = 0; side < 4; side++) {
        _1();
      }
    });
    
    function _1() {
      // 4柱分繰り返す
      for (let pole = 0; pole < 4; pole++) {
        // 2歩進む
        agent.move(FORWARD, 2);
        let A0 = agent.getPosition();
        // 3ブロック(l_stones.length)積む
        for (let i = 0; i < l_stones.length; i++) {
          blocks.place(l_stones[i], positions.add(A0, pos(0, i, 0)));
        }
      }
      // 右を向く
      agent.turn(RIGHT_TURN);
    }
    
```

なお、質問文中コード内の `index2`
のように、別の意味の変数に同じ名前を付けたり、役割を類推しづらい命名を行うと混乱の元になるので、避けた方が良いでしょう。

* * *

次に2つめのMinecraft実行環境上の問題について。  
今回のコードでは、エージェントが立っている位置にブロックを置いていますが、そうするとエージェントがブロックに埋まってしまい想定通りに進まなくなる状況が発生するようです。

こちらは設問者の要求に応じて工夫する必要があります。  
次のコードサンプルでは、ブロックを縦方向に1ブロックずらして積む(空中に積む)ことでエージェントとの衝突を避けています。

```

          blocks.place(l_stones[i], positions.add(A0, pos(0, i + 1, 0)));
    
```

* * *

上記をまとめると、全体としては次のようになります。

```

    let l_stones = [STONE, GRASS, WOOL];
    
    player.onChat("comehere", function () {
      agent.teleportToPlayer();
    });
    
    player.onChat("1", function () {
      // 4辺分繰り返す
      for (let side = 0; side < 4; side++) {
        _1();
      }
    });
    
    function _1() {
      // 4柱分繰り返す
      for (let pole = 0; pole < 4; pole++) {
        // 2歩進む
        agent.move(FORWARD, 2);
        let A0 = agent.getPosition();
        // 3ブロック(l_stones.length)積む
        for (let i = 0; i < l_stones.length; i++) {
          blocks.place(l_stones[i], positions.add(A0, pos(0, i + 1, 0)));
        }
      }
      // 右を向く
      agent.turn(RIGHT_TURN);
    }
    
```
CC BY-SA 4.0
2022-11-12T10:31:20.127
92184
2022-11-12T10:45:55.323
2022-11-12T10:45:55.323
2808
2808
92167
answer