chatGPTにぷよぷよを作らせてみた。

# はじめに
みなさん、こんにちは。
今流行りのchatGPTくんに、ぷよぷよゲームを作ってもらう実験をやってみました。
まずはお気軽に頼んでみます。
# レッツトライ
ワイ「ぷよぷよゲームコードをPythonで書いてください。

実際の質問の様子
![スクリーンショット 2023-02-17 17.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/a9727389-6caa-bacb-4efc-2a4c4d8648ba.png)

出力されたコード
```python
import pygame
import random

# ゲーム画面のサイズを定義
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480

# ぷよの色を定義
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# ぷよのサイズとスピードを定義
PUYO_SIZE = 32
FALL_SPEED = 5

# ぷよを表すクラスを定義
class Puyo:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color

    def draw(self, screen):
        pygame.draw.circle(screen, self.color, (self.x, self.y), PUYO_SIZE // 2)

# プレイヤーが操作するぷよを表すクラスを定義
class PlayerPuyo:
    def __init__(self, x, y, color):
        self.puyo1 = Puyo(x, y, color)
        self.puyo2 = Puyo(x, y - PUYO_SIZE, color)

    def draw(self, screen):
        self.puyo1.draw(screen)
        self.puyo2.draw(screen)

    def move_left(self):
        self.puyo1.x -= PUYO_SIZE
        self.puyo2.x -= PUYO_SIZE

    def move_right(self):
        self.puyo1.x += PUYO_SIZE
        self.puyo2.x += PUYO_SIZE

    def fall(self):
        self.puyo1.y += FALL_SPEED
        self.puyo2.y += FALL_SPEED

# ゲームのメインループ
def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

    # プレイヤーが操作するぷよを作成
    player_puyo = PlayerPuyo(SCREEN_WIDTH // 2, PUYO_SIZE, random.choice([RED, GREEN, BLUE, YELLOW]))

    clock = pygame.time.Clock()

    while True:
        # イベントを処理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player_puyo.move_left()
                elif event.key == pygame.K_RIGHT:
                    player_puyo.move_right()

        # ぷよを落下させる
        player_puyo.fall()

        # 画面を塗りつぶす
        screen.fill((255, 255, 255))

        # プレイヤーが操作するぷよを描画
        player_puyo.draw(screen)

        # 画面を更新
        pygame.display.flip()

        # 一定時間待つ
        clock.tick(60)

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

なにやらコードが出力されたけど途中で途切れていたので、続きの出力を依頼します。

ワイ「続きのコードを出力してください
![スクリーンショット 2023-02-17 17.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/62a7ff91-1b5a-abc3-763e-d43a44a5086d.png)
んーやっぱり途中で止まりました。
しかも各処理の前後関係がおかしくなっていて不完全なコードです。

# 策を考えた
ならばと、考えてこんな依頼をしてみました。

ワイ
「上記のぷよぷよのコードの完全版を出力してください。

chatGPTくん
「以下に、ぷよぷよの完全版のコードを示します。このコードは、Pygameを使用しています。

ほれ、ボロン
```python
import pygame
import random

# 画面の大きさ
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 500

# ぷよの大きさ
PUYO_SIZE = 40

# ぷよの色
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# 背景色
BLACK = (0, 0, 0)

# スコアの色
WHITE = (255, 255, 255)

# ぷよの落下速度
FALL_SPEED = 10

# ぷよを表すクラス
class Puyo:
    def __init__(self, x, y, color):
        self.puyo1 = pygame.math.Vector2(x, y)
        self.puyo2 = pygame.math.Vector2(x, y + PUYO_SIZE)
        self.color = color

    def move_left(self):
        if self.puyo1.x > PUYO_SIZE:
            self.puyo1.x -= PUYO_SIZE
            self.puyo2.x -= PUYO_SIZE

    def move_right(self):
        if self.puyo2.x < SCREEN_WIDTH - PUYO_SIZE:
            self.puyo1.x += PUYO_SIZE
            self.puyo2.x += PUYO_SIZE

    def fall(self):
        self.puyo1.y += FALL_SPEED
        self.puyo2.y += FALL_SPEED

# 新しいぷよを生成する
def generate_new_puyo():
    x = random.randint(PUYO_SIZE, SCREEN_WIDTH - PUYO_SIZE)
    y = 0
    color = random.choice([RED, GREEN, BLUE, YELLOW])
    return Puyo(x, y, color)

# ぷよ同士が接触しているかどうかを判定
def is_puyo_touching(puyo1, puyo2):
    return abs(puyo1.x - puyo2.x) < PUYO_SIZE and abs(puyo1.y - puyo2.y) < PUYO_SIZE

# ぷよが地面に着いたかどうかを判定
def is_puyo_landed(puyo):
    return puyo.puyo2.y >= SCREEN_HEIGHT or any([is_puyo_touching(puyo.puyo2, p.puyo1) for p in player_puyos])

# ぷよを消す
def remove_puyos(puyos_to_remove):
    global player_puyos, score
    for puyo in puyos_to_remove:
        player_puyos.remove(puyo)
        score += 10

