ホームページ > バックエンド開発 > Python チュートリアル > Python と OpenAI を使用してチェス ゲームを構築する

Python と OpenAI を使用してチェス ゲームを構築する

Patricia Arquette
リリース: 2024-11-26 06:30:12
オリジナル
726 人が閲覧しました

Building a Chess Game with Python and OpenAI

週末の自由時間があるときはいつでも、小さくて愚かなことをコーディングするのを楽しんでいます。そのようなアイデアの 1 つが、OpenAI と対戦できるコマンドライン チェス ゲームになりました。私はこれを、ギリシャ語でチェスを意味する「Skaki」からインスピレーションを得て、「SkakiBot」と名付けました。

優れた Python-chess ライブラリがすべてのチェスの仕組みを処理します。目標は、チェス エンジンをゼロから構築することではなく、OpenAI をこのようなプロジェクトにいかに簡単に統合できるかを実証することです。

コードを詳しく調べて、すべてがどのように結合されるかを見てみましょう!

エントリーポイント

まず、ユーザー入力を受け取り、チェスのロジックの基礎を準備する基本的なゲーム ループを設定します。

def main():
    while True:
        user_input = input("Enter your next move: ").strip()

        if user_input.lower() == 'exit':
            print("Thanks for playing SkakiBot. Goodbye!")
            break

        if not user_input:
            print("Move cannot be empty. Please try again.")
            continue

        print(f"You entered: {user_input}")
ログイン後にコピー
ログイン後にコピー

この時点では、コードはあまり機能しません。ユーザーに入力を求め、検証して出力するだけです。

Enter your next move: e2e4
You entered: e2e4
Enter your next move: exit
Thanks for playing SkakiBot. Goodbye!
ログイン後にコピー

チェスライブラリの追加

次に、ボード管理、手の検証、ゲーム終了のシナリオを処理する Python-chess を導入します。

pip install chess
ログイン後にコピー

ライブラリがインストールされているので、チェス盤を初期化し、ユーザー入力を求める前に印刷できます。

import chess

def main():
    board = chess.Board()

    while not board.is_game_over():
        print(board)

        user_input = input("Enter your next move (e.g., e2e4): ").strip()

        if user_input.lower() == 'exit':
            print("Thanks for playing SkakiBot. Goodbye!")
            break
ログイン後にコピー

移動検証の追加

ゲームを機能させるには、ユーザー入力を検証し、正当な手をボードに適用する必要があります。 UCI (ユニバーサル チェス インターフェイス) 形式が動きに使用され、開始マスと終了マスを指定します (e2e4 など)。

def main():
    board = chess.Board()

    while not board.is_game_over():
        # ...

        try:
            move = chess.Move.from_uci(user_input)
            if move in board.legal_moves:
                board.push(move)
                print(f"Move '{user_input}' played.")
            else:
                print("Invalid move. Please enter a valid move.")
        except ValueError:
            print("Invalid move format. Use UCI format like 'e2e4'.")
ログイン後にコピー

エンドゲームの処理

チェックメイトやステイルメイトなどのゲーム終了シナリオを処理できるようになりました:

def main():
    board = chess.Board()

    while not board.is_game_over():
        # ...

    if board.is_checkmate():
        print("Checkmate! The game is over.")
    elif board.is_stalemate():
        print("Stalemate! The game is a draw.")
    elif board.is_insufficient_material():
        print("Draw due to insufficient material.")
    elif board.is_seventyfive_moves():
        print("Draw due to the seventy-five-move rule.")
    else:
        print("Game ended.")
ログイン後にコピー

この段階では、両方の側でプレーします。 UCI 形式で次の動きを使って Fool's Mate を試してみることでテストできます:

  • f2f3
  • e7e5
  • g2g4
  • d8h4

これにより、迅速なチェックメイトが行われます。

OpenAIの統合

今度は AI に一方の側を引き継がせる時が来ました。 OpenAI はボードの状態を評価し、最善の手を提案します。

OpenAI キーの取得

まず、環境から OpenAI API キーを取得します。

# config.py

import os

def get_openai_key() -> str:
    key = os.getenv("OPENAI_API_KEY")
    if not key:
        raise EnvironmentError("OpenAI API key is not set. Please set 'OPENAI_API_KEY' in the environment.")
    return key
ログイン後にコピー

AI技生成

次に、ボードの状態を Forsyth-Edwards Notation (FEN) 形式で OpenAI に送信し、提案された手を取得する関数を作成します。

def get_openai_move(board):
    import openai
    openai.api_key = get_openai_key()
    board_fen = board.fen()

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": (
                "You are an expert chess player and assistant. Your task is to "
                "analyse chess positions and suggest the best move in UCI format."
            )},
            {"role": "user", "content": (
                "The current chess board is given in FEN notation:\n"
                f"{board_fen}\n\n"
                "Analyse the position and suggest the best possible move. Respond "
                "with a single UCI move, such as 'e2e4'. Do not provide any explanations."
            )}
        ])

    suggested_move = response.choices[0].message.content.strip()
    return suggested_move
ログイン後にコピー

プロンプトは単純ですが、有効な動きを生成するのに効果的です。これは、OpenAI が理事会の状態を理解し、UCI 形式で法的な措置に対応するのに十分なコンテキストを提供します。

ボードの状態は FEN 形式で送信され、駒の位置、誰の順番、キャスリング権、その他の詳細を含むゲームの完全なスナップショットが得られます。 OpenAI の API はステートレスであり、リクエスト間で情報を保持しないため、これは理想的です。そのため、各リクエストには必要なコンテキストをすべて含める必要があります。

今のところ、簡単にするためにモデルは gpt-3.5-turbo としてハードコーディングされていますが、API キーの場合と同様に、環境から取得する方がよいでしょう。これにより、後で更新したり、別のモデルでテストしたりすることが容易になります。

最後のゲームループ

最後に、AI をメインのゲーム ループに統合できます。 AI はユーザーが移動するたびにボードを評価し、その応答を再生します。

def main():
    while True:
        user_input = input("Enter your next move: ").strip()

        if user_input.lower() == 'exit':
            print("Thanks for playing SkakiBot. Goodbye!")
            break

        if not user_input:
            print("Move cannot be empty. Please try again.")
            continue

        print(f"You entered: {user_input}")
ログイン後にコピー
ログイン後にコピー

それだけです!これで、OpenAI と対戦できる機能的なチェス ゲームが完成しました。コードには改善の余地がたくさんありますが、すでにプレイ可能です。次の楽しいステップは、2 つの AI を互いに戦わせ、戦わせることです。

コードは GitHub で入手できます。楽しんで実験してください!

以上がPython と OpenAI を使用してチェス ゲームを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート