【作り方解説】教育版マインクラフトのメイクコード(MakeCode)で迷路を自動で作ってみた!迷路攻略法のコードもあり!

教育版マイクラのメイクコード(MakeCode)迷路を自動で作ってみました。また、自動で迷路を解く方法も作りました。
メイクコード(MakeCode)で、エージェントに迷路を作らせるプログラムを作りました。実際に、迷路を作る過程が見れるので面白いと思います。迷路自動生成では穴掘り法、迷路攻略法では左手の法則を利用しました。また、Pythonのコードについても本ページに記載しました。

MakeCodeプログラミングで自動で迷路を作るやり方

 

マイクラ:自動で迷路を作るやり方

STEP.1
クリエイティブモード

クリエティブモード、世界のタイプはフラットでワールドを作る。

STEP.2
メイクコードを立上げ、読み込むボタン押下

パソコンのキーボードのCキー(タブレットの場合はエイジェントアイコン)を押して、メイクコード(MakeCode)を立ち上げ、「読み込み」ボタンをクリックする。
注意)メイクコード(MakeCode)for minecraftは教育版マインクラフトでのみ利用が可能です(2023年8月時点での情報)。

STEP.3
「URLから読み込む」ボタン押下

URLから読み込む」ボタンをクリックし、自動迷路作成のコードのURL(https://minecraft.makecode.com/_bKqc0HVdkPfp)をコピーしてペーストする。

STEP.4
MakeCodeが開いたら実行

自動迷路作成のメイクコード(MakeCode)プロジェクトが立ち上がったら、画面右下の実行ボタンをクリックする。

STEP.5
MakeCodeが開いたら実行

自動迷路作成用のコードが実行され、「迷路自動生成!」というタイトル文、「コマンドmazeMake -> 鉄シャベル -> リンゴ(リセットは鉄延べ棒)というサブタイトルが画面に表示される。

STEP.6
MakeCodeで作ったコマンド実行

パソコンのTキーを押してチャットウィンドウが開いたら、MakeCodeで作ったコマンド「mazeMake」を入力して実行する。

注意)MakeCodeで作ったコマンドでは、コマンドの先頭に「/(スラッシュ)」は入力しないでください。「/(スラッシュ)」は、mainecaraftが提供されているコマンドを実行するときに必要です。

STEP.7
迷路の土台が作成


MakeCodeで作ったコマンド「mazeMake」を実行すると、迷路の土台が作成される。

STEP.8
Agentをスタート地点へ

鉄のシャベルを持って右クリック(タブレットの場合は長押し)すると、Agentが迷路を作る際のスタート地点にテレポートする。

STEP.9
迷路が自動で作成される


りんごのシャベルを持って右クリック(タブレットの場合は長押し)すると、Agentが「穴掘り法」という迷路作成のアルゴリズムで迷路を自動作成する。

STEP.10
鉄の延べ棒でAgentを移動

Agentが穴掘り法により迷路を自動作成するが、Agentがこれ以上迷路を作れない状態になったら、Agentを移動させたい場所に移動してから鉄のシャベルを右クリック(タブレットの場合は長押し)する。その場所にAgentがテレポートされるので、リンゴをを右クリック(タブレットの場合は長押し)して迷路を作成を再開させる。

STEP.11
迷路が完成

STEP11を何度か繰り返すと迷路が完成する。

STEP.12
迷路が完成したらAgentと競争

ケーキを持って右クリック(タブレットの場合は長押し)すれば、Agentが左手の法則というアルゴリズムに従い迷路を抜けるので、プレイヤーとどちらが早くゴールに到着するか競争するゲームも出来る。

メイクコード(MakeCode)のソース

 

初期設定のコード
  1. プログラムスタート後に実行される。
  2. 「迷路自動生成!」というタイトル文とサブタイトルを表示。
  3. 迷路の土台を生成する際に必要な変数「始点」と変数「終点」に、ワールド座標(10, -60, 10)とワールド座標(30, -59, 30)を代入する。
    ※迷路土台の縦横のブロック数はともに奇数個にする必要がある。穴掘り法では、奇数個にしないと迷路が作れないので注意。
  4. チャット欄で実行したコマンドのフィードバック(ログ)が画面に表示さなくなる。
  5. 迷路自動生成で必要となる、鉄のシャベル、鉄の延べ棒、りんごをプレイヤーに与える。
  6. プレイヤーをワールド座標(0, -60, 0)にテレポートさせる。
    ※処理3で生成する迷路の土台の近くにプレイヤーもテレポートさせている。