# ぷよを描画する
def draw_puyo(puyo, screen):
    pygame.draw.circle(screen, puyo.color, (puyo.puyo1.x, puyo.puyo1.y), PUYO_SIZE // 2)
    pygame.draw.circle(screen, puyo.color, (puyo.puyo2.x, puyo.puyo2.y), PUYO_SIZE // 2)

# 画面を塗りつぶす
def draw_screen(screen):
    screen.fill(BLACK)

# ゲームの状態を画面に表示
def draw_score(screen, score):
   
```
またしても途中で止まったので、続きを依頼します。

ワイ
「出力を続けてください

chatGPTくん
「続いて、ぷよぷよの完全版のコードの残り部分を示します。

ほれ、ボロン
```Python
    font = pygame.font.Font(None, 30)
    text = font.render("Score: " + str(score), 1, WHITE)
    screen.blit(text, (10, 10))

# メインのゲームループ
def main():
    global player_puyos, score

    # Pygameの初期化
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Puyo Puyo")

    clock = pygame.time.Clock()

    player_puyos = [generate_new_puyo()]

    score = 0

    # ゲームループ
    while True:
        # イベントの処理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player_puyos[0].move_left()
                elif event.key == pygame.K_RIGHT:
                    player_puyos[0].move_right()

        # ぷよの落下処理
        if not is_puyo_landed(player_puyos[0]):
            player_puyos[0].fall()
        else:
            # 新しいぷよを生成して、ぷよのリストに追加する
            player_puyos.append(generate_new_puyo())

            # 消えるぷよのリスト
            puyos_to_remove = []

            # 4つ以上同じ色のぷよが縦か横に並んでいる場合、そのぷよを消す
            for puyo in player_puyos:
                same_color_puyos = [p for p in player_puyos if p.color == puyo.color and p != puyo]

                for same_color_puyo in same_color_puyos:
                    if puyo.puyo1.x == same_color_puyo.puyo1.x and abs(puyo.puyo1.y - same_color_puyo.puyo1.y) == PUYO_SIZE:
                        puyos_to_remove.extend([p for p in player_puyos if p.color == puyo.color])
                    elif puyo.puyo1.y == same_color_puyo.puyo1.y and abs(puyo.puyo1.x - same_color_puyo.puyo1.x) == PUYO_SIZE:
                        puyos_to_remove.extend([p for p in player_puyos if p.color == puyo.color])

            if puyos_to_remove:
                remove_puyos(puyos_to_remove)

        # 画面の描画
        draw_screen(screen)

        for puyo in player_puyos:
            draw_puyo(puyo, screen)

        draw_score(screen, score)

        pygame.display.update()

        # フレームレートを設定する
        clock.tick(30)

if __name__ == "__main__":
    main()
```
chatGPTくん
「これで、ぷよぷよの完全版のコードが完成しました。このコードを実行すると、Pygameウィンドウが表示され、プレイヤーがぷよを操作してスコアを稼ぐことができます。

ほほー、ほんまか！！

というわけで、VScodeでに貼り付けてみて保存。
んーどうやら構文的なエラーはなさげ？
![スクリーンショット 2023-02-17 17.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/9bd37309-08c3-3ab3-29d7-12bf59472537.png)

# 実行してみた。
chatGPTが出力したpythonコードは、pygameのライブラリが必要ですので、
以下のコマンドでサクッとpygameをインストールします。
```
pip install pygame
```
でもって、実行。
![スクリーンショット 2023-02-17 17.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/62006d75-cb73-2aad-2d95-7a9d913d06a4.png)

あれあれ？？
なんかそれっぽい画面出たけど！？
![しっぱい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/8f9928bb-4e70-67d9-a881-4b80be12511c.png)

エラー吐いて、終わりました。
![スクリーンショット 2023-02-17 17.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/4536781e-f853-413e-d5d6-30e3ed336d52.png)
うーん？
# デバッグもやってよ！
せっかく出来上がったコード。
でもバグがあって遊べなーい。

お願いドラ○もん！デバッグしてー！
というわけで、先ほどのコードを貼り付けてデバッグを依頼してみました。
![スクリーンショット 2023-02-17 17.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/3523ea47-6d8f-9570-6c51-f7f1bffc8fa0.png)

chatGPTくん
「分かったナリ
![スクリーンショット 2023-02-17 17.57.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/0d065828-f33e-147d-b17b-0b8ba3cec8d9.png)
という感じで修正案も頂けました。

# 無理やりまとめてみる
最終的にバッチリ動くコードを出力させる事はできませんでしたが、
それっぽいものは作ってくれました。
ベースとして骨組みを作ってもらって後は人間が仕上げるという風にすれば
コーディング時間を大幅に減らす事はできそうだなという事がわかりました。

今回、ぷよぷよのコードがこんなにもあっさり出てくるというのは
chatGPTの学習結果の中に、ぷよぷよも、ぷよぷよのソースコードの
正解もあるのかもしれません。

実際、もっと単純な作業をさせるコードなら良い感じのコードを出力してくるので
うまく使えばお仕事が楽になる未来が待っていそうですね。

ということで、おわりです。