from flask import Flask, render_template, request, jsonify from stockfish import Stockfish, StockfishException import os app = Flask(__name__) # --- Configuration Stockfish --- STOCKFISH_PATH = "/usr/games/stockfish" # Modifiez selon votre installation # STOCKFISH_PATH = "/opt/homebrew/bin/stockfish" # macOS # STOCKFISH_PATH = "stockfish" # Si dans le PATH STOCKFISH_DEPTH = 12 STOCKFISH_PARAMS = { "Threads": 2, "Hash": 128, "UCI_LimitStrength": False, "Skill Level": 15 # Niveau modéré (0-20) } # Initialiser Stockfish try: sf = Stockfish(path=STOCKFISH_PATH, depth=STOCKFISH_DEPTH, parameters=STOCKFISH_PARAMS) print(f"Stockfish initialisé: {sf._path}") except Exception as e: print(f"Erreur Stockfish: {e}") sf = None @app.route('/') def index(): return render_template('index.html') @app.route('/api/move', methods=['POST']) def make_move(): if not sf: return jsonify({'error': 'Stockfish non disponible'}), 500 try: data = request.get_json() fen = data.get('fen') user_move = data.get('move') # Définir la position sf.set_fen_position(fen) # Vérifier et jouer le coup utilisateur if not sf.is_move_correct(user_move): return jsonify({'error': f'Coup invalide: {user_move}'}), 400 sf.make_moves_from_current_position([user_move]) # Vérifier si la partie est terminée après le coup utilisateur eval_after_user = sf.get_evaluation() user_fen = sf.get_fen_position() if eval_after_user.get("type") == "mate" and eval_after_user.get("value") == 0: return jsonify({ 'fen': user_fen, 'stockfish_move': None, 'evaluation': eval_after_user, 'game_over': True, 'result': 'Mat ou Pat' }) # Obtenir le coup de Stockfish stockfish_move = sf.get_best_move() if not stockfish_move: return jsonify({ 'fen': user_fen, 'stockfish_move': None, 'evaluation': eval_after_user, 'game_over': True, 'result': 'Partie terminée' }) # Jouer le coup de Stockfish sf.make_moves_from_current_position([stockfish_move]) final_fen = sf.get_fen_position() final_eval = sf.get_evaluation() # Vérifier si la partie est terminée après le coup de Stockfish game_over = False result = None if final_eval.get("type") == "mate": game_over = True if final_eval.get("value") == 0: result = "Mat ou Pat" elif final_eval.get("value") > 0: result = "Stockfish gagne" else: result = "Vous gagnez" return jsonify({ 'fen': final_fen, 'stockfish_move': stockfish_move, 'evaluation': final_eval, 'game_over': game_over, 'result': result }) except StockfishException as e: return jsonify({'error': f'Erreur Stockfish: {str(e)}'}), 500 except Exception as e: return jsonify({'error': f'Erreur: {str(e)}'}), 500 @app.route('/api/analyze', methods=['POST']) def analyze_position(): if not sf: return jsonify({'error': 'Stockfish non disponible'}), 500 try: data = request.get_json() fen = data.get('fen') sf.set_fen_position(fen) evaluation = sf.get_evaluation() best_move = sf.get_best_move() return jsonify({ 'evaluation': evaluation, 'best_move': best_move }) except Exception as e: return jsonify({'error': f'Erreur analyse: {str(e)}'}), 500 if __name__ == '__main__': app.run(debug=True, port=5000)