はじめに

最近超話題のChatGPT触ってみました。
pythonでジャンプで敵を避ける2Dのゲームを作ってもらうことにしました。
使用したモデルは3.5です。

ChatGPTの利用にあたっての注意

  • 当社ではお客様の同意がない限り、システム開発にChatGPTを利用することを禁止しています。
  • 今回のプログラムはChatGPTのWebサービスで作成しており、学習データに当社が開発したコード等は一切含まれておりません。

作成手順

ChatGPTと以下の内容を繰り返し会話をするだけです。
繰り返しリテイクをしてもらって、段々ゲームが出来上がります。

  1. 〇〇するコードを書いてください
  2. 実行してみる
  3. 修正点を指摘するので直して下さい

先に結論

長くなるので先に結論の要約と作成されたゲームの画像を紹介します。

  • 本当に動くコードが書けました
  • ちょっとずつコードを書いていくとスパゲティになってしまいました
  • 適切に指示をして、設計の段階から指示を出せるとおそらくもっと高クオリティなものが作れる気がします

作ってもらったゲーム↓

gen11

1回目

方針

「ゲームを作って」と言っても、「私は質問回答サービスなのでゲームは作れません」と拒否されることがあるらしいので、貴方はゲームエンジニアです。と刷り込みをしてから開始します。

会話内容

入力

貴方はゲームエンジニアです
pythonのpygameを利用してで2Dアクションゲームを作成してください

ChatGPTの回答

はい、ゲームエンジニアのChatGPTです。PythonのPygameを使って2Dアクションゲームを作成する方法についてアドバイスを差し上げます。

まず、Pygameをインストールする必要があります。PygameはPythonのライブラリで、2Dゲームを作成するための機能を提供します。以下のコマンドを使用してインストールできます。

pip install pygame

次に、ゲームの構造を考えます。2Dアクションゲームは通常、プレイヤーと敵が登場するスクロールするスクリーン上でプレイされます。プレイヤーは様々な操作を行い、敵を倒しながら進んでいきます。

Pygameでゲームを作成する場合、以下の基本的なコンポーネントが必要になります。

プレイヤーのスプライト
敵のスプライト
背景スクロール
衝突判定
ユーザー入力の処理
これらのコンポーネントを組み合わせて、2Dアクションゲームを作成することができます。

以下は、Pygameを使用した2Dアクションゲームのサンプルコードです。このコードは、プレイヤーがジャンプして敵を避けながら進むゲームです。プレイヤーは矢印キーで移動し、スペースバーでジャンプします。

import pygame

# 初期化
pygame.init()

# 画面のサイズ
screen_width = 800
screen_height = 600

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))

# ゲームタイトル
pygame.display.set_caption("2D Action Game")

# プレイヤーのスプライト
player_image = pygame.image.load("player.png")
player_rect = player_image.get_rect()
player_rect.centerx = screen_width / 2
player_rect.bottom = screen_height - 10

# 敵のスプライト
enemy_image = pygame.image.load("enemy.png")
enemy_rect = enemy_image.get_rect()
enemy_rect.centerx = screen_width / 2
enemy_rect.top = 10

# 背景
background = pygame.image.load("background.png")

# ゲームループ
while True:
    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # ジャンプ処理
                pass

    # プレイヤーの移動
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_rect.move_ip(-5,

結果

かっこ閉じていないので動きません
また、画像の作成はどうしてもこちらでする必要があるので、適当な画像を作ります。
プレイヤーを青い四角、敵を赤い四角、背景を緑で適当な画像を作成しました。

2回目

方針

まず、目に見える問題点を解消してもらおうと思います。

会話内容

入力

問題点が2つあります。
player_rect.move_ipの()が閉じられていません。
sysをimportしていません。
以上を解消したコードの作成をお願いします。

ChatGPTの回答

申し訳ありません。以下のように修正したコードを提供いたします。

import pygame
import sys

# 初期化
pygame.init()

# 画面のサイズ
screen_width = 800
screen_height = 600

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))

# ゲームタイトル
pygame.display.set_caption("2D Action Game")

