Língua portuguesa
Acentos e cedilha em jogos de palavras em português
MAÇÃ tem cinco letras, mas, para um teclado de A a Z, tem só três letras-base distintas e dois sinais. Jogos de palavras em português precisam decidir o que fazer com acentos e cedilha. Dois jogos do catálogo tomaram decisões diferentes, e uma delas está sendo revista.
O problema
Há três interesses em conflito. O jogador quer ver a palavra escrita corretamente, com acentos. O teclado do jogo é mais simples e legível com 26 letras do que com Á, À, Â, Ã, É, Ê, Í, Ó, Ô, Õ, Ú e Ç. E a comparação entre o palpite e a resposta precisa decidir se A e Á são a mesma letra.
A convenção do jogo de forca tradicional em português, no papel, é que a letra A revela também Á, Â e Ã, e que C revela Ç. É o comportamento que o jogador espera.
O que o Unicode oferece
Em Unicode, “Ô pode ser escrito como um único caractere (forma composta, NFC) ou como “A” seguido do sinal combinante de til (forma decomposta, NFD). A função normalize do JavaScript converte entre as duas. Em NFD, todos os sinais diacríticos ficam na faixa de U+0300 a U+036F, o que permite separá-los com uma expressão regular:
'MAÇÃ'.normalize('NFD').replace(/[\u0300-\u036f]/g, '') // 'MACA'
'Ç'.normalize('NFD').charAt(0) // 'C'
Isso resolve a comparação, mas não decide o que fazer com a grafia original.
Forca em Dupla: de “MACA” a “MAÇÔ
Na Forca em Dupla versão 1.0.1, a palavra secreta era normalizada no momento da criação: acentos removidos, tudo em maiúsculas, caracteres fora de A–Z descartados. Quem digitava MAÇÃ criava, na prática, MACA. A comparação ficava trivial, e o código do desafio só precisava transportar 26 letras e o espaço. O efeito colateral é que a palavra revelada no fim aparecia sem acento, o que em alguns casos muda o sentido (MACA também é uma palavra).
A versão 1.0.2, em preparação desde 22/10/2026, separa as duas funções:
- A palavra guardada mantém a grafia original, em forma composta. Hífen vira espaço; outros símbolos são descartados; só os sinais usados em português (agudo, til, circunflexo, cedilha e crase) são mantidos, e apenas logo após uma letra.
- A comparação usa a letra-base. Cada letra da palavra é decomposta e comparada pelo primeiro caractere. O palpite A revela todas as posições cuja base é A, e a casa exibe o caractere original: Á, Ã ou A.
const baseLetter = ch => ch.normalize('NFD').charAt(0);
// ao desenhar a palavra:
const shown = revealed.has(baseLetter(ch));
// vitória: todas as letras com base revelada
const won = [...word].every(c => !isLetter(c) || revealed.has(baseLetter(c)));
O teclado continua com 26 letras, e a regra tradicional da forca é respeitada.
Acentos dentro de um código curto
A parte menos óbvia foi o transporte. O desafio da Forca em Dupla viaja em um código curto, de 5 bits por símbolo, sem servidor. As 26 letras e o espaço ocupam os valores de 0 a 26, e sobravam cinco valores livres (27 a 31). Eles passaram a representar os cinco sinais combinantes, transmitidos logo depois da letra-base, em forma decomposta. Na leitura, o código é recomposto e normalizado de volta para NFC. Um sinal que apareça sem letra antes dele indica código corrompido e é rejeitado.
A solução mantém o alfabeto do código e o tamanho de 5 bits. O custo é que palavras acentuadas geram códigos um pouco mais longos, um símbolo por acento.
Palavra Embaralhada: palavras sem acento
Na Palavra Embaralhada versão 1.0.1, o banco de 100 palavras foi escrito diretamente sem acentos: MUSICA, VITORIA, JUSTICA, CIENCIA, ANIMACAO. A resposta é aceita quando a sequência tocada é idêntica à palavra-alvo. Não há normalização no código porque não há acento a normalizar.
A escolha é coerente com a mecânica: o jogador monta a palavra com as letras que estão na tela, então botões “Ç” ou “Ô entregariam boa parte da resposta. Mas, em um jogo cujo atrativo é vocabulário com definição, mostrar CIENCIA em vez de CIÊNCIA ensina a grafia errada. A correção natural é a mesma da forca: guardar a palavra acentuada para exibição, gerar os botões a partir das letras-base e comparar pela base.
É o que faz a versão 1.0.2, em preparação. O banco foi ampliado e cada entrada guarda a grafia correta (PÃO, CÉU, MÃO, CHÁ, LEÃO). Uma função remove os sinais para formar as letras e comparar a resposta, e a palavra acentuada é mostrada quando o jogador acerta. A mesma versão aceita anagramas válidos previstos no banco: se as letras formam outra palavra conhecida, ela não é tratada como erro.
const stripAccents = text => text.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '').toUpperCase().replace(/[^A-Z]/g, '');
Comparação das abordagens
| Abordagem | Vantagem | Custo |
|---|---|---|
| Remover acentos na entrada | Código e comparação simples | Grafia errada na tela; pode mudar o sentido |
| Banco escrito sem acentos | Nenhum tratamento necessário | Mesmo problema de grafia, fixado nos dados |
| Guardar original e comparar pela base | Grafia correta e teclado simples | Exige normalização cuidadosa e transporte dos sinais |
| Teclado com letras acentuadas | Comparação exata | Teclado lotado; regra diferente da forca tradicional |
Recomendações
- Separe a forma de exibição (original, NFC) da forma de comparação (letra-base).
- Normalize sempre na mesma etapa: dados vindos de colagem, teclado virtual ou código podem chegar em NFC ou NFD.
- Defina explicitamente quais sinais são aceitos; descartar tudo o que não é A–Z também apaga Ç e Ã.
- Teste com palavras em que o acento muda o sentido: MACA e MAÇÃ, PAIS e PAÍS, AVO e AVÔ.
- Lembre-se de que maiúsculas e minúsculas também passam por regras de Unicode; normalize antes de converter.