Rumah > pembangunan bahagian belakang > Tutorial Python > Membina Permainan Catur dengan Python dan OpenAI

Membina Permainan Catur dengan Python dan OpenAI

Patricia Arquette
Lepaskan: 2024-11-26 06:30:12
asal
768 orang telah melayarinya

Building a Chess Game with Python and OpenAI

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!

Titik Kemasukan

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}")
Salin selepas log masuk
Salin selepas log masuk

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!
Salin selepas log masuk

Menambah Perpustakaan Catur

Seterusnya, kami membawa masuk python-chess, yang akan mengendalikan pengurusan papan, pengesahan pergerakan dan senario penamat permainan.

pip install chess
Salin selepas log masuk

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
Salin selepas log masuk

Menambah Pengesahan Pindah

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'.")
Salin selepas log masuk

Mengendalikan Endgames

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.")
Salin selepas log masuk

Pada peringkat ini, anda bermain untuk kedua-dua belah pihak. Anda boleh mengujinya dengan mencuba Fool's Mate dengan langkah berikut dalam format UCI:

  • f2f3
  • e7e5
  • g2g4
  • d8h4

Ini mengakibatkan checkmate yang cepat.

Mengintegrasikan OpenAI

Kini tiba masanya untuk membiarkan AI mengambil alih satu pihak. OpenAI akan menilai keadaan lembaga dan mencadangkan langkah terbaik.

Mengambil Kunci OpenAI

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
Salin selepas log masuk

Penjanaan AI Move

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
Salin selepas log masuk

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.

Gelung Permainan Akhir

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}")
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan