moonfish_chess / examples /basic_usage.py
luccabb's picture
Upload folder using huggingface_hub
e5572a6 verified
Raw
History Blame Contribute Delete
3.62 kB
"""
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()