首頁 後端開發 Python教學 使用 Python 和 OpenAI 建立國際象棋遊戲

使用 Python 和 OpenAI 建立國際象棋遊戲

Nov 26, 2024 am 06:30 AM

Building a Chess Game with Python and OpenAI

只要週末有空閒時間,我就喜歡寫一些小而愚蠢的東西。其中一個想法變成了一款命令列國際象棋遊戲,您可以在其中與 OpenAI 對抗。我將其命名為“SkakiBot”,靈感來自“Skaki”,希臘語中的國際象棋單字。

優秀的 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.")
登入後複製

在這個階段,你為雙方效力。您可以透過嘗試 Fool's Mate 來測試它,並按照 UCI 格式執行以下動作:

  • f2f3
  • e7e5
  • g2g4
  • d8h4

這會導致快速將死。

整合 OpenAI

現在是時候讓人工智慧接管一邊了。 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 在每個用戶移動後評估棋盤並播放其回應。

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 對抗。程式碼還有很大的改進空間,但它已經可以玩了。有趣的下一步是讓兩個人工智慧相互對抗,讓他們一決勝負。

程式碼可在 GitHub 上取得。祝實驗愉快!

以上是使用 Python 和 OpenAI 建立國際象棋遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python標準庫的哪一部分是:列表或數組? Python標準庫的哪一部分是:列表或數組? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

學習Python:2小時的每日學習是否足夠? 學習Python:2小時的每日學習是否足夠? Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python vs. C:了解關鍵差異 Python vs. C:了解關鍵差異 Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

See all articles