> 백엔드 개발 > 파이썬 튜토리얼 > Python과 OpenAI를 사용하여 체스 게임 구축

Python과 OpenAI를 사용하여 체스 게임 구축

Patricia Arquette
풀어 주다: 2024-11-26 06:30:12
원래의
771명이 탐색했습니다.

Building a Chess Game with Python and OpenAI

저는 주말에 시간이 날 때마다 소소하고 엉뚱한 코딩을 즐깁니다. 그러한 아이디어 중 하나가 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를 시도하여 테스트할 수 있습니다.

  • 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 무브 제너레이션

다음으로 보드 상태(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