ChatGPTを使ってオセロゲームを作ってみた

ChatGPTさんが話題になっているので、遅ればせながらオセロゲームを作成してみました

# オセロゲームを作りたいとChatGPTさんにお願い
まずは、下記のようにChatGPTさんに入力してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/251f0a3e-cb51-aa47-eb01-9146edb5d2c0.png)

そうしたら、早速ソースコードを出力してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/1def3df2-cde8-c077-4ba5-af9c7c7663ac.png)

吐き出された内容を書き記すと、
~~~python
class Othero:
    def __init__(self):
        self.board = [[' ' for _ in range(6)] for _ in range(6)]
        self.board[2][2] = 'W'
        self.board[3][3] = 'W'
        self.board[2][3] = 'B'
        self.board[3][2] = 'B'
        self.current_player = 'B'

    def display_board(self):
        print('  0 1 2 3 4 5')
        for i in range(6):
            print(f'{i} {" ".join(self.board[i])}')
        print()

    def make_move(self, row, col):
        if self.board[row][col] != ' ':
            return False
        self.board[row][col] = self.current_player
        self.current_player = 'W' if self.current_player == 'B' else 'B'
        return True

    def is_valid_move(self, row, col):
        if self.board[row][col] != ' ':
            return False
        for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (-1, -1), (1, -1), (-1, 1)]:
            r, c = row + dr, col + dc
            while 0 <= r < 6 and 0 <= c < 6 and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                r += dr
                c += dc
            if 0 <= r < 6 and 0 <= c < 6 and self.board[r][c] == self.current_player and (r != row + dr or c != col + dc):
                return True
        return False

    def get_valid_moves(self):
        valid_moves = []
        for i in range(6):
            for j in range(6):
                if self.is_valid_move(i, j):
                    valid_moves.append((i, j))
        return valid_moves

    def get_winner(self):
        black_count = 0
        white_count = 0
        for i in range(6):
            for j in range(6):
                if self.board[i][j] == 'B':
                    black_count += 1
                elif self.board[i][j] == 'W':
                    white_count += 1
        if black_count > white_count:
            return 'B'
        elif white_count > black_count:
            return 'W'
        else:
            return None

~~~

さらっと見た感じなんとなく動きそうに見えますね～

# Let's動作確認！
ので、GoogleColaboratoryを使ってソースコードを実行してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/82ab30ab-63de-fcfc-4ed5-975860b82c1e.png)

おぉー、出されたソースコードだけでちゃんと表示されている！
マス目の区切りなどの細かいものはないものの、ちゃんとゲームとして遊べそうな期待感を持たせてくれます
では、実際にソースコードを書いてみて、遊んでみましょう！

~~~python
objOthero = Othero()

while True:
    objOthero.display_board()
    print('You can move ')
    print(objOthero.get_valid_moves())
    print('Input Row')
    moverow = int(input())
    print('Input Column')
    movecol = int(input())
    objOthero.make_move(moverow, movecol)
    if objOthero.get_valid_moves() == []:
        objOthero.display_board()
        print(objOthero.get_winner())
        break
~~~

同じくColaboratoryを使用して、上記のソースコードを実行してみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/9d0e04e2-702a-2484-a791-25113aba0cae.png)


なぬ…
オセロのはずなのに、挟んだ駒が裏返ってくれない…だと…
これではゲームとして遊べないじゃないか！

# ChatGPTさんへ苦情
ということで、ChatGPTさんに駒が裏返らないことを伝えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/42617cc8-e71d-2b71-ebba-f13eee0650e3.png)


なんと、駒を置くときのmake_move関数の改善版を作ってくれました!!!

# 改善版をいざ実行！
では、実際にこの改善版のコードへ差し替えて実行してみましょう!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/8fa08adc-cb4f-84a3-febe-18afbf071259.png)


無事に挟んだ駒がひっくり返ってくれました!
そして、最後まで実行することもできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273325/1ca25cea-21c4-561c-b00b-20f001e93579.png)

改善できるところは多そうですが、大枠のところをChatGPTさんで作ることができることがよくわかりました!
またいろいろと試してみたいと思います!