本日沖縄はとっても良い天気でございます。爽やかな気分で、人工知能とお話しをする会、24日目をはじめていきましょう。

一昨日、昨日と、レトロゲームについてミーティーに色々と聞いてみたここ2日間だったのですが、ふと「情報を聞くだけじゃなくて、一緒に遊べないものかしら」と思いまして。

ChatGPTとゲームをやる方法が無いか、考えてみました。

いくら高性能と言っても、ChatGPTはテキストベースのチャット機能ですので、それほど大掛かりなことはできないような気がします。とっても簡単で、鉛筆と紙さえあればできそうなゲーム、と言えば……これですかね。


こんにちは。

こんにちは!お元気ですか?何かお手伝いできることがありますか?

「マルバツゲーム」ってご存知ですか?

はい、マルバツゲームは知っています。マルバツゲームは、2人のプレーヤーが交互に線を引いて3つのマスを縦、横、斜めのいずれかの方向でつなぎ、自分のマークである「○」または「×」を3つ揃えたプレーヤーが勝利するゲームです。引き分けの場合もあります。一般的には、9つのマスを持つ正方形の盤面を使います。親しまれているゲームの一つです。

おお、そうですそうです。それをあなたとやりたいのですが、できますか?

残念ながら、私は文字ベースのコンピュータープログラムであり、現実世界でマルバツゲームをプレイすることはできません。しかし、オンラインでマルバツゲームをプレイできるウェブサイトやアプリがたくさんあります。オンラインで友達と対戦することもできますので、お試しください。それでも何かお力になれることがあれば、おっしゃってください!

そうですか……ちなみに、画面に3×3のマスをテキストで表示することはできますか?

はい、3×3のマスをテキストで表示することはできます。以下はPythonのコード例です。

def print_board(board):
    print(" " + board[0] + " | " + board[1] + " | " + board[2] + " ")
    print("---|---|---")
    print(" " + board[3] + " | " + board[4] + " | " + board[5] + " ")
    print("---|---|---")
    print(" " + board[6] + " | " + board[7] + " | " + board[8] + " ")

board = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
print_board(board)

このコードは、3×3のマスを表示するためのprint_board関数を定義し、引数に与えられたboardリストの値を使用して、マスを表示します。上記のコードを実行すると、以下のように表示されます。

1 | 2 | 3
—|—|—
4 | 5 | 6
—|—|—
7 | 8 | 9

上記のコード例はPythonを使用していますが、他のプログラミング言語でも同様の方法で実装できます。

おお、今表示されているこのマスを使えって、マルバツゲームやってみませんか?

はい、構いません!それでは、私たちはこのテキストで表示されているマスを使用して、マルバツゲームをプレイできます。私は「O」を表し、あなたは「X」を表すとして、交互にマスを埋めていきましょう。始める前に、どちらが先攻にするかを決めましょう。あなたが先攻にする場合は、好きなマスに「X」を入れてください。私が先攻にする場合は、最初に「O」を入れます。それでは、始めましょう!

では、「1」の欄に「X」をお願いします。

了解です。それでは、以下のようにマスを更新してください。

X | 2 | 3
—|—|—
4 | 5 | 6
—|—|—
7 | 8 | 9

次は私の番です。「O」をどこに入れるか考えてみます。

「O」をどこに入れるか決めましたか?

はい、決めました。私は真ん中のマスに「O」を入れます。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | 9

次はあなたの番です。どこに「X」を入れますか?

では、「9」の欄に「X」をお願いします。

了解しました。以下のようにマスを更新します。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次は私の番です。「O」をどこに入れるか考えてみます。

「O」をどこに入れるか決めましたか?

はい、決めました。私は左上のマスに「O」を入れます。

O | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次はあなたの番です。どこに「X」を入れますか?

おっと、一度入れた「O」と「X」には、上書きをしてはいけないのです。戻って、やり直してくださいね。

申し訳ありません。理解しました。以下が現在の状態です。

O | 2 | 3
—|—|—
4 |   | 6
—|—|—
7 | 8 |  

もう一度、どこかに「X」を入れてください。

うーむ。現在の状況は「1」の欄に「X」、「5」の欄に「O」、「9」の欄に「X」で、次はあなたの番です。

了解しました。以下が現在の状態です。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次は私の番です。「O」をどこに入れるか考えてみます。ここで、私は横列か縦列か斜め列のどこかに3つの同じ記号を並べることを目指します。そうすれば、その列に勝利することができます。しかし、あなたが上手くブロックした場合は、それに反応するようにします。そうでなければ、まだ勝つチャンスがある列に「O」を入れます。今回は、真ん中のマスに「O」を入れます。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次はあなたの番です。どこに「X」を入れますか?

そうきましたか……では、真ん中のマスに「X」をお願いします!

了解しました。以下が現在の状態です。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次は私の番です。「O」をどこに入れるか考えてみます。この状況では、勝ちを狙うためには、斜め列または縦列を狙う必要があります。ここでは左上から右下にかけての斜め列を狙うことにします。左上と右下のマスに既に「O」と「X」があるため、真ん中のマスに「O」を入れます。

X | 2 | 3
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次はあなたの番です。どこに「X」を入れますか?

あ、数字のマスには上書きして大丈夫ですよ〜。

了解しました。ありがとうございます。では、「3」のマスに「X」を入れてみます。

X | 2 | X
—|—|—
4 | O | 6
—|—|—
7 | 8 | X

次は私の番です。「O」をどこに入れるか考えてみます。ここで私は、右上から左下の斜め列を狙います。現在、この列にはまだどちらのマークもありません。右上と左下にある「X」を考慮して、真ん中のマスに「O」を入れます。

X | 2 | X
—|—|—
4 | O | 6
—|—|—
7 | O | X

次はあなたの番です。どこに「X」を入れますか?

では、「2」の欄にXをお願いします!

了解しました。以下が現在の状態です。

X | X | X
—|—|—
4 | O | 6
—|—|—
7 | O | X

おめでとうございます!あなたが勝利しました!3つの「X」を横一列に揃えることができましたね。次は私が先攻として、もう一度やりましょうか?それとも、もう終了にすることにしますか?

今回はこれで終わりにしましょう。とっても楽しかったです!ありがとうございました!

こちらこそ、楽しかったです!また何かありましたら、遠慮なくお声掛けくださいね。お疲れ様でした!

大成功〜!いやはや、ちょっと感動しました。すごい!

ChatGPTはプログラミングが得意、とは聞いていましたので、プログラムで「枠」を作ることくらいだったら、もしかしたらできるのでは……と聞いてみたのが正解でしたね。

ただ、ルールの設定には微妙な調整がいるようで、「相手のマルバツに上書きしない」「でも、マスの場所を表す数字の上には上書きOK」みたいなことを、随時伝えていく必要がありました。最初はちゃんとわかっていることでも、条件が変化することによって迷子になってしまうこともあるようです。

迷子になっていることを見抜いた、非道な人間からのずる賢い(?)策略「必殺真ん中上書き」にも負けず、最後は正々堂々と戦ってくれました。

これは楽しいな〜、ときどきマルバツゲームで遊んでもらいましょう。他にもできそうなゲームがないか、調べておかないといけませんね。