迷路の土台を作るコマンドド
  1. チャットコマンド「mazemake」を入力されると実行される。
    マイクラのコマンドを入力するときは「/(スラッシュ)」をコマンドの最初に入力する必要があるが、メイクコード(MakeCode)で作ったコマンドを入力するときは「/(スラッシュ)」は必要ない。
  2. 初期設定で保存した変数「始点」のワールド座標から変数「終点」のワールド座標までをクォーツのブロックで設置。

迷路生成のスタート地点にエージェントを移動する
  1. 鉄のシャベルを持って右クリックすると実行する。
  2. 迷路の土台の端から東南に1ブロックの地点(今回のプログラムでは11, -58, 11)にエージェントをテレポートさせる。
  3. エージェントの下のブロック2つを破壊し、地面と同じ高さに移動する。
穴掘り法で迷路を作る際の注意点

注意)穴掘り法で迷路を作る際には、迷路の土台となるブロックの数は奇数個でなければならない。また、土台の端を1番目とカウントしたとき、迷路を作り始めるスタート地点は偶数番目にしなければ迷路を生成することが出来ない。

 

穴掘り法で迷路を生成する
  1. リンゴを持って右クリックで実行する。
    ※以下の処理は穴掘り法のアルゴリズムをベースとしている。穴掘り法のアルゴリズムについては、「穴掘り法 アルゴリズム」でWeb検索すると多くの情報を参照することができる。
  2. 変数「作成終了」を0にリセットする。
  3. 変数「作成終了」が0の間、下記処理4~10を実行し続ける。
  4. リスト変数「チェックする向き」に「-1」「0」「1」をランダムに並び替えて代入する。
    ※後に説明する関数「リストをランダム化」により、リストの値をランダムに並び替えている。
  5. 処理6~10を3回まで繰り返す。
  6. エージェントの向きを、前、左、右のいずれかにする。
    ※後に説明する関数「向きを変える」により、リスト変数「チェックする向き」に保存されている値を引数としてエージェントの向きを変える。もしも、リスト変数「チェックする向き」が「0」「-1」「1」の並びで保存されていれば、1回目のループではエージェントは向きを変えず、2回目のループでは左を向き、3回目のループでは右を向く。
  7. エージェントの2ブロック前にブロックがあるか確認するために1ブロック前に進む。
    ※エージェントは接している面のブロックしか存在確認できないので、後に説明する関数「2ブロック前確認」により、エージェントを1ブロック前に進ませる。
  8. 処理7により1歩前に進んだエージェントの前(つまり処理6の時点でのエージェントの2ブロック前)にクオーツのブロックがあれば、一旦1ブロック下がって処理6の時点での位置に戻ってから、2ブロック先までブロックを破壊して道を作る。道を作った後は、繰り返しループを抜ける。
  9. もしも、処理7により1歩前に進んだエージェントの前(つまり処理6の時点でのエージェントの2ブロック前)が空気ブロックなら、一旦1ブロック下がって処理6の時点での位置に戻ってから、エージェントの向きを処理6の時点の向きに戻す。
    ※ここ呼び出す「向きを変える」関数の引数は、処理6の時点で向きを変えたときの引数の符号を反転させている。関数「向きを変える」では引数が「-1」のときは左、「1」のときは右を向くので、符号を反転すれば処理6で左を向いた後は処理9により右を向いて元の向きに戻り、処理6で右を向いた後は処理9で左を向いて元の向きに戻るようになる。
  10. 2ブロック前が空気ブロックだったときに、ループカウンターの値が2であれば、左、前、右の2ブロック先がすべてが空気ブロックだったことになるので、変数「作成終了」の値を1にして、処理3の繰り返しを終了する。

関数:リストの値をランダムに並び替える
  1. リストtempを初期化する。
  2. 引数として受け取ったリストlistの0から2番目のいずれかのインデックスの値を、リストtempの0番目に代入する。代入した値はリストlistから削除する。
  3. リストlistの0から1番目のいずれかのインデックスの値を、リストtempの1番目に代入する。代入した値はリストlistから削除する。
  4. リストlistの0番目の値を、リストtempの2番目に代入する。代入した値はリストlistから削除する。
  5. リストtempを返す。

関数:エージェントの向きを変える
  1. 引数として受け取った変数「向き」の値が1ならエージェントは左に向きを変える。
  2. 変数「向き」の値が-1ならエージェントは右に向きを変える。

