最近、生成系AIと呼ばれる技術が話題となっている。ChatGPTやStable DiffusionなどのAIでは文章で指示を入力することで、指示に沿った画像、文章、プログラムなどを生成することができる。そこで、今回はGitHub Copilotを利用して、迷路ゲーム作りに挑戦してみよう。どれだけ楽ができたか楽しみにして欲しい。

  • GitHub Copilotで作成した迷路ゲーム

    GitHub Copilotで作成した迷路ゲーム

果たしてAIはプログラマーの相棒となり得るか? - GitHub Copilotを使ってみよう

先日、姉妹連載のJavaScript連載(こちら)にて、ChatGPTを利用して電卓アプリを作ってみた。ChatGPTは汎用用途で利用できるAIであるが、それなりに質の良い精度のプログラムを作成することができた。そこで今回は、よりプログラミングに特化したAIを使ってみたいと思う。果たしてAIはプログラマーの相棒となり得るのであろうか。

GitHub Copilot(こちら)は、OpenAIのGPT-3.5 Turboという大規模な機械学習モデルを利用したサービスとなっており、「Python」「JavaScript」「TypeScript」「Ruby」「Go」「C#」「C++」など幅広いプログラミング言語に対応している。ちなみに、「Copilot」とは「副操縦士」という意味であり、その名前からも、プログラミング開発という旅のお供として使ってもらうことを想定していることが分かる。

ただし、GitHub Copilotは有料となっており、個人利用であれば、月10ドルか年100ドルを選択できる。原稿執筆時点で60日のフリートライアル期間が設けられている。

  • 60日のトライアルが可能なGitHub Copilot

    60日のトライアルが可能なGitHub Copilot

Visual Studio CodeでCopilotを使ってみよう

GitHub Copilotは有名エディタのプラグインとして用意されている。今回は、有名なコーディング用エディタの「Visual Studio Code」を利用してみよう。

最初に、GitHub Copilotを有効にしよう。GitHubアカウントを作成した上で、CopilotのWebサイトから、Copilotの利用をはじめよう。Copilotのプランを選び、住所やクレジットカードの入力が必要となる。

次に、Visual Studio Codeをインストールして、起動したら画面左側にあるExtensionsのアイコンをクリックしよう。上部にある検索ボックスで「copilot」を検索して「GitHub Copilot」の拡張をインストールしよう。

  • Visual Studio CodeでCopilot拡張をインストールする

    Visual Studio CodeでCopilot拡張をインストールする

Copilot拡張をインストールした上で、新規ファイルを作成すると、次のようなダイアログが表示される。[Sign in to GitHub]をクリックして、GitHubにサインインしよう。そして、連携機能を有効にすると利用可能になる。

  • Visual Studio CodeからGitHubにサインインして認証すると利用可能になる

    Visual Studio CodeからGitHubにサインインして認証すると利用可能になる

そして使い方だが、Copilot拡張が有効になっていれば、新規プログラムを作成し、コメントや関数名を記述してしばらく待つだけだ。何か特別なキーを押す必要はない。入力したコメントやプログラムに基づいて、続くプログラムを自動生成してくれる。生成したプログラムは薄い色の文字で表示されるので、その際、[Tab]キーを押すと実際にコードが挿入される。

  • Copilot拡張をインストールしたら、プログラムやコメントを入力して少し待っていると自動で続きが表示される

    Copilot拡張をインストールしたら、プログラムやコメントを入力して少し待っていると自動で続きが表示される

迷路を自動生成してみよう

今回は、本連載の90回目で紹介したPyGameを使って迷路ゲームを作ってみよう。そのために、最初にコマンドラインで下記のコマンドを実行してPyGameをインストールしておこう。

python3 -m pip install pygame==2.1.2

これで準備は整った。Copilotに依頼して、迷路を自動生成するプログラムを作ってもらうことにしよう。

Copilotでは、関数名やコメントを記述すると、その続きを予測して自動生成する。そこで、Visual Studio Codeを起動して「maze.py」というファイルを作成して、次のようなコードを入力しよう。

# 迷路を自動生成する
# 0:通路 1:壁とする
def make_maze(size_x, size_y):
    # ランダムに迷路を生成する

少し待つと、Copilotが灰色の文字で自動生成したプログラムを表示してくれた。それで、[Tab]キーを押すとプログラムを実際に挿入できる。なお、[ESC]キーを押すとキャンセルとなる。

  • 4行だけ入力して待っていると続く部分を生成してくれる

    4行だけ入力して待っていると続く部分を生成してくれる

ここでは、わずか3行のコメントと1行の関数名を入力しただけで、以下のような実際のプログラムを作ってくれた。日本語で指示を与えると、日本語のコメントも随時挿入してくれるようだ。

