29
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonAdvent Calendar 2021

Day 2

マインクラフト上に迷路をPythonから自動生成して遊ぶ

Last updated at Posted at 2021-12-01

はじめに

マインクラフト上に迷路をPythonから自動で作成して遊ぶ方法について記載します。WindowsとMacの両方で実装が可能です。本記事の内容はYouTubeの動画としても投稿しているので、動画の方がわかりやすい方はYouTubeからご視聴ください。

準備

1. Javaのインストール

Javaをインストールします。以下の画面の「同意して無料ダウンロード開始」ボタンからインストーラーをダウンロードして、インストールしてください。

2. マインクラフトの購入

この記事ではマインクラフトのJava Editionを対象にしています。以下のリンクから、マインクラフトJava Editionを選択して購入してください。

購入が完了するとマインクラフトのインストーラーがダウンロードできるので、ダウンロードをしてください。

マインクラフトのサイトログインにはマイクロソフトアカウントが必要です。まだ持ってない方は作成してください。

mojikyo45_640-2.gif

3. マインクラフトのインストール

2.でダウンロードしたインストーラーを起動して、インストールします。起動に成功するとこんなマインクラフトのLauncherが起動します。もしもWindows PCでうまく起動しない場合、Microsoft Storeで [Minecraft Launcher] を検索してインストールしてください。また、Windows PCの場合Xboxのアカウントを作成するように促されるので、作成していない人は作成してください。

mojikyo45_640-2.gif

4. Forgeインストール

マインクラフトでMod (拡張機能パッケージ) を使うためのForgeというものをインストールします。今回、1.12.2のバージョンを使用します。以下のURLからインストーラーダウンロード画面を開いてください。

「Installer」のボタンを押してください。
mojikyo45_640-2.gif
広告が貼ってあるページの飛びます。5秒ほど待つと右上に「Skip」ボタンが表示されるので、「Skip」ボタンを押してインストーラーをダウンロードしてください。
mojikyo45_640-2.gif
Macの場合は、セキュリティとプライバシーのダウンロードしたアプリケーションの実行許可から開く必要があります。
mojikyo45_640-2.gif
Forgeのインストーラが起動したら、「Install Client」にチェックが付いていることを確認して、「OK」ボタンを押してインストールしてください。
mojikyo45_640-2.gif

5. RaspberryJamModのダウンロード

以下のサイトからRaspberryJamModのzipをダウンロードして解凍します。解凍したフォルダの中に1.12.2のフォルダがあって、その中のjarファイルが今回使用するModになります。

mojikyo45_640-2.gif

解凍したフォルダの中に1.12.2のフォルダがあって、その中のjarファイルが今回使用するModになります。

mojikyo45_640-2.gif

6. ワールドの作成

マインクラフトのLauncherを起動して、左のタブのJavaEditionタブを押して、上の起動構成タブを押すと、起動構成の画面が表示されます。

mojikyo45_640-2.gif Forgeのメニューボタンの[編集]ボタンを押します。 mojikyo45_640-2.gif 起動構成の編集画面から、ゲームディレクトリの参照ボタンを押して、適当な空フォルダを作って、そのフォルダを選択します。これで保存します。このゲームディレクトリはメモをしておいてください。 mojikyo45_640-2.gif 起動構成の画面からプレイを押してマインクラフトを起動させます。 mojikyo45_640-2.gif そうすると、こんな画面が表示されてマインクラフトが起動するので、左下に[forge]が記載されていることを確認したら、一旦マインクラフトを終了します。 mojikyo45_640-2.gif そして、先ほどメモしたゲームディレクトリの中に[mods]というフォルダができているので、そのフォルダの中に5.の手順でダウンロードしたmodのjarファイルを入れます。 mojikyo45_640-2.gif もう一度、マインクラフトのLauncherを起動して、左のタブのJavaEditionタブを押して、上の起動構成タブを押して、Forgeの[プレイ]ボタンを押して、マインクラフトを起動します。起動した画面の[Mods]ボタンを押します。 mojikyo45_640-2.gif この部分に「Rasberry Jam Mod」って書いてあればOKです。「Done」を押して戻ってください。 mojikyo45_640-2.gif Singleplayerをクリックして、ワールドを選択する画面に移動してください。 mojikyo45_640-2.gif Create New Worldボタンを押してください。 mojikyo45_640-2.gif ワールドの名前を適当につけて、クリエイティブモードに変更して、ワールドを作成してください。 mojikyo45_640-2.gif これで、マインクラフト側の準備は完了しました。 mojikyo45_640-2.gif

Escキーを押して、一旦、ゲームを抜けてください。

迷路を作る

1. mcpiをインストール

今度はPython側のライブラリmcpiをインストールします。

pip install mcpi

mcpiの動作確認として、Pythonからマインクラフトのワールドにチャットを投稿をします。

from mcpi import minecraft

def main():
    # マインクラフトのオブジェクト作成
    mc = minecraft.Minecraft.create()
    # チャットを投稿
    mc.postToChat('Hello Minecraft World!')

if __name__ == '__main__':
    main()

このコードを実行したのち、マインクラフトのゲームに戻ると、以下のようにpostToChatに指定した文字列が投稿されているのが確認できます。
mojikyo45_640-2.gif

2. 迷路用の平なスペースを作る

