検索

キーワード


目次

【ChatGPT】コードを書かずにリバーシを作ってみよう!

  • 公開日:2023-10-15 19:36:57
  • 最終更新日:2023-10-15 19:36:48
【ChatGPT】コードを書かずにリバーシを作ってみよう!

Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!

フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。

はじめに

OpenAIによって開発されたChatGPTは、テキスト生成や質問応答だけでなく、プログラムの作成など、多岐にわたるタスクをサポートすることができます。今回の記事では、そんなChatGPTの力を借りて、コードを一行も書くことなく、コピーアンドペーストのみで古典的なボードゲーム「リバーシ」をPythonで実装する過程を紹介します。

生成結果に多少違いは出る可能性はありますが、おそらく誰でも同様の手順で作成することは出来るとは思いますので、ぜひ試してみてください。

また、当記事では有料版のChatGPT-Plusを使用する前提で記述しています。


リバーシの作成過程

前提

以下に挙げる手順では、コードを書く必要はありませんが、Pythonの実行環境が必要です。
実行環境を準備する手順は、以下のリンクを参照して下さい。

Pythonの環境構築方法は?Anacondaを使った簡単なやり方を紹介! (forward-soft.co.jp)

人間側はプロンプトの入力・テストプレイ・不具合報告などを行うだけでよいです。

エラーが出た場合は、その都度にエラーメッセージをChatGPTにコピーアンドペーストすることで、対処法を答えてくれます。


1. リバーシのルールを確認させる

まず、GPT-4Vを使ってリバーシの画像を読み込ませ、ChatGPTがリバーシのルールを確認させます。
ChatGPTにリバーシのルールを確認させる

特にルールなどの認識に問題はないようなので、次のステップに進みます。


2,盤面を作成する

まず、盤と石を作成させます。石をひっくり返すなどのロジックの実装は後回しにして、ゲームの根幹となる部分から実装を行うのが大事です。

盤面を作成させるために、次のようなプロンプトを入力しました。

リバーシのゲームをPythonで作成したいと思います。
まずは盤面を作成してください。

ChatGPTが出力したコードを実行した結果が以下の通りです。

ChatGPTが出力した盤面1

8×8の盤面、中央の黒白の石の配置などは合っていますが、マス目と石が長方形になってしまっています。

比較的軽微な修正のため、これについては次のプロンプトで修正します。


3.石を置く処理を実装する

次に、石を置く処理を実装します。先ほどの盤面の修正も合わせて、次のようなプロンプトを入力します。

・盤面を正方形に、石を丸くして下さい。
・クリックした箇所に石を置けるようにして下さい。
・最初は黒から順番に、黒と白が交互に手を打つようにして下さい。
・どちらの手番かを表示するようにして下さい。

ChatGPTが出力したコードを実行した結果は以下の通りです。

石を置く処理を実装

指示通りに盤面を修正し、手番表示や黒白交互に石を打つ処理も実装できました。

石を挟んでひっくり返す処理や、必ず石をひっくり返せる位置に石を打たなければならないという制約は未実装なため、今はただ交互に石を置くだけのゲームになっています。


3.石をひっくり返す処理の実装

次に、石をひっくり返す処理の実装を行います。次のようなプロンプトを入力します。

・現在の手番の表記を日本語にしてください。
・石を打った際に、その石と縦横斜めの間に挟まれた、異なる色の石がひっくり返るようにして下さい。
・石をひっくりかえせない場所には打てないようにしてください。

手番表示を日本語化するという軽微な修正も合わせて行います。

ChatGPTが出力したコードを実行した結果は以下の通りです。

ひっくり返す処理は実装できたが、石が配置されない

石はひっくり返りますが、石が配置されていません。
このような場合、ChatGPTに端的に状況を伝えます。上記の画像を張り付けるなどの形で伝えても良いでしょう。

石はひっくり返りますが、打った場所に石が配置されていません。

上のプロンプトを入力して出力された修正案を元に修正した結果が以下です。

石をひっくり返す処理を実装

リバーシの対局を終局間際まで行うことが出来ましたが、石を置ける場所がない場合のパスの判定がないため、ゲームが続行不可能になりました。


