From cfc1ff0b72c931f296e0c42fde5e5a1a2af8d8fe Mon Sep 17 00:00:00 2001 From: arussac Date: Sat, 30 May 2026 16:38:30 +0200 Subject: [PATCH] =?UTF-8?q?j'ai=20fait=20le=20rapport=20chef=20!=20c'est?= =?UTF-8?q?=20vraiment=20pas=20mal,=20j'ai=20d=C3=A9velopp=C3=A9=20les=20p?= =?UTF-8?q?artie=20n=C3=A9cessaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RAPPORT.md | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/RAPPORT.md b/RAPPORT.md index ba159cf..8494eea 100644 --- a/RAPPORT.md +++ b/RAPPORT.md @@ -10,6 +10,23 @@ Joueur : `escampe.JoueurPuyaubreauRussac` --- +## Sommaire + +1. [Présentation et règles](#1-présentation-et-règles) +2. [Analyse des caractéristiques du jeu (Q1–Q7)](#2-analyse-des-caractéristiques-du-jeu-q1q7) +3. [Modélisation : la classe `EscampeBoard`](#3-modélisation--la-classe-escapeboard) +4. [Intégration au tournoi : protocole de l'arbitre](#4-intégration-au-tournoi--protocole-de-larbitre) +5. [Placement d'ouverture](#5-placement-douverture) +6. [Moteur de décision](#6-moteur-de-décision) +7. [Heuristique d'évaluation](#7-heuristique-dévaluation) +8. [Gestion du temps réel](#8-gestion-du-temps-réel) +9. [Performances et tests](#9-performances-et-tests) +10. [Compilation, exécution et livrables](#10-compilation-exécution-et-livrables) +11. [Sources et bibliographie](#11-sources-et-bibliographie) +12. [Conclusion et difficultés rencontrées](#12-conclusion-et-difficultés-rencontrées) + +--- + ## 1. Présentation et règles Escampe se joue sur un plateau de 36 cases (6×6). Chaque case porte un liseré @@ -22,10 +39,9 @@ d'une case dont le liseré est *identique* à celui de la case d'arrivée du cou adverse précédent. Le liseré de départ fixe le nombre de pas (1, 2 ou 3), orthogonaux, sans traverser ni revisiter de case. On ne capture qu'en se posant, au dernier pas, sur la licorne adverse (paladins imprenables). Sans coup possible, -on passe son tour. +on passe son tour. Toute la difficulté consiste donc à "coincer" son adversaire. -Déroulement : Noir place ses six pièces sur les deux lignes d'un bord ; Blanc sur -le bord opposé ; **Blanc joue le premier coup**. +Déroulement : Noir place ses six pièces sur les deux lignes d'un bord (spécifié dans l'énnoncé : haut ou bas) ; Blanc sur le bord opposé ; **Blanc joue le premier coup**. --- @@ -84,10 +100,25 @@ Le branchement effectif modeste explique les profondeurs élevées atteintes par l'alpha-bêta (§6). ### Q4 — Coups imparables -Pas d'« imparable » universel garanti dès le départ (la contrainte de liseré peut -toujours bloquer une menace). Mais des configurations créent un **zugzwang -partiel** (exemple figure 6 : C2 prend C1 dès que Noir est forcé d'imposer un -liseré double). Notre recherche les exploite quand ils sont à portée d'horizon. + +Pas d'« imparable » universel garanti dès le départ : la contrainte de liseré peut +toujours bloquer une menace, car l'adversaire choisit sa case d'arrivée et donc le +liseré qu'il impose au tour suivant. En revanche, certaines configurations créent +un **zugzwang partiel** — l'adversaire est forcé d'imposer précisément le liseré +qui autorise la capture. + +**Exemple concret (figure 6 de l'énoncé).** Noir vient de poser sa pièce en D4 (liseré double, +TILE\_MAP = 2). Blanc doit donc jouer depuis une case à liseré double. Il choisit +**F6–E5** (F6 est à liseré double). Noir doit maintenant jouer depuis une case à +liseré simple (E5 = 1) : son seul coup raisonnable est **A1–A2**. A2 est à liseré +triple (TILE\_MAP = 3). Blanc joue alors **C2×C1** : le paladin en C2 (liseré 3) +effectue les trois pas C2→D2→D1→C1 et capture la licorne noire. La séquence +F6–E5 / A1–A2 / C2×C1 est donc un « imparable local » : dès que Noir est forcé +d'atterrir en A2, la capture est inévitable. + +Ce type de combinaison est inexploitable de façon générale depuis le début de la +partie (trop de degrés de liberté), mais notre alpha-bêta le détecte et le joue +dès qu'il est à portée d'horizon. ### Q5 — Critères pour l'heuristique Cinq critères identifiés : distance à la licorne adverse, mobilité différentielle, @@ -112,7 +143,7 @@ budget par coup dérivé du temps restant (§8). ## 3. Modélisation : la classe `EscampeBoard` -`EscampeBoard` (~860 lignes) implémente `Partie1` (`setFromFile`/`saveToFile`, +`EscampeBoard` implémente `Partie1` (`setFromFile`/`saveToFile`, `isValidMove`, `possiblesMoves`, `play`, `gameOver`). Conventions de l'arbitre : coup `"B1-D1"`, placement `"C6/A6/B5/D5/E6/F5"` (licorne en tête), pass `"E"`. @@ -184,6 +215,8 @@ Bord bas A1/A2/B1/E1/F1/C2 Bord haut A6/A5/B6/C5/F5/E6 mobiles E1·F1·C2 = liserés 1·2·3 mobiles C5·F5·E6 = liserés 1·2·3 ``` +Nous n'utilisons pas de bibliothèque d'ouvertures de coups. La raison principale est que la contrainte de liseré rend l'arbre d'ouverture très sensible au placement adverse : une séquence pré-calculée contre un placement différent du nôtre perdrait toute pertinence dès le deuxième coup. De plus, le branchement moyen (~8,9) est suffisamment faible pour que l'alpha-bêta atteigne la profondeur 12–15 dès les premiers coups, rendant une bibliothèque peu utile. Le placement fixe ci-dessus suffit à garantir une position solide et reproductible dès le début. + --- ## 6. Moteur de décision