# プレイヤーのスプライト
player_image = pygame.image.load("player.png")
player_rect = player_image.get_rect()
player_rect.centerx = screen_width / 2
player_rect.bottom = screen_height - 10

# 敵のスプライト
enemy_image = pygame.image.load("enemy.png")
enemy_rect = enemy_image.get_rect()
enemy_rect.centerx = screen_width / 2
enemy_rect.top = 10

# 背景
background = pygame.image.load("background.png")

# ゲームループ
while True:
    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # ジャンプ処理
                pass

    # プレイヤーの移動
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_rect.move_ip(-5, 0)
    if keys[pygame.K_RIGHT]:
        player_rect.move_ip(5, 0)

    # 画面に描画
    screen.blit(background, (0, 0))
    screen.blit(player_image, player_rect)
    screen.blit(enemy_image, enemy_rect)
    pygame.display.update()

修正点を確認いただくと、player_rect.move_ipの()が閉じられていなかった点に加えて、sysをインポートする行を追加しています。また、プレイヤーが左右に移動するためのコードも追加しています。

ご参考いただけますと幸いです。

結果

もう動くようになりました
プレイヤーが左右に動けるだけですが、まず動くものが出来上がりました。

gen2

3回目

方針

後から考えると同時に色々させないほうがよかったかもしれませんでした。

  • 横スクロールなので右から敵が来るようにしたい
  • ジャンプできるようにしたい

の2点でお願いしました。

会話内容

入力

以下の対応をしていただきたいです。
敵はランダムな間隔で右から向かってくるようにしたいです。
また、ジャンプが機能しません。プレイヤーのジャンプはスペースを押すと画面の上に向かってジャンプするようにしたいです。

ChatGPTの回答

了解いたしました。以下のように修正したコードを提供いたします。

修正点を確認いただくと、以下のようになっています。

  1. 敵のスプライトの初期位置を画面右側に設定し、ランダムな位置から出現するように変更しました。敵は画面から出たら再度右側から出現するようになっています。
  2. ジャンプ処理を追加し、スペースキーが押されたときにプレイヤーが上に移動するようになっています。
コードは省略

以上の修正で、敵がランダムな間隔で右から向かってくるようになり、プレイヤーのジャンプが実装されました。ご確認いただけますと幸いです。

結果

敵が右から来るようになりました
ジャンプは機能するようになったのですが、上にスライドするだけでジャンプと呼べる物ではなさそうでした。

gen3

4回目

方針

ここでも複数要求しています。良くないですね。

  • ジャンプしたら元の位置に戻る
  • ジャンプの髙さをもう少し髙くする

の2点でお願いしています

会話内容

入力

以下の修正をお願いします。
ジャンプした際に戻ってこないです。ジャンプは上に50px移動した後、元の位置に戻るように実装してほしいです。

ChatGPTの回答

了解いたしました。以下のように修正したコードを提供いたします。

コードは省略

修正点を確認いただくと、以下のようになっています。

  1. プレイヤーがジャンプする際に、ジャンプフラグをTrueに設定し、ジャンプする位置を保存するようにしました。プレイヤーがジャンプ中の場合、プレイヤーは上に5ピクセルずつ移動します。ジャンプが終了すると、ジャンプフラグをFalseに設定し、プレイヤーを元の位置に戻します。
  2. ジャンプ中は左右に移動できないようにしました。
    以上の修正で、ジャンプ時にプレイヤーが元の位置に戻るようになりました。ご確認いただけますと幸いです。

結果

ジャンプは髙くなった
「元の位置に戻る」を左右だと認識されてしまい、ジャンプの実装は未だ出来ず。

gen4

5回目

方針

ジャンプで戻すのは上下であるということを念押しする。

会話内容

入力

ジャンプで元に戻るのは上下が元の位置に戻るということです。
この方針で修正をお願いします。

ChatGPTの回答

申し訳ありません、誤解をしてしまいました。以下の修正コードをご確認ください。

修正点を確認いただくと、以下のようになっています。

コードは省略