4.パスの判定、ゲームの終了判定および勝敗判定の実装

石の配置・挟んだ石をひっくり返すという大まかなロジックが出来たので、次はパスの判定・ゲームの終了判定と勝敗判定という比較的細かなロジックの実装を以下のプロンプトで行います。

以下のルールに従い、終局判定と勝敗判定をしてください。
・挟める石がない場合は、パスをする。
・空きマスがなくなる、または双方挟める石がないとき終局になる。
・石の多いほうが勝つ。空きマスは、勝者の石数に加算される。
・リザルト画面で、それぞれの石数と勝ったプレイヤーを表示する。

すると、終局判定を行い、また対局終了時に以下の表示が出るようになりました。

終局判定

指示にうまく従えていないようなので、その他テストプレイ中に発覚した不具合の修正もかねて、以下のプロンプトを追加で実行します。

・終局判定の前に、盤面を表示してください。
・片方が石を打てない状態でも、もう片方が石を打つことが出来る場合は、対局を続行してください。
・空きマスの数は、勝っている方の石数に加算してください。

このプロンプトの出力結果に応じてコードを修正した結果が以下になります。

終局判定の実装

白が打てる場所があるにもかかわらず、終局してしまいました。

この状況をChatGPTに伝えるために、画像を用いたプロンプトを入力します。

画像を用いてChatGPTに不具合を報告する

このプロンプトから得られた出力をコードに反省させた結果、以下のように正常に終局するようになりました。

修正後の動作確認


5.CPUの実装

次に、CPUとリバーシが楽しめるようにCPUを実装します。まず、CPUのアルゴリズムについてChatGPTに聞いてみます。

リバーシにおけるCPUについて、どのようなアルゴリズムがありますか?

すると、以下のように出力されます。

リバーシ(オセロ)のCPU(コンピュータ対戦相手)の実装に使われる一般的なアルゴリズムや手法には、以下のようなものがあります:
1. **Minimax アルゴリズム**: これは、すべての可能な手とその結果の手を探索するアルゴリズムです。プレイヤーは最大の利益を得る手を選び、対戦相手は最小の利益となる手を選びます。これを再帰的に評価して最適な手を見つけます。
2. **Alpha-Beta Pruning**: Minimaxアルゴリズムを効率化する手法。不必要な手(明らかに悪い手や評価が不要な手)の探索を打ち切り、計算時間を短縮します。
3. **Heuristic 評価関数**: ボードの状態を評価するための関数。例えば、隅に石がある利点、境界線上に石があるデメリットなど、リバーシの特定の戦略やパターンに基づくスコアを計算します。
4. **Monte Carlo Tree Search (MCTS)**: 多数のランダムな試行を行い、最も成功した手を選ぶ手法。近年のボードゲームAIではよく用いられる手法で、ディープラーニングとの組み合わせも行われています。
5. **Deep Learning**: ディープラーニングモデルを用いてボードの状態を評価する。AlphaGoやAlphaZeroのような最先端のボードゲームAIは、ディープラーニングとMCTSの組み合わせを使用しています。
6. **データベース**: オープニングブックやエンドゲームのデータベースを使用して、特定の局面での最適な手を即座に決定する。
これらのアルゴリズムや手法は、必要に応じて組み合わせることで、より高度なリバーシのCPUを実装することができます。

ディープラーニングは非常に強力なアルゴリズムですが、実装に手間がかかるため、ここではMiniMaxとHeuristic評価関数を汲み合わせた手法を用います。

次のようにプロンプトを入力します。

Minimax アルゴリズムと、隅の石など取られない石の価値を重視するHeuristic評価関数を組み合わせた実装にしたいと思います。

すると、アルゴリズムのみが出力されたので、追加で以下のプロンプトを入力します。

このアルゴリズムを使って、CPUと対戦を行えるようにしたいです。

CPUからプレイヤーに手番が回らなかったので、この不具合をChatGPTに報告します。

また、CPUが着手したことをわかりやすくするために、プレイヤーが着手してから少なくとも0.1秒後に着手するように変更します。

