저는 주말에 시간이 날 때마다 소소하고 엉뚱한 코딩을 즐깁니다. 그러한 아이디어 중 하나가 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(Universal Chess Interface) 형식은 시작 및 끝 사각형을 지정하는 이동에 사용됩니다(예: 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를 시도하여 테스트할 수 있습니다.
이로 인해 빠른 장군이 됩니다.
이제 AI가 한쪽을 맡을 차례입니다. 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
다음으로 보드 상태(FEN(Forsyth-Edwards Notation) 형식)를 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와 대결할 수 있는 기능적인 체스 게임이 생겼습니다. 코드에는 개선할 여지가 많지만 이미 플레이 가능합니다. 재미있는 다음 단계는 두 AI를 서로 대결시켜 전투를 벌이는 것입니다.
코드는 GitHub에서 확인할 수 있습니다. 즐거운 실험을 즐겨보세요!
위 내용은 Python과 OpenAI를 사용하여 체스 게임 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!