殿堂入り記事

子供にマインクラフト使ったPythonプログラミングを教えようとしたらChatGPT使ったプログラミング不要な世界を体験させちゃった

2023.03.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、会社ではCX事業本部モダンオフショア推進担当、家庭では3児の父親の藤村です。

IT業界で働く親として、子供には幼い頃からプログラミングに親しんでもらいたいと思い、時々Scratchを使った簡単なプログラミングなどを教えていたのですが、ちょっとすると「友達とゲームする時間だから止めるね!」といって、友達とのNintendo Switch使ったオンラインゲーム(FortniteやMinecraftなど)をやり始めてしまい、親としては少し残念な気持ちになっていました。

そんな時に、『マインクラフトでわくわく学ぶ!Pythonプログラミング入門』という書籍が最近発売されたことを知りました。

マインクラフトでPythonを学ぶ!これは息子にドンピシャの内容だと思い、早速書籍を購入。 まずは環境構築から始めてみました。

環境構築

書籍を参考に、以下の手順で環境を構築してみました。

  1. Javaのインストール
    • Java版のMinecraftを動かすために、OracleのサイトからJavaをダウンロード&インストール
  2. Minecraftのインストール
    • MinecraftのサイトからJava版のMinecraftをダウンロード&インストール
    • Minecraftのライセンスは購入済みのため再度ダウンロードから実施
  3. Thonnyのインストール
    • 書籍の指示に従って、PythonのエディターのThonnyをダウンロード&インストール
  4. Forgeのインストール
    • MinecraftでプログラミングするためにForgeをダウンロード&インストール
    • 書籍の指示に従い、バージョンは1.12.2を選択
  5. Raspberry Jam Modの導入
    • MinecraftをPythonでプログラミングするためのRaspberry Jam MODを導入
    • ダウンロードしたRaspberryJamMod.jarをmodsフォルダに格納
  6. mcpi(Minecraft: Pi edition API Python Library)の導入
    • Thonnyのツール→パッケージを管理からmcpiを検索&インストール
  7. Pythonの実行ファイルをRaspberry Jam Modに設定
    • Thonnyのツール→オプションでPythonの実行可能ファイルのパスをコピーし、Raspberry Jam ModのConfig内のPython InterpreterにペーストしてDone

これで、Minecraftのコマンドから、任意のプログラムを実行できる環境が整いました。

/py [Pythonファイル名]

ChatGPTに雑に聞いてみた

準備も整い、いよいよPythonの基本的な書き方を教えようとした際に、私からふと、「最近出たChatGPTっていうAIはプログラミングもできちゃうから、今後プログラミングを学ぶ必要もなくなっちゃうかもしれないよ」って言ったら、「それやってみようよ!」と息子が言うので、試しにChatGPTに雑に聞いてみました。

「mcpiでMinecraftから呼び出せるプログラムを書いて」

出力されたコードは以下となります。

from mcpi.minecraft import Minecraft
from mcpi import block

def create_pyramid(mc, x, y, z, size, material):
    while size > 0:
        for i in range(size):
            for j in range(size):
                mc.setBlock(x + i, y, z + j, material)
        
        x += 1
        z += 1
        y += 1
        size -= 2

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # ピラミッドの基点を設定
    x, y, z = player_pos.x + 1, player_pos.y, player_pos.z + 1

    # ピラミッドのサイズを設定
    pyramid_size = 21

    # ピラミッドを作成(サンドストーンブロック)
    create_pyramid(mc, x, y, z, pyramid_size, block.SANDSTONE)

それっぽいコードが出た!しかもピラミッドの作成は、『マインクラフトでわくわく学ぶ!Pythonプログラミング入門』では"第8章 より複雑な建物をつくろう"で説明されている応用編の内容!

そんな簡単にいくわけないよなーと思いながらも、create_pyramid.pyという名前で保存し、Minecraftで以下を実行してみたところ、、、。

/py create_pyramid

できたー!めっちゃ簡単にできたー!これには息子も大興奮!

ChatGPTに具体的にお願いしてみた

「具体的にMinecraftで実現したいことをChatGPTに聞いてみな」と言って息子に交代。息子が書いたプロンプトと実行結果は以下の通り。

mcpiで、プレイヤーの周りに、花火を打ち上げるプログラムを書いて

出力されたコードは以下となります。

