Joueur IA Escampe (Puyaubreau/Russac) — version finale

Joueur alpha-bêta + iterative deepening pour le tournoi APP5 « IA et contraintes ».

- src/escampe/ : joueur (IJoueur), moteur (alpha-bêta + DFS bitmask, make/unmake
  sans allocation), modèle EscampeBoard (Partie1), utilitaires de test.
- Protocole arbitre vérifié (pass="E", carte des liserés identique au serveur,
  machine à états placement/jeu) ; 7/7 victoires vs joueur aléatoire, 0 illégal.
- Vérifications : VerifMoves (int≡String, 0 divergence/142k positions),
  RulesTest (21/21), Branching (facteur de branchement mesuré).
- Rapport : report/rapport.html + tools/make_report_pdf.py (PyMuPDF) → PDF, RAPPORT.md.
- Livrables buildés inclus (dist/ : jar, mainClass, tgz, rapport PDF) + lib/escampeobf.jar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 16:00:29 +02:00
commit e508efa14f
50 changed files with 6521 additions and 0 deletions

58
build.sh Normal file
View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Build reproductible du joueur Escampe (partie 3).
# Produit dans dist/ :
# - Puyaubreau_Russac.jar : jar exécutable (point d'entrée escampe.ClientJeu)
# - mainClass : descripteur attendu par le tournoi
# - Puyaubreau_Russac.tgz : archive de rendu (Puyaubreau_Russac/src + mainClass + jar)
# - Puyaubreau_Russac_rapport.pdf : rapport (via PyMuPDF ; sauter avec --no-report)
set -e
ROOT="$(cd "$(dirname "$0")" && pwd)"; cd "$ROOT"
WITH_REPORT=1; [ "${1:-}" = "--no-report" ] && WITH_REPORT=0
NAME="Puyaubreau_Russac"
JAR="$NAME.jar"
PLAYER="escampe.JoueurPuyaubreauRussac"
CLIENT="escampe.ClientJeu"
# Classes de PRODUCTION (on exclut les utilitaires de test : VerifMoves, RulesTest, Bench).
RUNTIME="IJoueur ClientJeu Solo Applet Partie1 EscampeBoard Moteur JoueurPuyaubreauRussac"
echo "[1/4] Compilation des classes de production…"
rm -rf build dist
mkdir -p build dist
SRCS=""
for c in $RUNTIME; do SRCS="$SRCS src/escampe/$c.java"; done
javac -d build $SRCS
echo "[2/4] Création du jar exécutable ($JAR)…"
jar --create --file "dist/$JAR" --main-class "$CLIENT" -C build escampe
echo "[3/4] Écriture du fichier mainClass…"
printf 'jar:%s\nclientClass:%s\nmainClass:%s\n' "$JAR" "$CLIENT" "$PLAYER" > dist/mainClass
echo "[4/4] Assemblage de l'archive de rendu…"
rm -rf "dist/$NAME"
mkdir -p "dist/$NAME/src/escampe"
cp src/escampe/*.java "dist/$NAME/src/escampe/"
cp dist/mainClass "dist/$NAME/mainClass"
cp "dist/$JAR" "dist/$NAME/$JAR"
( cd dist && tar czf "$NAME.tgz" "$NAME" )
REPORT=""
if [ "$WITH_REPORT" = "1" ]; then
echo "[5/5] Génération du rapport PDF…"
if python tools/make_report_pdf.py >/dev/null 2>&1; then
REPORT=" dist/${NAME}_rapport.pdf"
else
echo " (PDF non généré : PyMuPDF indisponible — relancer 'python tools/make_report_pdf.py')"
fi
fi
echo "----------------------------------------------------"
echo "OK :"
echo " dist/$JAR"
echo " dist/mainClass"
echo " dist/$NAME.tgz"
[ -n "$REPORT" ] && echo "$REPORT"
echo "Lancement tournoi (rappel) :"
echo " java -cp $JAR $CLIENT $PLAYER <hôte> <port>"