From ccdb646c01ef128ce75a1660ac3c037940c1c4b6 Mon Sep 17 00:00:00 2001 From: alva-p Date: Sun, 25 Oct 2026 01:55:16 -0300 Subject: [PATCH] =?UTF-8?q?Truco:=20se=20ve=20qu=C3=A9=20carta=20gan=C3=B3?= =?UTF-8?q?=20cada=20baza?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El motor resolvía bien las bazas (38.864 bazas al azar contra un cálculo independiente, sin errores), pero la mesa no mostraba cuál ganó cada una y con las cartas encimadas se comparaban cartas de bazas distintas. - view: bazaTop, los asientos con la carta más alta de cada baza terminada - Mesa: la carta ganadora brilla y las que perdieron se apagan - Test: el 7 de oro le gana al 4 de oro - Celu: cartas del compañero más chicas, pilas más cerca del centro y globos por encima Co-Authored-By: Claude --- src/components/TrucoCard.tsx | 1 + src/components/TrucoTable.tsx | 28 ++++++++++++++++++++-------- src/types/truco.ts | 1 + truco/engine/index.js | 5 +++++ truco/engine/test.js | 10 ++++++++++ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/components/TrucoCard.tsx b/src/components/TrucoCard.tsx index fe74e17..addfa99 100644 --- a/src/components/TrucoCard.tsx +++ b/src/components/TrucoCard.tsx @@ -227,6 +227,7 @@ const SIZES = { sm: "w-12", md: "w-16", played: "w-11 sm:w-16", + mini: "w-8 sm:w-12", hand: "w-[clamp(72px,11vw,120px)]", pile: "w-[clamp(84px,11vw,132px)]", } as const; diff --git a/src/components/TrucoTable.tsx b/src/components/TrucoTable.tsx index 39c67e8..327e0be 100644 --- a/src/components/TrucoTable.tsx +++ b/src/components/TrucoTable.tsx @@ -141,7 +141,7 @@ const TrucoTable: React.FC = ({ st, version, bubbles, handPoints, notice, -
+
{/* Tanteador: en el celu arriba de la mesa; en pantallas grandes, en la esquina libre */}
= ({ st, version, bubbles, handPoints, notice,
@@ -176,7 +176,7 @@ const TrucoTable: React.FC = ({ st, version, bubbles, handPoints, notice,
{partner - ? partner.map((c) => ) + ? partner.map((c) => ) : Array.from({ length: st.counts[s] }).map((_, i) => )}
{Math.sin(angle(s)) <= -0.5 && bubble(s, true)} @@ -184,14 +184,26 @@ const TrucoTable: React.FC = ({ st, version, bubbles, handPoints, notice, ); })} - {/* Cartas jugadas: cada uno las deja delante suyo, una por baza */} + {/* Cartas jugadas: cada uno las deja delante suyo, una por baza (la j-ésima es de la baza j). + La que ganó la baza brilla, las que perdieron se apagan; en una parda quedan las empatadas */} {st.order.map((s) => { const cards = st.played.flatMap((b) => b.filter((p) => p.seat === s).map((p) => p.card)); return ( -
- {cards.map((c) => ( - - ))} +
+ {cards.map((c, j) => { + const top = st.bazaTop?.[j]; + const won = top && st.results[j] !== "P" && top[0] === s; + const lost = top && !won && !(st.results[j] === "P" && top.includes(s)); + return ( + + ); + })}
); })} diff --git a/src/types/truco.ts b/src/types/truco.ts index 76b11d1..50a34e0 100644 --- a/src/types/truco.ts +++ b/src/types/truco.ts @@ -40,6 +40,7 @@ export interface TrucoState { counts: number[]; played: { seat: number; card: string }[][]; results: (0 | 1 | 'P')[]; + bazaTop: number[][]; envido: { state: 'NONE' | 'PENDING' | 'DONE'; chain: Llamada[]; diff --git a/truco/engine/index.js b/truco/engine/index.js index d141d7c..26fe4f6 100644 --- a/truco/engine/index.js +++ b/truco/engine/index.js @@ -307,6 +307,11 @@ function view(m, seat) { counts: m.cards.map((c) => c.length), played: h.played.map((b) => b.map((p) => ({ seat: p.seat, card: p.card.id }))), results: h.results, + // Por baza terminada, quiénes tiraron la carta más alta (en orden de juego): el primero la gana, salvo parda + bazaTop: h.played.slice(0, h.results.length).map((b) => { + const max = Math.max(...b.map((j) => fuerza(j.card))); + return b.filter((j) => fuerza(j.card) === max).map((j) => j.seat); + }), envido: { state: h.envido.state, chain: h.envido.chain, caller: h.envido.caller, // Las cartas del tanto ganador se muestran recién al terminar la mano diff --git a/truco/engine/test.js b/truco/engine/test.js index b9298ba..15b70b3 100644 --- a/truco/engine/test.js +++ b/truco/engine/test.js @@ -255,6 +255,16 @@ test('cada uno ve su mano y la del compañero, nunca la del rival', () => { assert.deepEqual(T.view(sin, 0).partners, {}); }); +test('el 7 de oro le gana al 4 de oro y la vista marca quién ganó cada baza', () => { + const m = partida(2, ['7o 4b 5b', '4o 6c 5c']); + ok(m, 0, 'jugar', { card: '7-oro' }); + ok(m, 1, 'jugar', { card: '4-oro' }); + const v = T.view(m, 1); + assert.deepEqual(v.results, [0]); + assert.deepEqual(v.bazaTop, [[0]]); + assert.equal(v.turn, 0, 'el que ganó sale en la segunda'); +}); + test('el que se levanta pierde la partida para su equipo', () => { const m = partida(4, ['3e 4o 5o', '4b 5b 6b', '3o 4c 5c', '6e 6o 6c']); assert.deepEqual(T.abandon(m, 2).events.at(-1), { type: 'fin', winner: 1 });