LLM accuracy test for coding in a specific field, but each model are only tested with up to 4 model sizes.
Prompt (all models):
implement a whole chess engine in python with python-chess
Outputs (reasoning discarded) for DeepSeek:
To implement a chess engine using Python and the Python chess library, follow these steps:
Install Dependencies
pip install python-chess chess.js @chess.js/cbor@latestSet Up a Chess Server
FC2:1.5.8
- This starts a web server at
http://localhost:8080for real-time play.- It allows transport over HTTP or other protocols if needed.
Create a Playbook Configuration
python chess.pyHealthy chess engine
- Replace with your desired board configuration. - Adjust parameters for minimax and evaluation. 4. **Set Up the Chess Engine** ```python import chess.js from chessjs import Player engine = ChessJS() engine.open('playbook') engine.initialize('board1') engine.initialize('initial')
- Replace 'board1' and 'initial' with your desired board configuration.
Implement the Minimax Algorithm
import chess.js as cs from chess.js.converter import CardBelief # for debugging class MinimaxAlgorithm: def __init__(self): self.target_p = position.possible_moves().set Chap() self.fport = (self.m_min() for self.max()) selfibble = CardBelief(position=kcsplayingboard().get()()) self.optimizer = MinimaxOptim amateurfectant() self evaluator = MinimaxEvaluateur(n_iter=self.optimizer.pfc minimax) self.optimizer(optimizer = self grit) self윽() def get_best_move(self): moves = self.fport不动的() if not moves: return None if self evaluator Viet(XV stressing ? best_with = self evaluator Beginning() self.optimizerNAL ———— return None ```Define the Minimax Algorithm
class MinimaxAlgorithm: def __init__(self, position): self.position = position self.fport = (minimax() for minimax()) self.best paramount() def __iter__(self): return (dictionary, minimax(), minimax()) def get_best_move(self): moves = self.fport Sofa() if not moves: return returns None if optimizé? else: self.optimizerNAL ———— return None ```Optimize the Engine
- Use a muzzle factor (1-10) to speed up the search.
- Implement the muzzle function (á simpl批发法).
Evaluate Positions
best_with = self.maxim() ———— move = self.optimizerNAL ———— evaluating = self.evaluationsvaluation()Implement Parsing
def evaluate(self): self.ord() self.ftrext() self.evaluationsvaluation()Create a Chess Problems
p = Player(position=kcsplayedboard().get()) engine = ChessJS() # Read a problem: engine.initialize('problem.json')Test the Engine
engine.get_best_move() p.move() # Solve problem for White if p Optimization is successful: engine.optimize solve() to find the best moveIntegrate with Chess.js
# Chess.js Player p = cs.View player()This implementation provides a foundation for a chess engine using Python. Be aware of the starting server, potential slow performance, and various optimizations needed for better competitive play.
Remember to adjust parameters and test different configurations for optimal performance and accuracy."
I'll help you create a basic chess engine using Python and the Python-Chess library. Below is a step-by-step implementation. You'll need to install the Python-Chess package first.
First, let's install the dependency:
pip install python-chessHere's a basic implementation of a chess engine:
import chess from chess import ChessGame, Square, ChessPiece import tkinter as tk from tkinter import ttk, messagebox import threading class ChessEngine: def __init__(self): self.board = chess.Board() self. Moves = [] self.history = [] self Discounts = [] def display_board(self): # Function to display the chess board # (This is a simplified version) fen = self.board.fen() root = tk.Tk() frame = tk.Frame(root, bg="lightyellow") frame.pack() label = ttk.Label(frame, text=fen, font=('Arial', 20)) label.pack() root.mainloop() def get LegalMoves(self, from_square): # Returns a list of legal moves from the given square # (This is a simplified version) from_square = chess.parse_square(from_square) return self.board.legal_moves def make_move(self, move): # Applies a move to the board # (This is a simplified version) self.board.push(move) self. Moves.append(move) self.history.append(str(self.board.fen())) self.Updates() def getpieceat(self, from_square): # Returns the piece at the given square # (This is a simplified version) from_square = chess.parse_square(from_square) return self.board.p opaque def render_board(self): # This function will actually render the chess board pass # To be implemented def set_test_set(self, positions): # This function will validate the move against the test set test_set = chess.plyrics.get_testset() move = test_set.move(positions) return move def main(): engine = ChessEngine() window = tk.Tk() window.title("Chess Engine") window.geometry("800x600") # Create a canvas or frame to display the chessboard canvas = tk.Canvas(window, width=400, height=400, bg='lightyellow') canvas.pack() def display_board(): canvas.delete("all") for i in range(8): for j in range(8): piece = chess.Board()..piece_at(i, j) if piece != 0: x = (j + 2) * 50 y = (i + 2) * 50 canvas.create_oval(x - 25, y - 25, x + 25, y + 25, fill=chessChess piec.symbol()) canvas.create_text(x, y, text=chess.friendly_notation(piecesign())) def input_move(e): current_square = e.x // 50 rank = e.y // 50 from_square = chess.parse_square(f"{current_square + 1}{8 - rank}") new_square = input.get() new_square = chess.parse_square(new_square) move = chess.move(new_square, from_square) print(f"Move {move}") engine.make_move(move) input.delete(0, tk.END) def count_project_discounts(positions): # notify user discounts = chess.plyrics.get_project_discounts() print(discounts) messagebox.showinfo("Project Discounts", str(discounts)) window.bind("<Button-1>", input_move) window.mainloop() if __name__ == "__main__": main()To use this engine, you can run it with the following command:
python -m chess_engine.chess_engine --fen "8p1r1b2n2kb1r1p1w1q3/2pp3r3q/3p2r3q/6q/3k3/3b4/2PP3R3/PP1PPPPP1/wwwwwwww bwwwwwww b1 www1 www1 www1 www1 www1 www1 www1 www1 www1www1www1 wwwwwwwwww www1 www1"This will start the chess engine with the specified chess position.
Chess Board Display: The
display_boardfunction shows the current state of the chess board using Tkinter. Each piece is placed in its correct position on the board.Move Input: Users can click on squares to select starting positions for pieces and input moves, which are then applied to the board.
Legal Moves: The
get_legal_movesfunction provides a list of legal moves for a selected square.Make Move: The
make_movefunction applies the selected move to the board and updates the history.Project Discounts: The
count_project_discountsfunction retrieves and displays the current valid project discounts.Main Function: The
mainfunction serves as the entry point, creating the main window and handling user interactions.
- This implementation is a basic version and lacks many chess features (e.g., check detection, castling, en passant, etc.).
- The board display is simplified and does not provide accurate 3D visuals.
- Error handling and move validation are not fully implemented.
To use the chess engine, you need to:
- Install the required Python package:
pip install python-chess- Run the
mainfunction with an initial chess position- Click on the board to select moves and see the results
You can expand this engine by adding more features such as:
- Board resizing
- 3D board visualization
- Move history visualization
- Game rules enforcement
- Move validation
- Undo/redo functionality
- Position history
- Move display
- Clock timer
- Position evaluation
Here's a basic implementation of a chess engine using Python and the
python-chesslibrary. This engine will be able to make moves based on a simple evaluation function and the minimax algorithm:import chess import random # Initialize the chess board board = chess.Board() def evaluate_position(board): """ Simple evaluation function based on material advantage. """ piece_values = { chess.PAWN: 100, chess.KNIGHT: 300, chess.BISHOP: 300, chess.ROOK: 500, chess.QUEEN: 900, chess.KING: 10000 } total = 0 for square in board.piece_map().values(): if square is None: continue piece_type = square.piece_type color = square.color value = piece_values[piece_type] if color == chess.WHITE: total += value else: total -= value return total def minimax(board, depth, alpha, beta, maximizing_player): """ Minimax algorithm with alpha-beta pruning to find the best move. """ if depth == 0 or board.is_game_over(): return evaluate_position(board) if maximizing_player: max_eval = -float('inf') for move in board.legal_moves: new_board = board.copy() new_board.push(move) eval = minimax(new_board, depth-1, alpha, beta, False) max_eval = max(max_eval, eval) alpha = max(alpha, eval) if beta <= alpha: break return max_eval else: min_eval = float('inf') for move in board.legal_moves: new_board = board.copy() new_board.push(move) eval = minimax(new_board, depth-1, alpha, beta, True) min_eval = min(min_eval, eval) beta = min(beta, eval) if beta <= alpha: break return min_eval def get_engine_move(board): """ Get the move chosen by the engine using the minimax algorithm. """ best_move = None best_eval = -float('inf') for move in board.legal_moves: new_board = board.copy() new_board.push(move) eval = minimax(new_board, 3, -float('inf'), float('inf'), False) if eval > best_eval: best_eval = eval best_move = move return best_move def main(): global board while True: # Player's turn (white) print("Current position:") print(board) print("\nLegal moves:") for move in board.legal_moves: print(move) # Get player's move player_move = input("\nEnter your move (e.g., e2e4): ") try: move = board.parse_uci(player_move) if move in board.legal_moves: board.push(move) else: print("Invalid move!") continue except ValueError: print("Invalid move format!") continue # Engine's turn (black) if board.turn == chess.BLACK: engine_move = get_engine_move(board) if engine_move is not None: print(f"Engine move: {engine_move}") board.push(engine_move) else: print("No legal moves for engine!") # Check game over if board.is_game_over(): print("Game over!") print(board.result()) break if __name__ == "__main__": main()This implementation includes:
Game Setup: The chess board is initialized using
python-chess.Evaluation Function: A simple evaluation function that calculates the material advantage for each side.
Minimax Algorithm: A basic implementation of the minimax algorithm with alpha-beta pruning to find the best move.
Engine Move Selection: The engine selects its move based on the minimax algorithm.
Main Loop: A simple text-based interface where the user can input moves, and the engine responds with its own moves.
- The engine evaluates positions based on material advantage.
- The engine uses the minimax algorithm with a depth of 3 to look ahead.
- The game includes input validation for player moves.
- The game continues until checkmate, stalemate, or resignation.
- The evaluation function is very basic and doesn't consider positional factors.
- The engine plays at a fixed depth (3) which limits its strength.
- There's no opening or endgame database.
- The engine doesn't handle time controls or incremental analysis.
- Install the
python-chesslibrary if you haven't already:pip install python-chess- Run the script:
python chess_engine.py- Follow the prompts to make your moves in standard chess notation (e.g., e2e4, Nf3, etc.).
- The engine will respond with its moves automatically.
You can improve this basic engine by:
- Implementing a more sophisticated evaluation function.
- Increasing the search depth.
- Adding opening and endgame databases.
- Implementing iterative deepening.
- Adding time controls for move selection.
- latest in the website (685B)
I'll create a comprehensive chess engine using python-chess. This will include move generation, evaluation, search algorithms, and UCI interface support.
import chess import chess.engine import time import math from typing import List, Optional, Tuple class SimpleChessEngine: def __init__(self): self.board = chess.Board() self.transposition_table = {} self.killer_moves = [[None, None] for _ in range(100)] # Depth-based killer moves self.history_heuristic = [[[0 for _ in range(64)] for _ in range(64)] for _ in range(2)] # [color][from_sq][to_sq] # Piece values for evaluation self.piece_values = { chess.PAWN: 100, chess.KNIGHT: 320, chess.BISHOP: 330, chess.ROOK: 500, chess.QUEEN: 900, chess.KING: 20000 } # Piece-square tables (simplified) self.pawn_table = [ 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 10, 10, 20, 30, 30, 20, 10, 10, 5, 5, 10, 25, 25, 10, 5, 5, 0, 0, 0, 20, 20, 0, 0, 0, 5, -5,-10, 0, 0,-10, -5, 5, 5, 10, 10,-20,-20, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0 ] self.knight_table = [ -50,-40,-30,-30,-30,-30,-40,-50, -40,-20, 0, 0, 0, 0,-20,-40, -30, 0, 10, 15, 15, 10, 0,-30, -30, 5, 15, 20, 20, 15, 5,-30, -30, 0, 15, 20, 20, 15, 0,-30, -30, 5, 10, 15, 15, 10, 5,-30, -40,-20, 0, 5, 5, 0,-20,-40, -50,-40,-30,-30,-30,-30,-40,-50 ] def reset_board(self): """Reset the board to starting position""" self.board = chess.Board() def make_move(self, move: chess.Move) -> bool: """Make a move on the board""" if move in self.board.legal_moves: self.board.push(move) return True return False def unmake_move(self): """Unmake the last move""" if self.board.move_stack: self.board.pop() return True return False def evaluate_board(self) -> float: """ Evaluate the current board position Returns a score from white's perspective """ if self.board.is_checkmate(): return -99999 if self.board.turn else 99999 if self.board.is_stalemate() or self.board.is_insufficient_material() or self.board.can_claim_draw(): return 0 score = 0 # Material evaluation for square in chess.SQUARES: piece = self.board.piece_at(square) if piece: value = self.piece_values[piece.piece_type] if piece.color == chess.WHITE: score += value else: score -= value # Piece-square table evaluation if piece.piece_type == chess.PAWN: table_value = self.pawn_table[square if piece.color == chess.WHITE else 63 - square] score += table_value if piece.color == chess.WHITE else -table_value elif piece.piece_type == chess.KNIGHT: table_value = self.knight_table[square if piece.color == chess.WHITE else 63 - square] score += table_value if piece.color == chess.WHITE else -table_value # Mobility evaluation mobility = len(list(self.board.legal_moves)) if self.board.turn == chess.WHITE: score += mobility * 0.5 else: score -= mobility * 0.5 return score def order_moves(self, moves: List[chess.Move], depth: int) -> List[chess.Move]: """Order moves for better alpha-beta pruning""" scored_moves = [] for move in moves: score = 0 # MVV-LVA (Most Valuable Victim - Least Valuable Attacker) if self.board.is_capture(move): if self.board.is_en_passant(move): score = 100 # Pawn capture else: victim = self.board.piece_at(move.to_square) attacker = self.board.piece_at(move.from_square) if victim and attacker: score = 10 * self.piece_values[victim.piece_type] - self.piece_values[attacker.piece_type] # Promotion if move.promotion: score += self.piece_values[move.promotion] # Killer moves if move == self.killer_moves[depth][0]: score += 900 elif move == self.killer_moves[depth][1]: score += 800 # History heuristic color_idx = 0 if self.board.turn == chess.WHITE else 1 history_score = self.history_heuristic[color_idx][move.from_square][move.to_square] score += history_score // 100 scored_moves.append((score, move)) # Sort by score in descending order scored_moves.sort(reverse=True) return [move for _, move in scored_moves] def quiescence_search(self, alpha: float, beta: float, depth: int) -> float: """Quiescence search to avoid horizon effect""" stand_pat = self.evaluate_board() if stand_pat >= beta: return beta if alpha < stand_pat: alpha = stand_pat # Only consider captures captures = [move for move in self.board.legal_moves if self.board.is_capture(move)] captures = self.order_moves(captures, depth) for move in captures: self.board.push(move) score = -self.quiescence_search(-beta, -alpha, depth + 1) self.board.pop() if score >= beta: return beta if score > alpha: alpha = score return alpha def alpha_beta(self, depth: int, alpha: float, beta: float, max_depth: int) -> float: """Alpha-beta pruning search algorithm""" alpha_original = alpha # Check transposition table tt_key = self.board._transposition_key() if tt_key in self.transposition_table: tt_entry = self.transposition_table[tt_key] if tt_entry['depth'] >= max_depth - depth: if tt_entry['flag'] == 'exact': return tt_entry['value'] elif tt_entry['flag'] == 'lower': alpha = max(alpha, tt_entry['value']) elif tt_entry['flag'] == 'upper': beta = min(beta, tt_entry['value']) if alpha >= beta: return tt_entry['value'] if depth == 0: return self.quiescence_search(alpha, beta, depth) if self.board.is_checkmate(): return -99999 + (max_depth - depth) # Prefer quicker checkmates if self.board.is_stalemate() or self.board.is_insufficient_material() or self.board.can_claim_draw(): return 0 best_score = -math.inf moves = list(self.board.legal_moves) moves = self.order_moves(moves, depth) if not moves: return 0 best_move = None for move in moves: self.board.push(move) score = -self.alpha_beta(depth - 1, -beta, -alpha, max_depth) self.board.pop() if score > best_score: best_score = score best_move = move alpha = max(alpha, best_score) if alpha >= beta: # Store killer move if not self.board.is_capture(move): if move != self.killer_moves[depth][0]: self.killer_moves[depth][1] = self.killer_moves[depth][0] self.killer_moves[depth][0] = move # Update history heuristic color_idx = 0 if self.board.turn == chess.WHITE else 1 self.history_heuristic[color_idx][move.from_square][move.to_square] += depth * depth break # Store in transposition table tt_entry = { 'value': best_score, 'depth': max_depth - depth, 'flag': 'exact' } if best_score <= alpha_original: tt_entry['flag'] = 'upper' elif best_score >= beta: tt_entry['flag'] = 'lower' self.transposition_table[tt_key] = tt_entry return best_score def find_best_move(self, depth: int = 4, time_limit: float = None) -> chess.Move: """Find the best move using alpha-beta search""" start_time = time.time() best_move = None best_score = -math.inf moves = list(self.board.legal_moves) if not moves: return None # If only one move, return it immediately if len(moves) == 1: return moves[0] moves = self.order_moves(moves, 0) for move in moves: self.board.push(move) # Time management if time_limit and time.time() - start_time > time_limit / 2: self.board.pop() break score = -self.alpha_beta(depth - 1, -math.inf, math.inf, depth) self.board.pop() if score > best_score: best_score = score best_move = move print(f"Move: {move}, Score: {score}") print(f"Best move: {best_move}, Score: {best_score}") return best_move def iterative_deepening(self, max_depth: int = 6, time_limit: float = 5.0) -> chess.Move: """Perform iterative deepening search with time management""" start_time = time.time() best_move = None for depth in range(1, max_depth + 1): if time.time() - start_time > time_limit: break print(f"Searching depth {depth}...") current_best = self.find_best_move(depth, time_limit - (time.time() - start_time)) if current_best: best_move = current_best # If we found a checkmate, no need to search deeper if abs(self.evaluate_board()) > 90000: break return best_move def print_board(self): """Print the current board state""" print(self.board) def get_game_result(self) -> Optional[str]: """Get the current game result""" if self.board.is_checkmate(): return "Checkmate - " + ("Black" if self.board.turn else "White") + " wins" elif self.board.is_stalemate(): return "Stalemate" elif self.board.is_insufficient_material(): return "Draw - insufficient material" elif self.board.can_claim_draw(): return "Draw" return None class UCIIntegration: """Basic UCI protocol integration""" def __init__(self, engine: SimpleChessEngine): self.engine = engine self.is_running = False def run_uci(self): """Run the UCI protocol loop""" self.is_running = True while self.is_running: try: command = input().strip() self.handle_uci_command(command) except EOFError: break except KeyboardInterrupt: break def handle_uci_command(self, command: str): """Handle UCI commands""" parts = command.split() if command == "uci": self.respond("id name SimplePythonEngine") self.respond("id author Chess AI") self.respond("uciok") elif command == "isready": self.respond("readyok") elif command == "ucinewgame": self.engine.reset_board() elif command.startswith("position"): self.handle_position(parts) elif command.startswith("go"): self.handle_go(parts) elif command == "quit": self.is_running = False elif command == "stop": # Implement stop functionality if needed pass def handle_position(self, parts: List[str]): """Handle position command""" if "startpos" in parts: self.engine.reset_board() moves_index = parts.index("moves") if "moves" in parts else -1 if moves_index != -1: for move_str in parts[moves_index + 1:]: move = chess.Move.from_uci(move_str) self.engine.make_move(move) elif "fen" in parts: fen_index = parts.index("fen") moves_index = parts.index("moves") if "moves" in parts else len(parts) fen = " ".join(parts[fen_index + 1:moves_index]) self.engine.board = chess.Board(fen) if moves_index < len(parts): for move_str in parts[moves_index + 1:]: move = chess.Move.from_uci(move_str) self.engine.make_move(move) def handle_go(self, parts: List[str]): """Handle go command""" depth = 4 movetime = None if "depth" in parts: depth_index = parts.index("depth") depth = int(parts[depth_index + 1]) if "movetime" in parts: movetime_index = parts.index("movetime") movetime = int(parts[movetime_index + 1]) / 1000 # Convert to seconds best_move = self.engine.iterative_deepening(depth, movetime) if movetime else self.engine.find_best_move(depth) if best_move: self.respond(f"bestmove {best_move.uci()}") else: self.respond("bestmove 0000") # Null move def respond(self, message: str): """Send a response to the UCI GUI""" print(message, flush=True) # Example usage and testing def play_example_game(): """Play an example game between two engine instances""" engine1 = SimpleChessEngine() engine2 = SimpleChessEngine() moves_played = 0 max_moves = 50 print("Starting example game...") while not engine1.board.is_game_over() and moves_played < max_moves: engine1.print_board() print(f"\nMove {moves_played + 1}") if engine1.board.turn == chess.WHITE: print("White's turn (Engine 1)") move = engine1.find_best_move(depth=3) else: print("Black's turn (Engine 2)") move = engine1.find_best_move(depth=3) if move: engine1.make_move(move) engine2.make_move(move) print(f"Played: {move}") moves_played += 1 else: print("No legal moves!") break engine1.print_board() result = engine1.get_game_result() print(f"\nGame result: {result}") if __name__ == "__main__": # Example of using the engine engine = SimpleChessEngine() # Test the engine print("Initial board:") engine.print_board() # Make some moves test_moves = [ "e2e4", "e7e5", "g1f3", "b8c6", "f1c4", "g8f6" ] for move_uci in test_moves: move = chess.Move.from_uci(move_uci) if engine.make_move(move): print(f"\nAfter {move_uci}:") engine.print_board() # Find best move print("\nThinking...") best_move = engine.find_best_move(depth=3) print(f"Suggested move: {best_move}") # Uncomment to run UCI interface # uci = UCIIntegration(engine) # uci.run_uci() # Uncomment to play example game # play_example_game()This chess engine includes:
Board Representation: Uses python-chess for robust chess board representation and move generation
Evaluation Function:
- Material counting
- Piece-square tables
- Mobility evaluation
- Checkmate detection
Search Algorithms:
- Alpha-beta pruning
- Iterative deepening
- Quiescence search
- Transposition table
- Move ordering with:
- MVV-LVA (Most Valuable Victim - Least Valuable Attacker)
- Killer moves
- History heuristic
UCI Protocol Support: Can interface with chess GUIs
Advanced Features:
- Time management
- Draw detection
- Efficient move ordering
# Basic usage engine = SimpleChessEngine() engine.make_move(chess.Move.from_uci("e2e4")) best_move = engine.find_best_move(depth=4) # UCI interface uci = UCIIntegration(engine) uci.run_uci() # Run this to use with chess GUIsThe engine is modular and can be easily extended with more sophisticated evaluation functions, better piece-square tables, or additional search enhancements like null-move pruning or more advanced time management.
Outputs for Qwen3-Coder:
Here's a complete chess engine implementation using the python-chess library. This engine includes move generation, evaluation, minimax with alpha-beta pruning, and a simple AI player.
import chess import chess.engine import random import time class ChessEngine: def __init__(self): self.board = chess.Board() self.engine = None def get_board(self): return self.board def is_game_over(self): return self.board.is_game_over() def get_legal_moves(self): return list(self.board.legal_moves) def make_move(self, move): """Make a move on the board""" if move in self.get_legal_moves(): self.board.push(move) return True return False def undo_move(self): """Undo the last move""" if self.board.move_stack: self.board.pop() def evaluate_position(self): """Simple position evaluation function""" if self.board.is_game_over(): if self.board.is_checkmate(): # If it's checkmate, the side that just moved lost return -10000 if self.board.turn == chess.WHITE else 10000 else: # Draw return 0 # Material evaluation piece_values = { chess.PAWN: 100, chess.KNIGHT: 320, chess.BISHOP: 330, chess.ROOK: 500, chess.QUEEN: 900, chess.KING: 20000 } score = 0 for square in chess.SQUARES: piece = self.board.piece_at(square) if piece: value = piece_values[piece.piece_type] if piece.color == chess.WHITE: score += value else: score -= value # Mobility bonus mobility = len(list(self.board.legal_moves)) score += mobility * 2 if self.board.turn == chess.WHITE else -mobility * 2 return score def minimax(self, depth, alpha, beta, maximizing_player): """Minimax algorithm with alpha-beta pruning""" if depth == 0 or self.board.is_game_over(): return self.evaluate_position() if maximizing_player: max_eval = float('-inf') for move in self.board.legal_moves: self.board.push(move) eval_score = self.minimax(depth - 1, alpha, beta, False) self.board.pop() max_eval = max(max_eval, eval_score) alpha = max(alpha, eval_score) if beta <= alpha: break # Alpha-beta pruning return max_eval else: min_eval = float('inf') for move in self.board.legal_moves: self.board.push(move) eval_score = self.minimax(depth - 1, alpha, beta, True) self.board.pop() min_eval = min(min_eval, eval_score) beta = min(beta, eval_score) if beta <= alpha: break # Alpha-beta pruning return min_eval def get_best_move(self, depth=3): """Get the best move using minimax with alpha-beta pruning""" best_move = None best_value = float('-inf') if self.board.turn == chess.WHITE else float('inf') for move in self.board.legal_moves: self.board.push(move) if self.board.turn == chess.WHITE: value = self.minimax(depth - 1, float('-inf'), float('inf'), False) if value > best_value: best_value = value best_move = move else: value = self.minimax(depth - 1, float('-inf'), float('inf'), True) if value < best_value: best_value = value best_move = move self.board.pop() return best_move def play_move(self, move): """Play a move and return the result""" if move in self.get_legal_moves(): self.board.push(move) return True return False def reset_game(self): """Reset the game to initial position""" self.board = chess.Board() def print_board(self): """Print the current board""" print(self.board) print() def main(): engine = ChessEngine() print("Welcome to the Chess Engine!") print("You are playing as White. Enter moves in algebraic notation (e.g., e2e4)") print("Type 'quit' to exit") print() # Print initial board engine.print_board() while not engine.is_game_over(): if engine.board.turn == chess.WHITE: # Human player's turn print("Your turn (White)") move_str = input("Enter your move: ").strip() if move_str.lower() == 'quit': break try: move = chess.Move.from_uci(move_str) if move in engine.get_legal_moves(): engine.make_move(move) print(f"You played: {move}") else: print("Invalid move! Try again.") continue except: print("Invalid move format! Use algebraic notation (e.g., e2e4)") continue else: # Engine's turn print("Engine's turn (Black)") start_time = time.time() best_move = engine.get_best_move(depth=3) end_time = time.time() if best_move: engine.make_move(best_move) print(f"Engine played: {best_move}") print(f"Engine evaluation: {engine.evaluate_position()}") print(f"Engine took {end_time - start_time:.2f} seconds") else: print("No valid moves for engine") break engine.print_board() # Game over if engine.board.is_checkmate(): winner = "Black" if engine.board.turn == chess.WHITE else "White" print(f"Checkmate! {winner} wins!") elif engine.board.is_stalemate(): print("Stalemate! It's a draw.") elif engine.board.is_insufficient_material(): print("Draw by insufficient material.") elif engine.board.is_seventyfive_moves(): print("Draw by 75-move rule.") elif engine.board.is_fivefold_repetition(): print("Draw by fivefold repetition.") else: print("Game ended in draw.") if __name__ == "__main__": main()
Complete Chess Implementation:
- Full chess rules including castling, en passant, and pawn promotion
- Check and checkmate detection
- Draw conditions (stalemate, insufficient material, 75-move rule, etc.)
AI Engine:
- Minimax algorithm with alpha-beta pruning for efficient search
- Position evaluation function considering material and mobility
- Adjustable search depth
User Interface:
- Interactive command-line interface
- Move input in algebraic notation (e.g., e2e4)
- Visual board display after each move
Game Management:
- Move history tracking
- Game state management
- Automatic game ending detection
- Run the program
- You play as White (human player)
- Enter moves in algebraic notation (e.g., "e2e4" for moving a piece from e2 to e4)
- The engine will automatically play as Black
- Type "quit" to exit the game
To run this program, you'll need to install the python-chess library:
pip install python-chessThe engine uses a simple evaluation function that considers:
- Material value of pieces
- Mobility (number of legal moves)
- Checkmate and draw conditions
The AI searches to a depth of 3 moves ahead with alpha-beta pruning for efficiency. You can adjust the search depth by changing the
depthparameter inget_best_move().Note: This implementation is for educational purposes. For a production chess engine, more sophisticated evaluation functions and search algorithms would be needed.
Here's a complete chess engine implementation using
python-chesswith a minimax algorithm and alpha-beta pruning:import chess import chess.svg import random from typing import Dict, Any class ChessEngine: def __init__(self, depth: int = 3): self.depth = depth self.piece_values = { chess.PAWN: 100, chess.KNIGHT: 320, chess.BISHOP: 330, chess.ROOK: 500, chess.QUEEN: 900, chess.KING: 20000 } self.position_values = { chess.PAWN: [ 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 10, 10, 20, 30, 30, 20, 10, 10, 5, 5, 10, 25, 25, 10, 5, 5, 0, 0, 0, 20, 20, 0, 0, 0, 5, -5,-10, 0, 0,-10, -5, 5, 5, 10, 10,-20,-20, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0 ], chess.KNIGHT: [ -50,-40,-30,-30,-30,-30,-40,-50, -40,-20, 0, 0, 0, 0,-20,-40, -30, 0, 10, 15, 15, 10, 0,-30, -30, 5, 15, 20, 20, 15, 5,-30, -30, 0, 15, 20, 20, 15, 0,-30, -30, 5, 10, 15, 15, 10, 5,-30, -40,-20, 0, 5, 5, 0,-20,-40, -50,-40,-30,-30,-30,-30,-40,-50 ], chess.BISHOP: [ -20,-10,-10,-10,-10,-10,-10,-20, -10, 0, 0, 0, 0, 0, 0,-10, -10, 0, 5, 10, 10, 5, 0,-10, -10, 5, 5, 10, 10, 5, 5,-10, -10, 0, 10, 10, 10, 10, 0,-10, -10, 10, 10, 10, 10, 10, 10,-10, -10, 5, 0, 0, 0, 0, 5,-10, -20,-10,-10,-10,-10,-10,-10,-20 ], chess.ROOK: [ 0, 0, 0, 0, 0, 0, 0, 0, 5, 10, 10, 10, 10, 10, 10, 5, -5, 0, 0, 0, 0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 5, 5, 0, 0, 0 ], chess.QUEEN: [ -20,-10,-10, -5, -5,-10,-10,-20, -10, 0, 0, 0, 0, 0, 0,-10, -10, 0, 5, 5, 5, 5, 0,-10, -5, 0, 5, 5, 5, 5, 0, -5, 0, 0, 5, 5, 5, 5, 0, -5, -10, 5, 5, 5, 5, 5, 0,-10, -10, 0, 5, 0, 0, 0, 0,-10, -20,-10,-10, -5, -5,-10,-10,-20 ], chess.KING: [ -30,-40,-40,-50,-50,-40,-40,-30, -30,-40,-40,-50,-50,-40,-40,-30, -30,-40,-40,-50,-50,-40,-40,-30, -30,-40,-40,-50,-50,-40,-40,-30, -20,-30,-30,-40,-40,-30,-30,-20, -10,-20,-20,-20,-20,-20,-20,-10, 20, 20, 0, 0, 0, 0, 20, 20, 20, 30, 10, 0, 0, 10, 30, 20 ] } def evaluate_board(self, board: chess.Board) -> float: """Evaluate the current board position""" if board.is_checkmate(): return -99999 if board.turn else 99999 if board.is_stalemate() or board.is_insufficient_material(): return 0 score = 0 for square in chess.SQUARES: piece = board.piece_at(square) if piece: value = self.piece_values[piece.piece_type] # Adjust for position (use mirrored values for black) if piece.color == chess.WHITE: score += value + self.position_values[piece.piece_type][square] else: score -= value + self.position_values[piece.piece_type][chess.square_mirror(square)] return score if board.turn else -score def minimax(self, board: chess.Board, depth: int, alpha: float, beta: float, maximizing: bool) -> float: """Minimax algorithm with alpha-beta pruning""" if depth == 0 or board.is_game_over(): return self.evaluate_board(board) if maximizing: max_eval = float('-inf') for move in board.legal_moves: board.push(move) eval_score = self.minimax(board, depth - 1, alpha, beta, False) board.pop() max_eval = max(max_eval, eval_score) alpha = max(alpha, eval_score) if beta <= alpha: break return max_eval else: min_eval = float('inf') for move in board.legal_moves: board.push(move) eval_score = self.minimax(board, depth - 1, alpha, beta, True) board.pop() min_eval = min(min_eval, eval_score) beta = min(beta, eval_score) if beta <= alpha: break return
(extra end-of-code added due to cutoff of HF)
Here's a complete chess engine implementation using
python-chesswith a simple minimax algorithm and alpha-beta pruning:import chess import chess.engine import random from typing import Optional class SimpleChessEngine: def __init__(self, depth: int = 3): self.depth = depth self.piece_values = { chess.PAWN: 100, chess.KNIGHT: 320, chess.BISHOP: 330, chess.ROOK: 500, chess.QUEEN: 900, chess.KING: 20000 } def evaluate_board(self, board: chess.Board) -> float: """Evaluate the board position using material counting.""" if board.is_checkmate(): return -100000 if board.turn else 100000 score = 0 for square in chess.SQUARES: piece = board.piece_at(square) if piece: value = self.piece_values[piece.piece_type] if piece.color == chess.WHITE: score += value else: score -= value return score def minimax(self, board: chess.Board, depth: int, alpha: float, beta: float, maximizing: bool) -> float: """Minimax algorithm with alpha-beta pruning.""" if depth == 0 or board.is_game_over(): return self.evaluate_board(board) if maximizing: max_eval = float('-inf') for move in board.legal_moves: board.push(move) eval_score = self.minimax(board, depth - 1, alpha, beta, False) board.pop() max_eval = max(max_eval, eval_score) alpha = max(alpha, eval_score) if beta <= alpha: break return max_eval else: min_eval = float('inf') for move in board.legal_moves: board.push(move) eval_score = self.minimax(board, depth - 1, alpha, beta, True) board.pop() min_eval = min(min_eval, eval_score) beta = min(beta, eval_score) if beta <= alpha: break return min_eval def get_best_move(self, board: chess.Board) -> Optional[chess.Move]: """Find the best move using minimax.""" best_move = None best_value = float('-inf') if board.turn else float('inf') for move in board.legal_moves: board.push(move) board_value = self.minimax( board, self.depth - 1, float('-inf'), float('inf'), not board.turn ) board.pop() if board.turn: if board_value > best_value: best_value = board_value best_move = move else: if board_value < best_value: best_value = board_value best_move = move return best_move def play_game(): """Play a game between the engine and a random player.""" board = chess.Board() engine = SimpleChessEngine(depth=3) print("Starting new game!") print(board) while not board.is_game_over(): if board.turn == chess.WHITE: print("\nEngine's turn (White)") move = engine.get_best_move(board) else: print("\nRandom player's turn (Black)") move = random.choice(list(board.legal_moves)) print(f"Move: {move}") board.push(move) print(board) if board.is_checkmate(): print("Checkmate!") elif board.is_stalemate(): print("Stalemate!") elif board.is_insufficient_material(): print("Draw by insufficient material!") print(f"Game over! Result: {board.result()}") if __name__ == "__main__": play_game()
- Board Evaluation: Simple material counting with standard piece values
- Minimax Algorithm: With alpha-beta pruning for efficiency
- Configurable Depth: Adjustable search depth (default 3 moves)
- Game Demo: Play against a random move generator
- Game End Detection: Handles checkmate, stalemate, and draws
- Run the script to see a demo game between the engine (white) and a random player (black)
- To use the engine in your own code:
engine = SimpleChessEngine(depth=4) # Adjust depth as needed best_move = engine.get_best_move(board) # Pass a chess.Board objectpip install chess
- Evaluation Function: Counts material with standard values (pawn=100, knight=320, etc.)
- Minimax Search: Explores possible moves up to specified depth
- Alpha-Beta Pruning: Reduces search space for better performance
- Move Selection: Chooses the move with the best evaluation score
- No opening book (plays from scratch)
- No endgame tablebases
- Simple evaluation (no positional factors)
- Fixed search depth (no quiescence search)
- Add positional evaluation (piece-square tables)
- Implement iterative deepening
- Add transposition tables
- Include quiescence search
- Add opening/endgame specific knowledge
This implementation provides a solid foundation for a chess engine that can be extended with more sophisticated features.
Outputs for Qwen2.5-Coder:
Creating a complete chess engine in Python involves several steps, including defining the game rules, implementing the search algorithm, and handling the game logic. Below is a simple implementation of a chess engine using the
python-chesslibrary. This example will provide a basic framework, including a basic chess board representation, a search algorithm, and a simple evaluation function.First, ensure you have the
python-chesslibrary installed. You can install it using pip:pip install python-chessHere's a basic implementation of a chess engine:
import chess import time class ChessEngine: def __init__(self): self.board = chess.Board() self.white = chess.WHITE self.black = chess.BLACK self.active_player = self.white self.search_depth = 5 def get_valid_moves(self, color): valid_moves = self.board.legal_moves(color) return valid_moves def is_valid_move(self, move): start = move.start end = move.end return self.board.is_legal((start, end)) def make_move(self, move): self.board.push(move) self.active_player = self.other_player() return self.board def other_player(self): if self.active_player == self.white: return self.black else: return self.white def evaluate(self): # Simple evaluation function using a heuristic return self.board.enpassant_score + 2 * self.board.king_square_value + self.board.knight_square_value def get_best_move(self): return self.board.currently_best_move() if __name__ == "__main__": engine = ChessEngine() while True: print("Welcome to the chess engine!") print("Current board:", engine.board) print("Your turn, white.") # Get valid moves for white valid_moves_white = engine.get_valid_moves(engine.white) if not valid_moves_white: print("No valid moves for white, you lose.") break # Get the best move for white best_move_white = engine.get_best_move() print(f"Best move for white: {best_move_white} (score: {engine.evaluate()})") # Make the move engine.make_move(best_move_white) # Wait for a turn time.sleep(1)
Initialization: The
ChessEngineclass initializes a new chess board and sets up the player as white.Valid Moves: The
get_valid_movesmethod returns all the valid moves for a given color.Making a Move: The
make_movemethod updates the board and switches to the opponent's color.Other Player: The
other_playermethod returns the other player's color.Evaluation: The
evaluatemethod calculates the score of the current state of the board using a simple heuristic. A higher score means the game is better.Best Move: The
get_best_movemethod returns the best move from the current state of the board.Main Loop: The main loop allows the user to play against the opponent, making moves, and evaluating the board.
This is a very basic implementation and can be expanded with additional features such as AI opponents, time management, and a graphical user interface. For a more advanced chess engine, you would need to implement a more sophisticated search algorithm, a more complex evaluation function, and possibly a more sophisticated game logic.
Implementing a whole chess engine in Python using the
python-chesslibrary involves several steps. Below is a step-by-step guide to help you get started:
Install the
python-chesslibrary: You can install thepython-chesslibrary using pip:pip install python-chessSet up the chess engine: You need to create a chess engine class that will handle the game logic. Here is an example of a simple chess engine class using the
python-chesslibrary:import chess import random class SimpleChessEngine: def __init__(self): self.board = chess.Board() def make_move(self, move): try: self.board.push(move) return True except ValueError: return False def get_board(self): return self.board def get_current_player(self): return self.board.turn def is_game_over(self): return self.board.is_game_over() def get_winner(self): if self.is_game_over(): return chess.unicode(self.board.result()) return None def get_legal_moves(self): return list(self.board.legal_moves) def get_random_move(self): if self.is_game_over(): return None return random.choice(list(self.board.legal_moves))Implement the game loop: You need to create a game loop that allows two players to play the game. Here is an example of a simple game loop:
def play_game(): engine = SimpleChessEngine() player1 = 'white' player2 = 'black' while not engine.is_game_over(): if engine.get_current_player() == player1: print("Player 1's turn") move = input("Enter your move (e.g., e4): ") if engine.make_move(chess.parse_san(move)): print("Move made") else: print("Invalid move") else: print("Player 2's turn") move = input("Enter your move (e.g., e5): ") if engine.make_move(chess.parse_san(move)): print("Move made") else: print("Invalid move") print(engine.get_board()) print("Game over") print("Result:", engine.get_winner()) if __name__ == "__main__": play_game()Enhance the game: You can enhance the game by adding features such as:
- Move validation
- Player AI
- Time management
- Multiplayer support
- Database for game history
Here is a more advanced example that includes AI:
import chess import random import time class SimpleChessEngine: def __init__(self): self.board = chess.Board() def make_move(self, move): try: self.board.push(move) return True except ValueError: return False def get_board(self): return self.board def get_current_player(self): return self.board.turn def is_game_over(self): return self.board.is_game_over() def get_winner(self): if self.is_game_over(): return chess.unicode(self.board.result()) return None def get_legal_moves(self): return list(self.board.legal_moves) def get_random_move(self): if self.is_game_over(): return None return random.choice(list(self.board.legal_moves)) class AI: def __init__(self): self.engine = SimpleChessEngine() self.engine.make_move(chess.Move.from_uci('e4')) # Start with e4 def get_move(self, board): if board.is_game_over(): return None return self.engine.get_random_move() def play_game(): engine = SimpleChessEngine() ai = AI() while not engine.is_game_over(): if engine.get_current_player() == 'white': move = input("Enter your move (e.g., e4): ") if engine.make_move(chess.parse_san(move)): print("Move made") else: print("Invalid move") else: move = ai.get_move(engine.get_board()) if move: engine.make_move(move) print("Move made") else: print("AI cannot make a move") print(engine.get_board()) print("Game over") print("Result:", engine.get_winner()) if __name__ == "__main__": play_game()This is a basic implementation of a chess engine in Python using the
python-chesslibrary. You can enhance this code to create a more sophisticated chess engine with additional features.
Creating a complete chess engine in Python with
python-chessis a complex task, but I can guide you through the steps to get started.python-chessis a powerful library that simplifies the process of working with chess positions and moves.Here's a step-by-step guide to creating a basic chess engine:
Install
python-chess:First, you need to install the
python-chesslibrary. You can do this using pip:pip install python-chessUnderstand the basic concepts of chess:
Before writing any code, it's important to understand the basic rules and concepts of chess:
- The board is a 64-square grid.
- Players take turns moving their pieces.
- Pieces can move to different squares according to their specific rules.
- Check, mate, stalemate, and draw are all possible game states.
Set up the chess board:
You can use
python-chessto create and manipulate chess positions. Here's a basic example:import chess # Create a new chess board board = chess.Board() # Print the initial board position print(board)Move pieces:
You can make moves on the board using the
push()method:# Make a move board.push(chess.Move.from_uci('e4')) # Print the updated board position print(board)Check the game state:
You can check various game states using methods like
is_game_over(),is_stalemate(),is_checkmate(), etc.# Check if the game is over if board.is_game_over(): result = 'Checkmate' if board.is_checkmate() else 'Stalemate' print(result) else: print('Game is ongoing')Implement the main loop:
A simple main loop to simulate a game of chess would look like this:
while not board.is_game_over(): # Print the current board position print(board) # Get user input for the next move user_input = input("Enter your move: ") move = chess.Move.from_uci(user_input) # Check if the move is valid if move in board.legal_moves: # Make the move board.push(move) else: print("Invalid move. Try again.") # Print the final game state print(board)Expand the engine:
To create a more sophisticated chess engine, you can:
- Implement search algorithms (e.g., minimax, alpha-beta pruning) to evaluate positions.
- Consider additional features like piece promotion, castling, en passant, and pawn promotion.
- Optimize performance by using more efficient data structures and algorithms.
Test and refine:
Test your engine with different positions and scenarios to ensure it works correctly. Refine the engine based on the results and feedback.
Here's a simple example of a basic chess engine using the minimax algorithm:
import chess from chess.engine import SimpleEngine import time # Load a pre-trained chess engine engine = SimpleEngine.popen_uci("stockfish") def evaluate_position(board): # Simple evaluation function (can be improved) score = 0 for piece in board.pieces(): if piece.color == chess.WHITE: score += 1 else: score -= 1 return score def minimax(board, depth, maximizing_player): if depth == 0 or board.is_game_over(): return evaluate_position(board), None if maximizing_player: max_score = float('-inf') best_move = None for move in board.legal_moves: board.push(move) score, _ = minimax(board, depth - 1, False) board.pop() if score > max_score: max_score = score best_move = move return max_score, best_move else: min_score = float('inf') best_move = None for move in board.legal_moves: board.push(move) score, _ = minimax(board, depth - 1, True) board.pop() if score < min_score: min_score = score best_move = move return min_score, best_move def play_game(): board = chess.Board() while not board.is_game_over(): if board.turn == chess.WHITE: # Use the engine to make a move start = time.time() result, move = engine.play(board, chess.engine.Limit(time=1)) print("Engine move:", move) board.push(move) else: # Get user input for the next move user_input = input("Enter your move: ") move = chess.Move.from_uci(user_input) # Check if the move is valid if move in board.legal_moves: # Make the move board.push(move) else: print("Invalid move. Try again.") # Print the current board position print(board) # Print the final game state print(board) print("Game over") if __name__ == "__main__": play_game()This example uses the Stockfish engine as a reference, but you can replace it with any other engine if you prefer. The
minimaxfunction is a basic evaluation and decision-making algorithm that can be expanded to include more sophisticated strategies.Remember, creating a full-fledged chess engine is a complex task that requires a good understanding of chess rules and algorithms. This example is a starting point, and you can build upon it to create a more advanced engine.
Implementing a whole chess engine is a complex task, but I can guide you through creating a simple one using the
python-chesslibrary. Thepython-chesslibrary is a powerful tool for handling chess board operations and is ideal for developing chess-related applications.First, you need to install the
python-chesslibrary if you haven't already:pip install python-chessHere’s a step-by-step guide to building a basic chess engine:
Start by importing the necessary modules from
python-chess.import chess import chess.engineWe will create a simple chess engine using the
chess.engine.SimpleEngineclass. This engine will use thestockfishcommand-line engine, which is a strong opensource chess engine.First, you need to have
stockfishinstalled. You can download it from the official Stockfish website.Then, you can define the engine:
engine = chess.engine.SimpleEngine.popen_uci("/path/to/stockfish")Replace
"/path/to/stockfish"with the actual path to yourstockfishexecutable.Next, we will create a
chess.Boardobject to represent the current state of the chess board.board = chess.Board()To make a move, you need to get a
chess.engine.Limitobject and pass it to theengine.playmethod. This object specifies the time limits for the move.def make_move(board, time_limit=0.1): result = engine.play(board, chess.engine.Limit(time=time_limit)) if result is None: raise ValueError("No valid move found") return result.moveNow, let's create a function to play a game. This function will repeatedly make moves until the game is over.
def play_game(): board = chess.Board() while not board.is_game_over(): move = make_move(board) board.push(move) print(board) print(f"Result: {board.result()}")Finally, you can call the
play_gamefunction to start a new game.if __name__ == "__main__": play_game()Here is the complete code for the simple chess engine:
import chess import chess.engine # Replace "/path/to/stockfish" with the actual path to your stockfish executable engine = chess.engine.SimpleEngine.popen_uci("/path/to/stockfish") def make_move(board, time_limit=0.1): result = engine.play(board, chess.engine.Limit(time=time_limit)) if result is None: raise ValueError("No valid move found") return result.move def play_game(): board = chess.Board() while not board.is_game_over(): move = make_move(board) board.push(move) print(board) print(f"Result: {board.result()}") if __name__ == "__main__": play_game()This is a very basic chess engine. It uses
stockfishto get the best move and plays until the game is over. You can expand this by adding more sophisticated evaluation, opening book, endgame handling, and more.
- Opening Book: You can add opening book functionality to improve the engine's performance.
- Evaluation Function: Implement a custom evaluation function to guide the engine in making better decisions.
- Alpha-Beta Pruning: Implement alpha-beta pruning to speed up the search process.
- Aspiration Windows: Use aspiration windows to handle large value differences in the search.
- Transposition Table: Use a transposition table to avoid redundant calculations.
These steps will help you build a more advanced chess engine.
Conclusion: (rating point is from 0-1000) table sorted by appearance time
| Model | Model size | Rating point | Rating reason |
|---|---|---|---|
| DeepSeek-R1 | 1.5B | -500 | invalid syntax on pip call and chess.js is a NodeJS module |
| DeepSeek-R1 | 7B | 1 | not working by AttributeError and invalid syntax and a bit of good basics |
| DeepSeek-R1 | 70B | 750 | pretty basic engine but works |
| DeepSeek-R1 | 685B | 900 | PSQT not completed - but code is fine! |
| Qwen3-Coder | 30B | 850 | basic evaluation and minimax (that makes code complicated later) |
| Qwen3-Coder | 480B (FP8) | 950 | full PSQT and evaluation is fine, but the request was cut by HF due to length limit |
| Qwen3-Coder | 480B | 850 | basic evaluation and minimax (that makes code complicated later) |
| Qwen2.5-Coder | 0.5B | -500 | not even giving a way for human to play the move and no logic (edit: also incorrect) |
| Qwen2.5-Coder | 1.5B | 500 | random moves and easily beatable by humans, but at least it pass the input |
| Qwen2.5-Coder | 3B | 400 | using SF directly is cheating and the search function is unused, at least it has good logic |
| Qwen2.5-Coder | 7B | 125 | cheating with SF and no search logic |