関数:2ブロック前を確認するための1ブロック前進する
  1. エージェントの1つ前にブロックがあるときは、そのブロックを破壊して1ブロック前に進み、「2ブロックチェック壊した」というフラグ用変数を1にする。
    ※エージェントの2ブロック先を確認するために、エージェントを1つ前に移動させる必要がある。ここでのブロック破壊は、2ブロック前をチェックするための破壊なので、破壊したブロックを元に戻す必要がある。後に説明する関数「戻る」において、「2ブロックチェック壊した」というフラグ用変数が1ならブロックを元に戻すことになる。
  2. もしも1ブロック前にブロックがなければ、1ブロック進む。

関数:2ブロック前確認で前進したエージェントを元に戻す
  1. 「2ブロックチェック壊した」というフラグ用変数が1のときは、2ブロック先の確認のために1つ前のブロックを削除しているので、1ブロック後ろに戻った後にブロックを置いてを元に戻す。
  2. 「2ブロックチェック壊した」というフラグ用変数が0のときは、1ブロック後ろに戻る。
  3. 「2ブロックチェック壊した」の値を0に戻す。

エージェントを再配置する
  1. 鉄の延べ棒(鉄のインゴット)を持って右クリックすると実行する。
  2. エージェントがプレイヤーの位置にてレポートして、左を向く。
    ※りんごを使った穴掘り法により、エージェントが穴を掘れない状態になった場合に、穴を掘れる場所にプレイヤーが移動して鉄の延べ棒を使いエージェントの場所を変える。エージェントの向きを変えたければ、同じ魔書で鉄の延べ棒を使い、エージャントを左に90度ずつ向きを変えることが出来る。穴掘り法を開始出来る場所にエージェントを移動できたら、りんごを使って穴掘り法を再開しよう。

迷路攻略法「左手の法則」
  1. ケーキを持って、右クリックすると実行。
  2. エージェントとプレイヤーをワールド座標11, -60, 10にテレポートする。
  3. 「迷路ゲームスタート!」「エージェントより早くゴールせよ!」といタイトルを表示する。
  4. エージェントは左手の法則によりゴールの金ブロックまで移動する。エージェントはゴールの金ブロックまで1ブロック前に移動し続ける。その間、もしも左に道があれば(空気ブロックがあれば)、左に向きを変えて進む、目の前が壁なら(クオーツのブロックなら)右に向きを変えて進む。これが左手の法則である。
    ※ゴールの金ブロックは手動で設置。スタート地点としたワールド座標「11, -60, 10」からもっとも離れた場所に設置するとよい。

メイクコード(MakeCode)のソース:Python

# チャットコマンド「mazeMake」で実行。初期設定で保存した始点から終点までをクォーツのブロックで設置。
def on_on_chat():
    blocks.fill(BLOCK_OF_QUARTZ, 始点, 終点, FillOperation.REPLACE)
player.on_chat(“mazeMake”, on_on_chat)
# 鉄のシャベルを持って右クリックで実施。迷路の土台の端から東南に1ブロックの地点にエージェンをテレポートさせ、下のブロック2つを破壊し、地面と同じ高さに移動。
def on_item_interacted_iron_shovel():
    agent.teleport(world(11, -58, 11), SOUTH)
    for index2 in range(2):
        agent.destroy(DOWN)
        agent.collect_all()
        agent.move(DOWN, 1)
player.on_item_interacted(IRON_SHOVEL, on_item_interacted_iron_shovel)
# リスト内の値「-1」「0」「1」をランダムに並べ替える。
def リストをランダム化(list2: List[number]):
    global temp
    temp = [0, 0, 0]
    temp[0] = list2.remove_at(randint(0, 2))
    temp[1] = list2.remove_at(randint(0, 1))
    temp[2] = list2.remove_at(0)
    return temp
# 変数「向き」の値が1ならエージェントは左に向きを変え、-1ならエージェントは右に向きを変える。
def 向きを変える(向き: number):
    if 向き == 1:
        agent.turn(LEFT_TURN)
    elif 向き == -1:
        agent.turn(RIGHT_TURN)
# エージェントの2ブロック先を確認するために、エージェントを1つ前に移動させる関数。エージェントの1つ前にブロックがあるときは、そのブロックを破壊して1ブロック前に進み、「2ブロックチェック壊した」というフラグを1にする。
def _2ブロック前確認():
    global _2ブロックチェック壊した
    if agent.detect(AgentDetection.BLOCK, FORWARD):
        agent.destroy(FORWARD)
        agent.collect_all()
        agent.move(FORWARD, 1)
        _2ブロックチェック壊した = 1
    else:
        agent.move(FORWARD, 1)
