|
from flask import Flask, render_template, request, jsonify |
|
from stockfish import Stockfish, StockfishException |
|
import os |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
STOCKFISH_PATH = "/usr/games/stockfish" |
|
|
|
|
|
|
|
STOCKFISH_DEPTH = 12 |
|
STOCKFISH_PARAMS = { |
|
"Threads": 2, |
|
"Hash": 128, |
|
"UCI_LimitStrength": False, |
|
"Skill Level": 15 |
|
} |
|
|
|
|
|
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') |
|
|
|
|
|
sf.set_fen_position(fen) |
|
|
|
|
|
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]) |
|
|
|
|
|
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' |
|
}) |
|
|
|
|
|
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' |
|
}) |
|
|
|
|
|
sf.make_moves_from_current_position([stockfish_move]) |
|
final_fen = sf.get_fen_position() |
|
final_eval = sf.get_evaluation() |
|
|
|
|
|
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) |