from flask import Flask, render_template, request, jsonify, session from stockfish import Stockfish # Assurez-vous que le chemin est correct si besoin import chess # python-chess app = Flask(__name__) app.secret_key = 'super_secret_key_for_session' # Important pour les sessions # Pour simplifier, une instance globale. Pour une prod, gérer par session/jeu. # Assurez-vous que le binaire stockfish est dans votre PATH ou spécifiez le chemin. try: stockfish_path = "/usr/games/stockfish" # chemin vers votre binaire stockfish = Stockfish(path=stockfish_path, parameters={"Threads": 2, "Hash": 128}) except Exception as e: print(f"Erreur à l'initialisation de Stockfish: {e}") print("Veuillez vérifier que Stockfish est installé et accessible via le PATH, ou spécifiez le chemin correct.") # Vous pourriez vouloir quitter l'application ou avoir un mode dégradé. stockfish = None @app.route('/') def index(): return render_template('index.html') @app.route('/new_game', methods=['POST']) def new_game(): if not stockfish: return jsonify({"error": "Stockfish non initialisé"}), 500 data = request.json mode = data.get('mode', 'human') # 'ai' or 'human' initial_fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" session['fen'] = initial_fen session['mode'] = mode session['turn'] = 'w' # White's turn session['history'] = [] stockfish.set_fen_position(initial_fen) # python-chess board (optionnel mais recommandé) session['board_pgn'] = chess.Board().fen() # Stocker le FEN pour reconstruire return jsonify({ "fen": initial_fen, "turn": session['turn'], "message": "Nouvelle partie commencée." }) @app.route('/move', methods=['POST']) def handle_move(): if not stockfish: return jsonify({"error": "Stockfish non initialisé"}), 500 if 'fen' not in session: return jsonify({"error": "Aucune partie en cours. Commencez une nouvelle partie."}), 400 data = request.json move_uci = data.get('move') # e.g., "e2e4" # Reconstruire l'état du board python-chess (si utilisé) board = chess.Board(session['fen']) # Validation du tour current_player_color = 'w' if board.turn == chess.WHITE else 'b' if session['turn'] != current_player_color: return jsonify({"error": "Pas votre tour.", "fen": session['fen'], "turn": session['turn']}), 400 try: move_obj = board.parse_uci(move_uci) except ValueError: return jsonify({"error": "Format de coup invalide.", "fen": session['fen'], "turn": session['turn']}), 400 if not stockfish.is_move_correct(move_uci) or move_obj not in board.legal_moves: return jsonify({"error": "Coup illégal.", "fen": session['fen'], "turn": session['turn']}), 400 # Appliquer le coup humain stockfish.make_moves_from_current_position([move_uci]) board.push(move_obj) session['fen'] = stockfish.get_fen_position() # ou board.fen() session['history'].append(move_uci) session['turn'] = 'b' if current_player_color == 'w' else 'w' ai_move_uci = None game_status = "En cours" if board.is_checkmate(): game_status = f"Mat! {'Les Blancs' if board.turn == chess.BLACK else 'Les Noirs'} gagnent." elif board.is_stalemate() or board.is_insufficient_material() or board.is_seventyfive_moves() or board.is_fivefold_repetition(): game_status = "Pat!" # Mode IA if session['mode'] == 'ai' and game_status == "En cours" and ( (board.turn == chess.BLACK and current_player_color == 'w') or \ (board.turn == chess.WHITE and current_player_color == 'b') ) : # Tour de l'IA # S'assurer que stockfish a la bonne position si on utilise board.fen() stockfish.set_fen_position(board.fen()) ai_move_uci = stockfish.get_best_move_time(1000) # 1 seconde de réflexion if ai_move_uci: ai_move_obj = board.parse_uci(ai_move_uci) stockfish.make_moves_from_current_position([ai_move_uci]) # Stockfish est déjà à jour board.push(ai_move_obj) session['fen'] = stockfish.get_fen_position() # ou board.fen() session['history'].append(ai_move_uci) session['turn'] = 'w' if session['turn'] == 'b' else 'b' if board.is_checkmate(): game_status = f"Mat! {'Les Blancs' if board.turn == chess.BLACK else 'Les Noirs'} gagnent." elif board.is_stalemate() or board.is_insufficient_material() or board.is_seventyfive_moves() or board.is_fivefold_repetition(): game_status = "Pat!" else: # Si l'IA ne retourne pas de coup (ce qui peut arriver si elle est matée/patée) if board.is_checkmate(): game_status = f"Mat! {'Les Blancs' if board.turn == chess.BLACK else 'Les Noirs'} gagnent." elif board.is_stalemate(): game_status = "Pat!" return jsonify({ "fen": session['fen'], "turn": session['turn'], "last_move_human": move_uci, "last_move_ai": ai_move_uci, "game_status": game_status, "history": session['history'] }) if __name__ == '__main__': app.run(debug=True)