Truco Mineiro em TypeScript: Manilhas e Comparador
Résumé
No servidor Pixel, este anúncio apresenta um comparador de cartas para truco mineiro em TypeScript. Explica as quatro manilhas fixas, a ordem das cartas comuns e os empates sem desempate por naipe, além de destacar casos que podem causar bugs e testes para validar a lógica.
DEV Community
Truco mineiro em código: manilhas fixas e comparador de cartas
No truco paulista a manilha muda a cada mão, porque depende da vira. No truco mineiro não: são quatro cartas fixas, e isso muda bastante o código do comparador. Aqui vai a versão que usamos para conferir jogada, em TypeScript. As regras que o código precisa conhecer Baralho de 40 cartas (o de 52 sem 8, 9 e 10). Quatro manilhas que nunca mudam, da mais forte para a mais fraca: 4 de paus (zap), 7 de copas, ás de espadas (espadilha) e 7 de ouros (pica-fumo). Não existe vira. As demais cartas seguem esta ordem: 3, 2, ás, rei, valete, dama, 7, 6, 5, 4. Entre elas o naipe não desempata. O comparador type Carta = { valor: string; naipe: "P" | "C" | "E" | "O" };
// zap, 7 de copas, espadilha, pica-fumo
const MANILHAS = ["4P", "7C", "AE", "7O"];
const ORDEM_COMUM = ["3", "2", "A", "K", "J", "Q", "7", "6", "5", "4"];
const id = (c: Carta) => c.valor + c.naipe;
export function forca(c: Carta): number {
const i = MANILHAS.indexOf(id(c));
if (i >= 0) return 100 - i; // manilhas sempre acima das comuns
return 50 - ORDEM_COMUM.indexOf(c.valor); // empata pelo número
}
export function vence(a: Carta, b: Carta): "a" | "b" | "empate" {
const fa = forca(a);
const fb = forca(b);
return fa === fb ? "empate" : fa > fb ? "a" : "b";
}
Dois detalhes que dão bug se passarem batido: Ás de espadas é manilha, os outros ases não. A checagem das manilhas precisa vir antes da ordem comum. O mesmo vale para o 7: só o de copas e o de ouros são manilha; o de paus e o de espadas são 7 comuns. Empate de verdade. Dois 3 de naipes diferentes empatam. Se o seu motor desempata por naipe (como no paulista, quando duas manilhas disputam), vai errar a rodada. Testes que valem a pena const c = (valor: string, naipe: Carta["naipe"]): Carta => ({ valor, naipe });
console.assert(vence(c("4", "P"), c("7", "C")) === "a"); // zap vence tudo
console.assert(vence(c("A", "E"), c("A", "C")) === "a"); // espadilha x ás comum
console.assert(vence(c("3", "O"), c("3", "P")) === "empate");
console.assert(vence(c("7", "P"), c("Q", "C")) === "b"); // 7 comum perde para dama
A escalada da mão Outro ponto em que o mineiro é diferente: a mão limpa vale 2 pontos e sobe em 4 (truco), 6, 10 e 12. Algumas fontes contam 1, 3, 6, 9 e 12, porque a escada varia por região. No nosso motor a escada fica numa tabela de configuração, não espalhada pelo código: const ESCADA_MINEIRO = [2, 4, 6, 10, 12];
Se você escrever o seu, deixe isso configurável, porque a turma de cada lugar joga de um jeito. Para conferir na mesa A página com a ordem das cartas e as diferenças para o paulista está em Truco mineiro: manilhas fixas e regras. Para jogar uma mão contra o computador, o treino fica em buteco.club/treinar/truco. Fontes das regras: Pagat e FocusGN.

Powered by Readybot.io