Phrases du maître : grosse erreur sans « sur N », rang cité seulement s'il est proche ; « Mon coup frappe un pion. »

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-10 05:23:48 +01:00
co-authored by Claude Opus 5.5
parent 3ae1f23938
commit 9dce965164
3 changed files with 33 additions and 6 deletions
+4 -2
View File
@@ -73,6 +73,7 @@ export const PHRASE_KEYS: readonly string[] = [
"coup.douteux",
"coup.mauvais",
"coup.tres-mauvais",
"coup.tres-mauvais.loin",
"fait.frappe",
"fait.frappe-plusieurs",
"fait.point",
@@ -131,7 +132,6 @@ function moveWords(phrases: MasterPhrases, advice: MoveAdvice): MasterWords {
best: advice.best.notation,
played: advice.played.notation,
rank: String(advice.rank),
count: String(advice.moveCount),
roll: `${advice.roll[0]}-${advice.roll[1]}`,
};
const fill = (key: string, extra: Readonly<Record<string, string>> = {}) =>
@@ -149,7 +149,9 @@ function moveWords(phrases: MasterPhrases, advice: MoveAdvice): MasterWords {
good: "coup.proche",
doubtful: "coup.douteux",
bad: "coup.mauvais",
veryBad: "coup.tres-mauvais",
// Une grosse erreur ne cite son rang que s'il est proche (2e ou
// 3e choix) ; plus loin, le classement est dans les chiffres.
veryBad: advice.rank <= 3 ? "coup.tres-mauvais" : "coup.tres-mauvais.loin",
}[verdict];
base = fill(key);
fact = differenceFact(phrases, advice);
+18 -1
View File
@@ -165,10 +165,27 @@ test("le coup du maître est nommé, et le fait qui distingue les coups vient du
assert.equal(said.title, "J'aurais joué 8/5 6/5");
assert.equal(
said.phrase,
`J'aurais joué 8/5 6/5. Votre 24/23 13/10 était le ${worst.rank}e choix sur 16. Mon coup fait votre point 5.`,
"J'aurais joué 8/5 6/5. Votre 24/23 13/10 était le 2e choix. Mon coup fait votre point 5.",
);
});
test("grosse erreur : le rang n'est cité que pour un 2e ou 3e choix", async () => {
const engine = await loadNodeEngine();
const worst = (await adviceOn(
engine,
await playOpening(engine, [3, 1], "24/23 13/10"),
)) as MoveAdvice;
for (const rank of [2, 3, 4, 7, 15]) {
const { phrase } = masterWords(phrases, { ...worst, rank });
if (rank <= 3) {
assert.ok(phrase.includes(`était le ${rank}e choix`), phrase);
} else {
assert.ok(!phrase.includes("choix"), phrase);
assert.equal(phrase, "J'aurais joué 8/5 6/5. Mon coup fait votre point 5.");
}
}
});
test("décisions de videau : la décision du maître et le contexte", async () => {
const engine = await loadNodeEngine();
const missed = await adviceOn(engine, await playerRollsWithoutDoubling(engine));
+11 -3
View File
@@ -34,7 +34,6 @@ mots entre accolades sont remplis avec les données du moteur :
| `{played}` | votre coup, même notation |
| `{move}` | le coup dont parle le fait (le vôtre ou celui du maître) |
| `{rank}` | le rang de votre coup dans le classement du moteur (2, 3…) |
| `{count}` | le nombre de coups possibles avec ce jet |
| `{points}` | « votre point 5 » ou « vos points 5 et 7 » |
| `{roll}` | le jet, « 3-1 » |
| `{hits}` | le nombre de pions frappés, en chiffres |
@@ -89,7 +88,16 @@ Tout ce qui précède la première section `## mot.…` n'est pas lu.
## coup.tres-mauvais
- J'aurais joué {best}. Votre {played} était le {rank}e choix sur {count}.
Votre coup est le 2e ou le 3e choix du moteur.
- J'aurais joué {best}. Votre {played} était le {rank}e choix.
## coup.tres-mauvais.loin
Votre coup est plus loin dans le classement : le rang n'est pas dit ici, il
se lit dans « Voir les chiffres du moteur ».
- J'aurais joué {best}.
## fait.frappe
@@ -109,7 +117,7 @@ Tout ce qui précède la première section `## mot.…` n'est pas lu.
## fait.maitre-frappe
- Mon coup frappe un pion, le vôtre non.
- Mon coup frappe un pion.
## fait.maitre-point