プレイヤーがジャンプする際に、ジャンプフラグをTrueに設定し、ジャンプする位置を保存するようにしました。プレイヤーがジャンプ中の場合、プレイヤーは上に5ピクセルずつ移動します。ジャンプが終了すると、ジャンプフラグをFalseに設定し、プレイヤーは元の位置に戻るように下に5ピクセルずつ移動します。
ジャンプ中は左右に移動できないようにしました。
以上の修

結果

ジャンプが実装できました!
ジャンプ力が低い!

このあたりから段々相手がAIであることを忘れた文章を書き始めてきます。

gen5

6回目,7回目

方針

ジャンプ力を髙くしたい!

会話内容

入力

ジャンプした後、元の位置に戻っていることを確認できました。
ジャンプの髙さを20ピクセルにしてほしいです。

ChatGPTの回答

了解いたしました。以下の修正コードをご確認ください。

コードは省略

修正点を確認いただくと、以下のようになっています。

プレイヤーがジャンプする際に、ジャンプフラグをTrueに設定し、ジャンプする位置を保存するようにしました。プレイヤーがジャンプ中の場合、プレイヤーは上に5ピクセルずつ移動します。ジャンプが終了すると、ジャンプフラグをFalseに設定し、プレイヤーは元の位置に戻るように下に5ピクセルずつ移動します。
ジャンプの高さを20ピクセルに変更しました。
以上の修正で、ジャンプの高さが20ピク

入力

すみません、ジャンプの髙さを今の4倍にしてください。

ChatGPTの回答

了解いたしました。以下の修正コードをご確認ください。

コードは省略

修正点を確認いただくと、以下のようになっています。

プレイヤーがジャンプする際に、ジャンプフラグをTrueに設定し、ジャンプする位置を保存するようにしました。プレイヤーがジャンプ中の場合、プレイヤーは上に5ピクセルずつ移動します。ジャンプが終了すると、ジャンプフラグをFalseに設定し、プレイヤーは元の位置に戻るように下に5ピクセルずつ移動します。
ジャンプの高さを80ピクセルに変更しました。
以上の修正で、ジャンプの高さが80ピク

結果

ジャンプの高さの調整が甘く2回リテイクしました。
ごめんなさい。
ただ今の状態でも無理ゲーであることが次ゲームオーバーの概念を導入した時に発覚するので、ジャンプ調整はまだかかります。
ただ、ChatGPTはn倍のような具体的な数字には絶対に間違わない感じがありました。

gen7

8回目

方針

ぶつかったらゲームオーバーの概念を導入する

会話内容

入力

プレイヤーが敵にぶつかった場合、ゲームオーバーの表示を出してゲームオーバーにしたいです。
ゲームオーバーになった場合はスペースキーを押すともう一度ゲームが始まるようにしたいです。

ChatGPTの回答

修正点を確認いただくと、以下

コードは省略

結果

ChatGPTの返事が適当になってる...
ゲームオーバー画面の画像を用意する必要があったので、ピンク色にゲームオーバーと簡単な画像を作りました。
ゲームオーバーの実装一発でできました。
ただ、再開に関しては上手く動かずゲームオーバーになるとソフトを落とす必要があるという状態です。

gen8

9回目

方針

ジャンプ力が低すぎて無理ゲーなので上げてもらう

会話内容

入力

ジャンプの髙さを今の3倍にしたいです!

ChatGPTの回答

修正点を確認いただくと、以下

コードは省略

結果

何度もすみません。

gen9

10回目

方針

まだジャンプ足りない(自分が悪いです)
あと、ゲームオーバー画面から再開できるようにする。

会話内容

入力

ジャンプの髙さを今のジャンプの髙さの3倍にしてください
またゲームオーバー画面からゲーム再開ができないので修正してください

ChatGPTの回答

了解いたしました。以下の修正コードをご確認ください。

コードは省略

結果

ジャンプ力は改善しました
ただ今度はゲームオーバー画面から一瞬で再開が自動で行われるようになってしまい、望んだ実装ではありませんでした。

gen10