import random
import time
from mcpi.minecraft import Minecraft
from mcpi import block

# TNTブロックを起爆する関数
def ignite_tnt(mc, x, y, z):
    mc.setBlock(x, y, z, block.TNT.id, 1)

# プレイヤーの周りにTNTブロックを配置し、起爆する関数
def create_explosions(mc, x, y, z, count):
    for _ in range(count):
        dx = random.randint(-5, 5)
        dy = random.randint(0, 5)
        dz = random.randint(-5, 5)

        mc.setBlock(x + dx, y + dy, z + dz, block.TNT.id)
        ignite_tnt(mc, x + dx, y + dy, z + dz)

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # TNTブロックの数を設定
    tnt_count = 10

    # TNTブロックを配置し、起爆
    create_explosions(mc, player_pos.x, player_pos.y, player_pos.z, tnt_count)
    mc.postToChat("TNTが爆発します!")
    time.sleep(2)
    mc.setBlock(player_pos.x, player_pos.y, player_pos.z, block.AIR.id)
    mc.postToChat("爆発が終了しました。")

それっぽいコードが出力されたー。MCPIでは花火を扱えないとのことで、TNTを使った代替案を提示しているところがさらに素晴らしい。無理ですで終わらせないこの姿勢は人間のエンジニアもぜひ見習いたいところ。

期待に胸を膨らませて、コードを保存&実行!

ちゃんとTNTがプレイヤーの周りに配置された!けど、、、爆発しなーーーい!

「爆発しなかったよ」と息子が言うので、「ChatGPTに修正してもらいなよ」と私。

続いて息子が書いたプロンプトと実行結果は以下の通り。

TNT爆弾は配置されたのですが、爆発しませんでした。爆発させて。

こんな雑なお願いでデバッグできるんだろうか…。

import random
import time
from mcpi.minecraft import Minecraft
from mcpi import block

# プレイヤーの周りにTNTブロックを配置し、起爆する関数
def create_explosions(mc, x, y, z, count):
    for _ in range(count):
        dx = random.randint(-5, 5)
        dy = random.randint(0, 5)
        dz = random.randint(-5, 5)

        mc.setBlock(x + dx, y + dy, z + dz, block.TNT.id)
        mc.setBlock(x + dx + 1, y + dy, z + dz, block.REDSTONE_BLOCK.id)  # TNTを起爆するために隣接するレッドストーンブロックを設置

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # TNTブロックの数を設定
    tnt_count = 10

    # TNTブロックを配置し、起爆
    create_explosions(mc, player_pos.x, player_pos.y, player_pos.z, tnt_count)
    mc.postToChat("TNTが爆発します!")
    time.sleep(2)
    mc.postToChat("爆発が終了しました。")

「レッドストーンブロックで起動できるのか?」という疑問も持ちつつ、保存&再実行したところ、実行時エラー。

[ERR]AttributeError: module 'mcpi.block' has no attribute 'REDSTONE_BLOCK'.Did you mean: 'GLOWSTONE_BLOCK'?

Pythonデバッガーは、'REDSTONE_BLOCK'じゃなくて'GLOWSTONE_BLOCK'ではと言ってるけど、そういう問題ではなさそう…。

「どうすればいいの?」と息子から聞かれたので、「まずはエラーの内容を伝えてみれば?」と私。

そこで息子が書いたプロンプトと実行結果は以下の通り。

GLOWSTONE_BLOCKの間違えではないかと言われてしまいました。

import random
import time
from mcpi.minecraft import Minecraft
from mcpi import block

# プレイヤーの周りにTNTブロックを配置し、起爆する関数
def create_explosions(mc, x, y, z, count):
    for _ in range(count):
        dx = random.randint(-5, 5)
        dy = random.randint(0, 5)
        dz = random.randint(-5, 5)

        mc.setBlock(x + dx, y + dy, z + dz, block.TNT.id)
        mc.setBlock(x + dx + 1, y + dy, z + dz, block.GLOWSTONE.id)  # TNTを起爆するために隣接するGLOWSTONEブロックを設置

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # TNTブロックの数を設定
    tnt_count = 10

    # TNTブロックを配置し、起爆
    create_explosions(mc, player_pos.x, player_pos.y, player_pos.z, tnt_count)
    mc.postToChat("TNTが爆発します!")
    time.sleep(2)
    mc.postToChat("爆発が終了しました。")