画像を用いてChatGPTに不具合を報画像をする2

実行してテストプレイを実施した結果がこちらです。

CPUとの対局結果①

CPUの実装はできましたが、簡単に隅を取らせてしまうなど弱かったため、以下の4点を評価関数上で気を付けるべきこととして指示しました。

隅の斜めにあるマスは、打つと不利になる場合が多いです。
隅にある自分の石に繋がっている辺の石はひっくり返されることがないので価値が高いです。
次に相手に隅に石を置かれてしまう手は価値が低いです。
終盤残り10マスになったあたりで、石の数に注意してください。
以上、4点に注意して評価関数を修正してください。

また、プレイヤーに打つ手がない場合の処理が実装されていない、全ての石を取った場合に勝敗判定が行われないなどの不具合がテストプレイで見つかったため、以下のプロンプトを入力しました。
また、思考時間の長さを解決するため、Alpha-Beta Pruningを使い、さらに探索深度を深くすることでCPUの強化を図りました。

プレイヤーが打てない場合もパスの処理をしてください。
また、パスを行う際はダイアログを表示してください。
Alpha-Beta Pruningで実装してください。また、それに伴い探索深度をより深くして下さい。
さらに深度を深くして下さい。また、どちらかが全ての石を取った場合は、ゲームを終了してください。

これらの処理を行った後で、テストプレイを行った結果が以下の通りです。

リバーシの最終的な完成形

まだまだCPUとしては弱いですが、先ほどよりは強いCPUを作ることが出来ました。
これ以上に改良するのは手間がかかりそうなので、これでひとまず完成としたいと思います。


更なる改良点

リバーシを遊ぶことができるコードを作成することが出来ましたが、さらに黒番白番をプレイヤーが選べるようにする、CPUの強さを選べるようにするなどの改良点が挙げられます。

これらの要望をChatGPTにプロンプトとして実装を指示することで、短時間で欲しい機能を実装することができます。


最終的に作成したコード

ChatGPTの指示に従い、最終的に生成したコードをgithubにアップロードしました。

FSYusai/Reversi: ChatGPTで生成したリバーシのコード (github.com)

十分なテストを行っていないため、バグや不具合などが残っている可能性がある旨をご了承ください。


まとめ

本記事を通じて、ChatGPTを利用し、繁雑なコードを書くことなく「リバーシ」の実装を実現する方法を探求しました。GPT-4Vの能力を垣間見ることができたのではないでしょうか。その力は、ゲーム作成だけに留まらず、アプリケーションやウェブサイトの開発にも多大なる貢献をもたらします。

しかし、その一方で、ChatGPTやGPT-4Vが非常に強力であると感じられるかもしれませんが、これがプログラミングの知識を完全に置き換えるものであるとは言えません。実際に、効果的なプロンプトの設計や、特定のデバッグ作業、そして独自のアルゴリズムを考案する際には、基本的なプログラミングの知識や経験が不可欠です。技術的背景や知識は、生成AIとのより深い連携や、より洗練された結果を生むための鍵となるのです。

最後に、この記事がChatGPTとの新しい関わり方や、その可能性を広げる一助となれば幸いです。



【著者】

ゆうさい

フォワードソフト株式会社のエンジニア。Java、Python、JavaScript、C#などの言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をする方法を考えるのが好きです。 最近はジェネレーティブAIの業務利用に関する検証を行っています。 資格を通じて知識を吸収することを心がけており、セキュリティスペシャリスト、データベーススペシャリスト、応用情報技術者、Oracle Certified Java Programmer Gold SE 11、Pythin3 エンジニア認定試験、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。

編集した記事一覧

正社員/フリーランスの方でこのようなお悩みありませんか?

  • 自分に合う案件を定期的に紹介してもらいたい
  • 週2、リモートワークなど自由な働き方をしてみたい
  • 面倒な案件探し・契約周りは任せて仕事に集中したい

そのような方はぜひ、Workteriaサイトをご利用ください!

  • 定期的にご本人に合う高額案件を紹介

  • リモートワークなど自由な働き方ができる案件多数

  • 専属エージェントが契約や請求をトータルサポート