11回目

方針

現状コードがかなりスパゲティになっておりゲームオーバーと再開の実装が上手くいかないので、諦めてゲームオーバーになったらソフトを終了するようにする。

会話内容

入力

ゲームオーバーになった際の処理はソフトを終了するようにしてください

ChatGPTの回答

了解いたしました。以下の修正コードをご確認ください。

修正点を確認いただくと、以下となっております。

import pygame
import sys
import random

# 初期化
pygame.init()

# 画面のサイズ
screen_width = 800
screen_height = 600

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))

# ゲームタイトル
pygame.display.set_caption("2D Action Game")

# プレイヤーのスプライト
player_image = pygame.image.load("player.png")
player_rect = player_image.get_rect()
player_rect.centerx = screen_width / 2
player_rect.bottom = screen_height - 10
player_jump = False
player_jump_y = 0

# 敵のスプライト
enemy_image = pygame.image.load("enemy.png")
enemy_rect = enemy_image.get_rect()
enemy_rect.centerx = screen_width + 50
enemy_rect.bottom = screen_height - 10

# 背景
background = pygame.image.load("background.png")

# ゲームオーバー画面
gameover_image = pygame.image.load("gameover.png")
gameover_rect = gameover_image.get_rect()
gameover_rect.center = (screen_width / 2, screen_height / 2)

# ゲームループ
while True:
    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not player_jump:
                # ジャンプ処理
                player_jump = True
                player_jump_y = player_rect.bottom - 60 * 3

    # 敵の移動
    if enemy_rect.centerx < -50:
        enemy_rect.centerx = screen_width + 50
        enemy_rect.bottom = screen_height - 10
    else:
        enemy_rect.move_ip(-5, 0)

    # プレイヤーの移動
    if player_jump:
        if player_rect.bottom > player_jump_y:
            player_rect.move_ip(0, -5)
        else:
            player_jump = False
            player_rect.move_ip(0, 5)
    else:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player_rect.move_ip(-5, 0)
        if keys[pygame.K_RIGHT]:
            player_rect.move_ip(5, 0)
        if player_rect.bottom < screen_height - 10:
            player_rect.move_ip(0, 5)

    # 当たり判定
    if player_rect.colliderect(enemy_rect):
        screen.blit(gameover_image, gameover_rect)
        pygame.display.update()
        pygame.time.wait(2000)
        pygame.quit()
        sys.exit()

    # 画面に描画
    screen.blit(background, (0, 0))
    screen.blit(player_image, player_rect)
    screen.blit(enemy_image, enemy_rect)
    pygame.display.update()

ゲームオーバーになった際にソフトを終了するようにしました。

結果

最終的なコードなのでコード貼り付けました。
ゲームオーバーになった瞬間ソフトが落とされることも考えていましたが、予想より上の実装をしてくれて、一定時間ゲームオーバーを見せてからソフトを終了するようになっていました。
これでゲーム完成とします。

gen11

お疲れさまでした

会話内容

入力

ゲーム完成です!ありがとうございました!

ChatGPTの回答

お疲れ様でした!楽しんでいただけたでしょうか。何かあればまたお聞きください。

終わりに

想定より強烈な体験でした。
順番に小出しで要件を出すとスパゲティコードを出力して、次の出力にも影響が出ているように見えるのが人間の学習とかなり近くて、驚きました。
しっかり要件定義をしてから、指示を出せればもっと品質の高いコードを出力してもらえる気がしているのでまたチャレンジしたいです。

要件定義はしっかり人間がやって、AIにたたき台を書かせるようになるかもしれないな、と思ったのですが上手く扱うと要件定義もできるらしいです。優秀過ぎて恐ろしいですね...
プロンプトエンジニアとか言う考え方も生まれ始めているらしいので、このあたりの技術はせめて使う側としてでも追って行かないとまずいかもしれないという危機感があります。

直近の活用方法としてはゲームを作る以外でも、資格試験や新しい言語やフレームワークを触る時の学習の手助けとして、活用できるかなと思いました。

読んでいただきありがとうございました。