素直にGLOWSTONE_BLOCKを採用せずに、GLOWSTONEを使うところにやや負けず嫌いなところを感じる。

保存&再実行したところ、再度実行時エラー。

[ERR]AttributeError: module 'mcpi.block' has no attribute 'GLOWSTONE'

これはある意味予想されたエラー。

「素直にGLOWSTONE_BLOCKを使えば良いんだよ。」とChatGPTに断言する息子。当初の目的であったTNT花火から離れてきた。

GLOWSTONEではなく、GLOWSTONE_BLOCKが正しいです

import random
import time
from mcpi.minecraft import Minecraft
from mcpi import block

# プレイヤーの周りにTNTブロックを配置し、起爆する関数
def create_explosions(mc, x, y, z, count):
    for _ in range(count):
        dx = random.randint(-5, 5)
        dy = random.randint(0, 5)
        dz = random.randint(-5, 5)

        mc.setBlock(x + dx, y + dy, z + dz, block.TNT.id)
        mc.setBlock(x + dx + 1, y + dy, z + dz, block.REDSTONE_TORCH_ON.id)  # TNTを起爆するために隣接するREDSTONE_TORCH_ONを設置

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # TNTブロックの数を設定
    tnt_count = 10

    # TNTブロックを配置し、起爆
    create_explosions(mc, player_pos.x, player_pos.y, player_pos.z, tnt_count)
    mc.postToChat("TNTが爆発します!")
    time.sleep(2)
    mc.postToChat("爆発が終了しました。")

元々のTNTの起爆に対して新しいアイデアを実行してくれた!文脈をちゃんと覚えてるChatGPT凄い!

レッドストーントーチを使えば、確かに起爆できそう。

ところが実行結果はまたもやエラー…。

[ERR]AttributeError: module 'mcpi.block' has no attribute 'REDSTONE_TORCH_ON'

REDSTONE_TORCH_ONというattributeもないとのこと。ここまでか。

滅気ずに実行結果を伝える息子。

REDSTONE_TORCH_ONというattributeがないというエラーが発生しました。

import random
import time
from mcpi.minecraft import Minecraft
from mcpi import block

# プレイヤーの周りにTNTブロックを配置し、起爆する関数
def create_explosions(mc, x, y, z, count):
    for _ in range(count):
        dx = random.randint(-5, 5)
        dy = random.randint(0, 5)
        dz = random.randint(-5, 5)

        mc.setBlock(x + dx, y + dy, z + dz, block.TNT.id)
        mc.setBlock(x + dx + 1, y + dy, z + dz, 76)  # TNTを起爆するために隣接するREDSTONE_TORCH_ON(ブロックID 76)を設置

if __name__ == "__main__":
    # Minecraftサーバーに接続
    mc = Minecraft.create()

    # 現在のプレイヤーの位置を取得
    player_pos = mc.player.getTilePos()

    # TNTブロックの数を設定
    tnt_count = 10

    # TNTブロックを配置し、起爆
    create_explosions(mc, player_pos.x, player_pos.y, player_pos.z, tnt_count)
    mc.postToChat("TNTが爆発します!")
    time.sleep(2)
    mc.postToChat("爆発が終了しました。")

attributeがないなら、ブロックIDを指定してみるようにアプローチを変更するChatGPT。

そろそろ期待感も下がった状態で実行してみたら、、、。

起爆した!

ドーン!

ドドーン!

ドドドーン!めっちゃ嬉しい!

息子も私も、思わず声が出るぐらい興奮しちゃいました。

まとめ

ということで、元々は息子にPythonプログラミングを教えるつもりで始めたことが、ChatGPT使ったAIプログラミングを体験させることになってしまいました。息子はこのプログラムの実行結果には大満足ですが、「次はChatGPTに何をお願いしようかな」という方に完全に頭が切り替わってしまったことで、今後Pythonを一から学ぶモチベーションはダダ下がりしてしまいました。

現在、子供向けだけでなく、社会人向けにもリスキリングという名目でプログラミング教育の取り組みが各所で積極的に展開されていますが、その効果が出る前に、人間がプログラミングすることはほぼ不要な世界がすぐそこまで迫っているのかもしれないと実感できる、印象的な体験でした。