Língua portuguesa

Acentos e cedilha em jogos de palavras em português

Por Fernando Capanema, SpiderWorks · Publicado em

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:

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

AbordagemVantagemCusto
Remover acentos na entradaCódigo e comparação simplesGrafia errada na tela; pode mudar o sentido
Banco escrito sem acentosNenhum tratamento necessárioMesmo problema de grafia, fixado nos dados
Guardar original e comparar pela baseGrafia correta e teclado simplesExige normalização cuidadosa e transporte dos sinais
Teclado com letras acentuadasComparação exataTeclado lotado; regra diferente da forca tradicional

Recomendações