# 迷路を自動生成する
# 0:通路 1:壁とする
def make_maze(size_x, size_y):
    # ランダムに迷路を生成する
    # --- この行以降をCopilotが生成した ---
    maze = [[1 for i in range(size_x)] for j in range(size_y)]
    for i in range(1, size_y-1):
        for j in range(1, size_x-1):
            maze[i][j] = random.randint(0, 1)
    # 壁の数を調整する
    for i in range(1, size_y-1):
        for j in range(1, size_x-1):
            if maze[i][j] == 1:
                if maze[i-1][j] == 1 and maze[i+1][j] == 1 and maze[i][j-1] == 1 and maze[i][j+1] == 1:
                    maze[i][j] = 0
    # スタート地点とゴール地点を設定する
    maze[1][1] = 0
    maze[size_y-2][size_x-2] = 0
    return maze

if __name__ == '__main__':
    maze = make_maze(10, 10)
    for i in range(len(maze)):
        print(maze[i])

しかし、残念ながらこのままでは動かなかった。プログラムの中でrandomモジュールのrandint関数を使っているが、肝心のrandomモジュールをインポートしていない。ここからある程度、Pythonのことを知っていなければ、問題は解決できないことが分かる。つまり、お任せで全部作らせることはできないが、入力支援をしてくれる副操縦士と考えると良さそうだ。

それで、プログラムの冒頭に「import random」を付け加えると、とりあえず動くようになった。コマンドラインから「python3 maze.py」とタイプしてプログラムを実行してみた。先ほど書いたように、0が通路で1が壁の部分だ。

  • サクッと完成した迷路の自動生成プログラムを実行したところ

    サクッと完成した迷路の自動生成プログラムを実行したところ

すると、上記のような迷路を生成したのを確認できる。ぱっと目には問題ないように見えるが、行き止まりだらけで迷路ゲームとしては使えない迷路であることが分かる。全部自動で作ってくれたとは言え、それほど思った通りのプログラムではなかった。

さらに詳しい指示を加えてみよう

なお、Copilotは毎回異なるプログラムを生成してくれる。そのため、プログラムが気に入らない場合は作成したプログラムを消して、改めて自動生成されるのを待っていると、異なるプログラムを作ってくれる。 そのため、何度かプログラムを自動で作り直してもらって、納得のいくプログラムが作成されるのを待つのもありだ。加えて、自動生成した直後に、[Alt]+「]」キー(macOSでは、[Option]+「]」)を押すことで、次の提案を表示することもできる。

それでも、Copilotではプログラムやコメントで詳しい指示を与えることで、より明確なプログラムを生成するようになる。そこで、今回は以下のような指示を書いてみた。

# 迷路をランダムに自動生成する
# - 迷路の壁は1、通路は0とする
# - 迷路のサイズはwidth * heightとする
# - 座標(1,1)をスタート地点とする
# - 座標(width-2,height-2)をゴール地点とする
# - 迷路の外側は壁とする
# 次の手順で迷路を生成する
# 1. 迷路サイズ(width,height)の全てを壁で埋める
# 2. 座標(1,1)を基点としてランダムに通路を掘っていく
# 3. 右下の座標(width-2,height-2)に到達したら終了する

def make_maze(width, height):

すると、Copilotは次のようなプログラムを生成した。やはりrandomモジュールのインポートが必要となったが、それ以外の点はそのまま動くプログラムを生成してくれた。

def make_maze(width, height):
    # 迷路を壁で埋める
    maze = [[1 for i in range(width)] for j in range(height)]
    # 基点を通路にする
    maze[1][1] = 0
    # 基点から右下までの道を掘る
    x = 1
    y = 1
    while x < width - 2 or y < height - 2:
        # 進む方向をランダムに決める
        direction = random.randint(0, 3)
        if direction == 0 and y < height - 2:
            # 下に進む
            y += 1
            maze[y][x] = 0
        elif direction == 1 and x < width - 2:
            # 右に進む
            x += 1
            maze[y][x] = 0
        elif direction == 2 and y > 1:
            # 上に進む
            y -= 1
            maze[y][x] = 0
        elif direction == 3 and x > 1:
            # 左に進む
            x -= 1
            maze[y][x] = 0
    # 迷路を返す
    return maze

なお、今回はゲームフレームワークとしてPyGameを使う。それで、PyGameでグラフィカルに迷路を描画させるコードを自動生成させてみた。すると、迷路だけでなくキーボード入力の機能やゴール判定などの機能も自動で生成してくれた。実に便利だ。

少し長くなったので完成したプログラムはこちらに配置したので生成されたプログラムに興味があれば見てみて欲しい。

それで、プログラムを実行すると次のように表示される。実行するたびに異なる迷路が生成されるのが確認できるだろう。

  • AI頼みで作成した迷路ゲーム - 毎回異なる迷路が作成される

    AI頼みで作成した迷路ゲーム - 毎回異なる迷路が作成される

理想の迷路自動生成を目指して改良してみよう

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら