moonfish_chess / examples /basic_usage.py
luccabb's picture
Upload folder using huggingface_hub
e5572a6 verified
"""
Basic usage example for the Chess OpenEnv environment.
This example shows how to use the chess environment both locally
(without a server) and via the HTTP client.
"""
import random
from moonfish.rl import ChessAction, ChessEnvironment, RewardConfig
def play_random_game():
"""Play a game with random moves to demonstrate the environment."""
print("=== Playing a random game ===\n")
# Create environment
env = ChessEnvironment()
# Reset to start a new game
obs = env.reset(episode_id="random_game_001")
print(f"Initial position: {obs.fen}")
print(f"Legal moves: {len(obs.legal_moves)} available")
print()
move_count = 0
total_reward = 0.0
while not obs.done:
# Pick a random legal move
move = random.choice(obs.legal_moves)
action = ChessAction(move=move)
# Execute the move
obs, reward, done = env.step(action)
total_reward += reward
move_count += 1
if move_count <= 5 or done:
print(f"Move {move_count}: {move}")
print(f" FEN: {obs.fen}")
print(f" Check: {obs.is_check}, Reward: {reward}")
if move_count == 5 and not done:
print(" ... (continuing)")
print()
print(f"\nGame finished after {move_count} moves")
print(f"Result: {obs.result}")
print(f"Total reward: {total_reward}")
# Check final state
state = env.state
print(f"Episode ID: {state.episode_id}")
print(f"Move history: {state.move_history[:10]}...")
env.close()
def play_specific_opening():
"""Demonstrate playing specific moves (Italian Game opening)."""
print("\n=== Playing the Italian Game opening ===\n")
env = ChessEnvironment()
obs = env.reset()
opening_moves = ["e2e4", "e7e5", "g1f3", "b8c6", "f1c4"]
for i, move in enumerate(opening_moves):
action = ChessAction(move=move)
obs, reward, done = env.step(action)
print(f"{i+1}. {move} -> Check: {obs.is_check}")
print(f"\nPosition after opening: {obs.fen}")
print(f"Legal moves for Black: {len(obs.legal_moves)}")
print(f"Material: {obs.metadata.get('material', {})}")
env.close()
def demonstrate_illegal_move():
"""Show how illegal moves are handled."""
print("\n=== Handling illegal moves ===\n")
env = ChessEnvironment()
obs = env.reset()
# Try an illegal move
illegal_action = ChessAction(move="e2e5") # Can't move pawn 3 squares
obs, reward, done = env.step(illegal_action)
print("Attempted illegal move: e2e5")
print(f"Reward: {reward}") # Should be negative
print(f"Error: {obs.metadata.get('error', 'None')}")
print(f"Done: {done}") # Game continues
env.close()
def with_evaluation_rewards():
"""Show evaluation-based intermediate rewards."""
print("\n=== Evaluation-based rewards ===\n")
config = RewardConfig(
use_evaluation=True,
evaluation_scale=0.0001, # Scale down the centipawn values
)
env = ChessEnvironment(reward_config=config)
obs = env.reset()
# Play a few moves and observe evaluation changes
moves = ["e2e4", "d7d5", "e4d5"] # White wins a pawn
for move in moves:
action = ChessAction(move=move)
obs, reward, done = env.step(action)
eval_score = obs.metadata.get("evaluation", 0)
print(f"Move: {move}, Reward: {reward:.4f}, Eval: {eval_score:.1f}")
env.close()
if __name__ == "__main__":
play_random_game()
play_specific_opening()
demonstrate_illegal_move()
with_evaluation_rewards()