Saya gemar mengekod perkara-perkara kecil dan mengarut setiap kali saya mempunyai masa lapang pada hujung minggu. Satu idea sedemikian bertukar menjadi permainan catur baris arahan di mana anda boleh bermain menentang OpenAI. Saya memanggilnya "SkakiBot," diilhamkan oleh "Skaki," perkataan Yunani untuk catur.
Perpustakaan catur python yang sangat baik menjaga semua mekanik catur. Matlamatnya bukan untuk membina enjin catur dari awal tetapi untuk menunjukkan betapa mudahnya OpenAI boleh disepadukan ke dalam projek seperti ini.
Mari kita mendalami kod tersebut dan lihat bagaimana ia digabungkan!
Kami akan mulakan dengan menyediakan gelung permainan asas yang mengambil input pengguna dan menyediakan asas untuk logik catur.
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}")
Pada ketika ini, kod tidak banyak membantu. Ia hanya menggesa pengguna untuk input, mengesahkannya dan mencetaknya:
Enter your next move: e2e4 You entered: e2e4 Enter your next move: exit Thanks for playing SkakiBot. Goodbye!
Seterusnya, kami membawa masuk python-chess, yang akan mengendalikan pengurusan papan, pengesahan pergerakan dan senario penamat permainan.
pip install chess
Dengan pustaka dipasang, kami boleh memulakan papan catur dan mencetaknya sebelum menggesa input pengguna:
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
Untuk menjadikan permainan berfungsi, kami perlu mengesahkan input pengguna dan menggunakan langkah undang-undang pada papan. Format UCI (Antara Muka Catur Universal) digunakan untuk pergerakan, di mana anda menentukan petak permulaan dan penamat (cth., 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'.")
Kami kini boleh mengendalikan senario tamat permainan seperti checkmate atau stalemate:
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.")
Pada peringkat ini, anda bermain untuk kedua-dua belah pihak. Anda boleh mengujinya dengan mencuba Fool's Mate dengan langkah berikut dalam format UCI:
Ini mengakibatkan checkmate yang cepat.
Kini tiba masanya untuk membiarkan AI mengambil alih satu pihak. OpenAI akan menilai keadaan lembaga dan mencadangkan langkah terbaik.
Kami mulakan dengan mengambil kunci API OpenAI daripada persekitaran:
# 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
Seterusnya, kami menulis fungsi untuk menghantar keadaan papan - dalam format Notasi Forsyth-Edwards (FEN) - ke OpenAI dan mendapatkan semula langkah yang dicadangkan:
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
Gesaan itu mudah, tetapi ia berfungsi dengan baik untuk menjana pergerakan yang sah. Ia menyediakan konteks yang mencukupi untuk OpenAI memahami keadaan lembaga dan bertindak balas dengan langkah undang-undang dalam format UCI.
Keadaan papan dihantar dalam format FEN, yang memberikan gambaran lengkap permainan, termasuk kedudukan bahagian, gilirannya, hak castling dan butiran lain. Ini sesuai kerana API OpenAI adalah tanpa kewarganegaraan dan tidak menyimpan maklumat antara permintaan, jadi setiap permintaan mesti merangkumi semua konteks yang diperlukan.
Buat masa ini, model ini dikodkan keras sebagai gpt-3.5-turbo untuk kesederhanaan, tetapi adalah lebih baik untuk mengambilnya dari persekitaran, seperti yang kami lakukan untuk kunci API. Ini akan memudahkan untuk mengemas kini atau menguji dengan model yang berbeza kemudian.
Akhir sekali, kami boleh menyepadukan AI ke dalam gelung permainan utama. AI menilai papan selepas setiap pengguna bergerak dan memainkan responsnya.
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}")
Itu sahaja! Anda kini mempunyai permainan catur yang berfungsi di mana anda boleh bermain menentang OpenAI. Terdapat banyak ruang untuk penambahbaikan dalam kod, tetapi ia sudah boleh dimainkan. Langkah seterusnya yang menyeronokkan ialah mengadu dua AI antara satu sama lain dan biarkan mereka bertarung.
Kod ini tersedia di GitHub. Selamat mencuba!
Atas ialah kandungan terperinci Membina Permainan Catur dengan Python dan OpenAI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!