# エージェントの2ブロック先を確認するために、エージェントを1つ前に移動したあとに、元に位置にエージェントを戻す関数。「2ブロックチェック壊した」というフラグが1のときは、2ブロック先の確認のために1つ前のブロックを削除しているので、ブロックをもとに戻す。最後に「2ブロックチェック壊した」の値を0に戻す。
def 戻る():
    global _2ブロックチェック壊した
    if _2ブロックチェック壊した == 1:
        agent.move(BACK, 1)
        agent.place(FORWARD)
    else:
        agent.move(BACK, 1)
    _2ブロックチェック壊した = 0
# リンゴを持って右クリックで実行。穴掘り法のアルゴリズムをベースとしたコード。エージェントの2ブロック前が空気ブロックでなければ(クォーツのブロックなら)、2ブロック先まで道を作る(ブロックを破壊)。左、前、右の2ブロック先すべてが空気ブロックになるまで続ける。
def on_item_interacted_apple():
    global 作成終了, チェックする向き
    作成終了 = 0
    while 作成終了 == 0:
        チェックする向き = リストをランダム化([-1, 0, 1])
        for カウンター in range(3):
            向きを変える(チェックする向き[カウンター])
            _2ブロック前確認()
            if agent.detect(AgentDetection.BLOCK, FORWARD):
                戻る()
                for index in range(2):
                    agent.destroy(FORWARD)
                    agent.collect_all()
                    agent.move(FORWARD, 1)
                    agent.destroy(UP)
                    agent.collect_all()
                break
            else:
                戻る()
                向きを変える(-1 * チェックする向き[カウンター])
                if カウンター == 2:
                    作成終了 = 1
player.on_item_interacted(APPLE, on_item_interacted_apple)
# 鉄の延べ棒を持って右クリックで実行。エージェントをプレイヤーの位置に戻し、実行する度にエージェントは左に向きを変える。
def on_item_interacted_iron_ingot():
    agent.teleport_to_player()
    agent.turn(LEFT_TURN)
player.on_item_interacted(IRON_INGOT, on_item_interacted_iron_ingot)
# ケーキを持って右クリックすると実行。エージェントとプレイヤーを同じ位置にてレポートさせ、「迷路ゲームスタート!」というタイトルが表示された後、エージェントは左手の法則によりゴールの金ブロックまで移動。ゴールの金ブロックは、手動で設置。スタート地点としたワールド座標「11, -60, 10」からもっとも離れた場所に設置するとよい。
def on_item_interacted_cake():
    agent.teleport(world(11, -60, 10), SOUTH)
    player.teleport(world(11, -60, 10))
    gameplay.title(mobs.target(NEAREST_PLAYER),
        “迷路ゲームスタート!”,
        “エージェントより早くゴールせよ!”)
    while not (agent.inspect(AgentInspection.BLOCK, DOWN) == GOLD_BLOCK):
        agent.move(FORWARD, 1)
        if agent.inspect(AgentInspection.BLOCK, LEFT) == AIR:
            agent.turn(LEFT_TURN)
        if agent.detect(AgentDetection.BLOCK, FORWARD):
            agent.turn(RIGHT_TURN)
player.on_item_interacted(CAKE_ITEM, on_item_interacted_cake)
# 初期設定のコード。「迷路自動生成!」というタイトルを表示し、迷路の土台を生成する際に必要な始点と終点の座標を変数として保存。
チェックする向き: List[number] = []
作成終了 = 0
_2ブロックチェック壊した = 0
終点: Position = None
始点: Position = None
gameplay.title(mobs.target(NEAREST_PLAYER),
    “迷路自動生成!”,
    “コマンドmazeMake -> 鉄シャベル -> リンゴ(リセットは鉄延べ棒)”)
始点 = world(10, -60, 10)
終点 = world(30, -59, 30)
メイクコード(MakeCode)とは?

Microsoftが提供する、無料のプログラミング学習用プラットフォーム。MakeCodeエディターでは、ブロックを使ったビジュアルコーディング、PythonとJavaScriptによるテキストコーディングが可能。アプリやソフトウェアをインストールする必要はなく、https://makecode.microbit.org/にアクセスするだけで利用できる。
コンピューターボードmicro:bitを使ったプログラミングや、ゲームプログラミングなどが出来る。教育版マインクラフト、または、統合版マインクラフトにCode Connection for Minecraftをインストールすれば、MaCodeエディターでプログラミングもできる。