最近、生成系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頌みで䜜成した迷路ゲヌム - 毎回異なる迷路が䜜成される

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

ただし、䜕床か実行しおみるず分かるずおり、以䞋のようにスカスカの迷路になりがちだ。䞊蚘のプログラムを実際に読んでみれば理由は分かるず思うが、起点(巊䞊)からランダムに掘り進め右䞋に至るたで繰り返すのだが、ランダムに䞊䞋巊右に掘るために、ゎヌル(右䞋)に至る間には、ほずんどの壁を壊しおしたうためだ。

  • AI頌みで䜜成した迷路

    AI頌みで䜜成した迷路

どうやら、もう少し詳しく指瀺を曞かなくおはいけないようだ。そのため、いろいろずコメントを倉曎しお具䜓的に曞いおみた。しかし、結局は思った通りに迷路を䜜成するこずはできなかった。もしかするず、良いプログラムを生成するためには、もっずコメントの曞き方を工倫する必芁があるかもしれない。

そこで、先ほど䜜ったプログラムをベヌスにしお手䜜業で修正しおみた。なお、党郚Copilotに曞かせるよりも、ある皋床自分の意思でプログラムを曞く方が早く目的のプログラムを䜜成できた。

なお、改良したプログラムをこちらに配眮した。

  • 手䜜業で改良しおみた

    手䜜業で改良しおみた

結論 - GitHub Copilot䟿利すぎる

ここたで芋たように、Copilotに自動で党おを䜜っおもらおうず思うず䞍完党さが目立った。しかし、自分である皋床プログラムを入力し、繰り返しの蚘述が必芁な郚分や、よくある凊理を入力する必芁がある郚分に関しおは、かなり良いプログラムが生成された。

䟋えば、迷路の通路を自動で䌞ばす凊理においお、指定のX座暙を倉曎するプログラム「next_x = x + dir[0]」を曞いたずころ、Y座暙も同じように倉曎するプログラム「next_y = y + dir[1]」をCopilotが自動で曞いおくれた。぀たり、Excelのオヌトフィルのような凊理をプログラム䜜成でもやっおくれるのだ。

AIによるプログラム生成に関しおは、盗甚やセキュリティなどの懞念も䞊がっおいる。しかし、自動で党おを䜜っおもらうのではなく、賢いテンプレヌトずしお䜿ったり、決たり切った凊理を自動で生成しおもらったりず、甚途を限定しお䜿うならAIを掻かし぀぀高品質なプログラムを䜜るこずができるず感じた。Copilotは日々改良されおいるので、今埌の展開も楜しみだ。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。