迷路用のスペースを作ります。デフォルトの状態だと、地表が凸凹していて迷路が作りづらいので、平なスペースを確保します。

  1. マインクラフトはx座標が東西、y座標が高さ、z座標が南北を表しているので、まずプレーヤをmc.player.setPos(0, 1, 0)で、x 座標が 0 , y 座標 1 , z 座標 0 に移動します。
  2. mc.setBlocks()でプレーヤーの周りのスペースにあった不要なブロックを削除します。block.AIRを使うと何もないブロックが配置されるので、元あったブロックは削除されます。mc.setBlocks()は第一引数〜第三引数が、ブロックを配置する開始位置で、第四引数〜第六引数がブロックを配置する終了位置です。その開始位置から終了位置まで全てブロックが敷き詰められます。 第七引数にブロックの種類を指定します。
  3. mc.setBlocks()でプレーヤーの周りのスペースに草を敷き詰めて、平なスペースを作ります。ブロックの種類はblock.GRASSにします
from mcpi import minecraft


def main():
    mc = minecraft.Minecraft.create()

    # 1. プレーヤを移動
    mc.player.setPos(0, 1, 0)

    # 2. 不要なブロックを削除
    mc.setBlocks(
        -3, 0, -3,
        50, 50, 50,
        block.AIR
    )

    # 3. 草のブロックで平なスペースを作成
    mc.setBlocks(
        -3, 0, -3,
        50, 0, 50,
        block.GRASS
    )

これをPythonで実行して、またゲームに戻ると、このような平なスペースができています。

mojikyo45_640-2.gif

3. mazelibライブラリをインストール

迷路を自動生成するmazelibというライブラリをインストールします

pip install mazelib

WindowsPCでmazelibがpipでインストールできない場合はMicrosoft Visual C++をインストールして、再度pip install を試してみてください。

4. 迷路をPython上で生成する

一旦、マインクラフト用のスクリプトとは別に、mazelibの動作を確認するためのPythonスクリプトを用意して、Primsクラスを使って迷路を生成します。

以下のコードを動かすと、迷路を表した文字列が表示されます。

from mazelib import Maze
from mazelib.generate.Prims import Prims


N = 5 # 縦の通路の数
M = 5 # 横の通路の数

mz = Maze()
mz.generator = Prims(N, M)
# 迷路生成
mz.generate()

# スタートとゴールのマークを設置
mz.start = (0, 1)
mz.end = (N * 2, M * 2 - 1)

print(mz)

#の部分が壁で、Sが迷路のスタート、Eが迷路のゴールです。この文字列から、どのマークがマインクラフト上のx座標とz座標に該当するかマッピングして、#ならブロックを置いて、#以外ならブロックを置かないようにしたら、迷路が作れそうです。

#S#########
# #       #
# # ### ###
#   #     #
# ##### # #
#     # # #
# # ##### #
# #     # #
# # ##### #
# #   #   #
#########E#
```




## 5. 迷路をマインクラフト上に作成する
3.で平なスペースを作った上に、4.で生成した迷路の文字列をもとにしてブロックを置いて迷路を作ります。`put_maze_block`関数はマークが`#`なら座標にブロックをおく関数です。文字列を改行コードでsplitして、1行ずつ、どの位置にどのマークかを調べることでx座標とz座標とマークを取得することができます。

```python3
from mazelib import Maze
from mazelib.generate.Prims import Prims
from mcpi import minecraft, block

N = 5
M = 5
H = 2


def put_maze_block(mc, mark, x_pos, z_pos):
    # マークが#の座標にブロックを置く
    if mark == '#':
        mc.setBlocks(
            x_pos, 0, z_pos,
            x_pos, H, z_pos,
            block.STONE
        )


def main():

    mc = minecraft.Minecraft.create()
    mc.player.setPos(0, 1, 0)

    mc.setBlocks(
        -3, 0, -3,
        50, 50, 50,
        block.AIR
    )

    mc.setBlocks(
        -3, 0, -3,
        50, 0, 50,
        block.GRASS
    )

    mz = Maze()
    mz.generator = Prims(N, M)

    mz.generate()
    mz.start = (0, 1)
    mz.end = (N * 2, M * 2 - 1)
    maze_str = str(mz)
    maze_list = maze_str.split('\n')

    for z, mark_list in enumerate(maze_list):
        for x, mark in enumerate(mark_list):
            put_maze_block(mc, mark, x, z)


if __name__ == '__main__':
    main()
```

これを実行してマインクラフトのワールドに戻ると迷路が作成できています。

<img width="450" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/980200/e1c62ba1-c431-7677-25fa-68368b31f77f.png">

定数で持っている`M`(迷路の縦の通路数)と`N`(迷路の横の通路数)と`H`(迷路の壁の高さ)をもっと大きいものにすると、本格的な迷路が作れます!

また、mazelibで迷路を生成するときに乱数を使っているため、毎回違う迷路が作成できます。スクリプトを動かせば、何度も違う迷路ができて飽きないですね!(いや、飽きるでしょうね...)

# おわり
マインクラフトをPythonから操作できるということで、迷路を作ってみました。アイディア次第で、いろんな建物が作れて面白そうです。

今回はv1.12.2で作りましたが、v1.16.5でも動くモジュールもあります!ぜひ、使ってみてください!!

https://github.com/Naohiro2g/minecraft_remote

また、普段はPythonの初心者向けに基本的な文法の解説などをYouTube上で配信しているので、よければ見てみてください😊

https://www.youtube.com/channel/UC5Kgc_HNzx4GJ-w4QMeeKiQ


29
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?