PlayerWords

Atividade de adivinhação de vocabulário para o Moodle — documentação completa.

English | Português

View on GitHub Download .zip

Moodle License Status Latest Release PlayerGames Ecosystem Game Activity Author

Moodle Plugin CI Last Commit Open Issues

O PlayerWords é uma atividade de adivinhação de palavras para o Moodle. O estudante adivinha uma palavra oculta letra por letra dentro de um número configurável de tentativas, recebendo feedback visual em cores e símbolos a cada chute.

👈 Use a barra lateral para pular direto a qualquer seção desta página.


✨ Funcionalidades

🎓 Finalidade Educacional

O PlayerWords foi projetado para:

Indicado para:

🕹️ Ecossistema PlayerGames

O PlayerWords faz parte do ecossistema de gamificação PlayerGames para Moodle. Sua principal integração direta é com o bloco PlayerHUD:

Veja o hub do PlayerGames para a família completa de plugins.

🧩 Integração Opcional: Central de IA

A funcionalidade opcional de Geração de palavras por IA do PlayerWords pode usar o Central de IA (local_aihub, do mesmo autor, parte dos serviços compartilhados do ecossistema PlayerGames). Quando o Central de IA está instalado, qualquer chave pessoal ou do site que um professor ou administrador já tenha configurado lá fica automaticamente disponível para o PlayerWords — sem precisar reconfigurar a chave. O PlayerWords nunca contata um provedor de IA diretamente; sem o Central de IA instalado, ele recorre ao subsistema core_ai do próprio Moodle, roteando para o provedor que o administrador do site tiver configurado lá.

👉 https://github.com/jeanlucio/moodle-local_aihub

📦 Requisitos

Componente Versão
Moodle 4.5 – 5.2
PHP 8.1+
PlayerHUD (opcional) v1.7.1+

🛠️ Instalação e Configuração

  1. Baixe o arquivo .zip ou clone este repositório.
  2. Extraia na pasta mod/ do seu Moodle.
  3. Renomeie para playerwords (se necessário). Caminho final: seu-moodle/mod/playerwords/
  4. Acesse Administração do site > Notificações para concluir a instalação.
  5. Adicione uma atividade PlayerWords a qualquer curso.

Este plugin não tem configurações de nível de site para o administrador ajustar — toda configuração é feita pelo professor ao adicionar a atividade a um curso, conforme explicado em Como Usar logo abaixo. Se o block_playerhud não estiver instalado no site, a própria página de configurações do plugin em Administração do site → Plugins → Módulos de atividade → PlayerWords mostra um aviso informativo sobre isso — não há nada a configurar ali de qualquer forma.

📖 Como Usar

  1. Adicione uma atividade PlayerWords ao seu curso.
  2. Configure:
    • Faixa de comprimento de palavras e máximo de tentativas
    • Tempo de recarga entre rodadas e limite de rodadas
    • Se dicas são permitidas
    • Modo de palavras (aleatório ou sequência compartilhada)
    • Método de nota e configurações do livro de notas
    • Fontes de palavras (manual, Glossário), fonte de glossário e uma lista de stopwords para ignorar ao dividir conceitos com várias palavras (todos opcionais) — a geração por IA fica sempre disponível na página Gerenciar palavras, independente dessas caixas de fonte
    • Custos em itens do PlayerHUD e concessão por vitória (opcional, quando o bloco PlayerHUD está presente)
  3. Acesse Gerenciar palavras para adicionar, gerar com IA, aprovar, editar ou excluir palavras.
  4. Os estudantes jogam diretamente na página da atividade — chutando, revelando dicas e desistindo de rodadas, sem recarregar a página. O toolbar da própria página dá acesso às regras (ajuda), ao registro de tentativas e ao ranking.
  5. Notas e ranking são atualizados automaticamente após cada rodada.

🧮 Nota e Ranking

O PlayerWords calcula uma nota e um total de ranking a partir das mesmas rodadas terminadas, mas os dois são configurados de forma totalmente independente — o professor pode manter a nota simples e ainda assim recompensar jogadas eficientes no ranking, ou o contrário.

Os dois são totalmente opcionais, e cada um liga/desliga por conta própria:

Desligar um nunca afeta o outro: uma atividade pode ter nota sem ranking, ranking sem nota, os dois, ou nenhum dos dois.

A pontuação por rodada decide quanto vale uma única rodada, escolhida separadamente para a nota e para o ranking (configurações Pontuação da nota / Pontuação do ranking, ambas com padrão Binária). A nota usa a nota máxima configurada da atividade como base; o ranking sempre usa sua própria base fixa de 100 pontos, totalmente independente da nota — mesmo numa atividade sem nota nenhuma (Nota = Nenhuma, o padrão do formulário), o ranking continua funcionando normalmente:

Modo Uma rodada vencida vale… Uma rodada perdida, desistida ou com tempo esgotado
Binária (padrão) A base cheia (nota da atividade, ou 100 pontos fixos no ranking) Zero
Linear Base cheia nas duas primeiras tentativas, depois uma fração proporcional às tentativas poupadas: base × (max_attempts − tentativas_usadas + 1) / (max_attempts − 1) Zero

O modo linear dá pontuação cheia nas duas primeiras tentativas — um segundo palpite certeiro não é tratado como menos merecedor que um acerto de primeira, já que este é um jogo educativo não punitivo, não uma disputa de sorte — e só a partir daí distribui as tentativas restantes proporcionalmente, nunca zerando totalmente uma vitória: até vencer na última tentativa permitida ainda rende uma fração positiva. Exemplo com 6 tentativas — a coluna de nota assume uma nota máxima 100, mas a coluna de ranking vale exatamente assim em qualquer atividade, mesmo sem nota nenhuma configurada:

Tentativas usadas Nota (base 100) Ranking (base 100, sempre)
1 100,00 100,00
2 100,00 100,00
3 80,00 80,00
4 60,00 60,00
5 40,00 40,00
6 20,00 20,00
Não completou 0,00 0,00

Com Máximo de tentativas igual a 2 ou menos, o modo Linear fica numericamente idêntico ao Binário — toda tentativa permitida já cai dentro do platô de pontuação cheia.

Combinar várias rodadas numa nota final é uma configuração separada, Método de avaliação (maior nota, média, primeira tentativa, última tentativa ou média sobre todas as rodadas exigidas). Funciona igual independente de a pontuação por rodada acima ser Binária ou Linear: só agrega o valor que cada rodada já registrou.

O ranking é a soma dos pontos de ranking de todas as rodadas terminadas de um estudante (SUM), ordenado do maior para o menor; empates são desfeitos por menos tentativas usadas em média, depois menos tempo gasto em média. Só aparece quando o professor liga “Mostrar ranking”, e nunca revela uma rodada ainda em andamento.

Só os 5 primeiros aparecem — de propósito, não é bug: tanto o mini-ranking dentro do jogo quanto a página dedicada limitam a lista a 5 linhas, pra evitar expor o ranking da turma inteira publicamente. Um estudante mais abaixo continua vendo exatamente onde está: uma linha extra, separada por “…”, mostra sua posição e pontuação reais, sem revelar a colocação de mais ninguém abaixo do 5º lugar. Quem pode gerenciar a atividade (professor editor, gerente) nunca aparece no ranking, mesmo que jogue a atividade — a mesma regra que exclui suas próprias tentativas do registro de tentativas abaixo.

“Mostrar ranking” só controla a exibição, não a coleta de dados: os pontos de ranking são calculados e gravados em toda rodada terminada, esteja a configuração ligada ou desligada naquele momento. Ligá-la depois que os estudantes já jogaram revela o total acumulado desde o início da atividade, não só os pontos ganhos a partir da mudança — nada se perde, e não é preciso “recuperar” nada ao desligar e ligar de novo.

Trava ao registrar a nota: assim que a atividade registra uma nota real para qualquer estudante, Máximo de tentativas e Pontuação da nota travam — do mesmo jeito que o Moodle já trava o campo “Nota máxima” de uma atividade avaliada assim que existem notas reais. Isso garante que toda rodada já registrada para aquela atividade foi pontuada sob exatamente as mesmas regras de nota durante toda a vida da atividade.

Pontuação do ranking trava separadamente, assim que existe qualquer tentativa finalizada — não espera uma nota real, porque os pontos de ranking já são calculados e gravados em toda rodada terminada independente de Nota ou Mostrar ranking estarem ligados (ver acima). Uma atividade sem nota nenhuma, só com ranking, já acumula histórico real desde a primeira rodada; travar o modo de pontuação assim que esse histórico existe evita a mesma inconsistência de escala que a trava acima evita para a nota.

Registro de tentativas: cada estudante pode conferir suas próprias rodadas passadas — palavra, tentativas usadas, tempo, nota da rodada e (quando o ranking está ligado) pontos no ranking — numa página dedicada do toolbar. Quem pode gerenciar a atividade também vê essa mesma página, incluindo as próprias tentativas caso já tenha jogado a atividade. O relatório de todos os estudantes vive numa página separada, visível só para quem gerencia a atividade: uma tabela com as tentativas de todos os estudantes, 30 linhas por página, ordenável clicando em qualquer cabeçalho de coluna, e filtrável para um único estudante. Assim como no ranking, esse relatório nunca inclui as próprias tentativas de quem gerencia.

Excluir tentativas reverte essas travas quando elas deixam de se aplicar. No relatório com todos os estudantes, quem gerencia a atividade pode excluir tentativas de um estudante individualmente ou em lote. A exclusão realmente limpa a nota daquele estudante em vez de deixar um valor obsoleto para trás, então se todas as tentativas de todos os estudantes forem removidas, Máximo de tentativas e Pontuação da nota destravam de novo exatamente como grade_item::has_grades() espera — do mesmo jeito que aconteceria numa atividade nunca jogada. Pontuação do ranking segue a mesma lógica direto contra a tabela de tentativas, independente de a nota estar ligada.

🧪 Testes Automatizados

O PlayerWords inclui uma suíte PHPUnit cobrindo lógica de negócio, consultas ao repositório, web services e conformidade com a Privacy API, além de uma suíte Behat cobrindo o jogo, a integração com o PlayerHUD e os relatórios de ponta a ponta num navegador real. Todo push de CI executa a matriz completa (Moodle 4.5 → 5.x, PostgreSQL e MariaDB).

PHPUnit — Testes Centrais

Arquivo de teste Casos
backup_restore_test.php 6
cross_instance_security_test.php 4
lib_grant_potential_test.php 6
lib_reset_userdata_test.php 4
lib_supports_test.php 2
completion/custom_completion_test.php 7
privacy/provider_test.php 30
lib_update_grades_test.php 2
mod_form_test.php 3
lib_grade_item_update_test.php 2
Subtotal 66

Testes de Lógica de Negócio (tests/local/)

Arquivo de teste Casos
ai_word_generator_test.php 17
attempts_history_service_test.php 23
gameplay_service_test.php 20
hud_service_test.php 28
intro_service_test.php 5
ranking_service_test.php 9
round_presenter_test.php 46
round_service_test.php 61
view_page_service_test.php 22
word_normalizer_test.php 16
words_repository_test.php 65
Subtotal 312

Testes de Web Services (tests/external/)

Arquivo de teste Casos
count_eligible_words_test.php 6
count_glossary_candidates_test.php 5
end_round_test.php 6
new_round_test.php 5
reveal_hint_test.php 8
start_round_test.php 7
submit_guess_test.php 10
Subtotal 47
Total Geral 425
vendor/bin/phpunit --testsuite mod_playerwords

Cobertura de linhas geral (moodle-coverage, PHPUnit + Xdebug): 90%.

Behat — Testes de Ponta a Ponta

Arquivo de feature Cenários
mod_playerwords_smoke.feature 1
mod_playerwords_gameplay.feature 7
mod_playerwords_playerhud.feature 4
mod_playerwords_reports.feature 5
mod_playerwords_settings.feature 4
mod_playerwords_toolbar.feature 9
Subtotal 30

Ver o detalhamento completo de cada teste e a tabela de cobertura →

🔐 Segurança e Conformidade

🔒 Divulgação de Serviço de Terceiros

A geração de palavras por IA é opcional e vem desativada por padrão. Quando um professor a usa, o tema da atividade (nunca dados de estudante ou registros de tentativa) é enviado através do Central de IA (local_aihub) — usando a chave própria (BYOK) do usuário ou do site, se o plugin estiver instalado — ou, como alternativa, através do subsistema de IA nativo do Moodle (core_ai), que roteia para o provedor configurado pelo administrador do site. O PlayerWords nunca contata um provedor de IA diretamente; a requisição e sua divulgação/consentimento são de responsabilidade exclusiva do local_aihub ou do core_ai. Se nenhum dos dois estiver instalado ou configurado, a fonte de palavras por IA fica indisponível e todas as outras funcionalidades continuam funcionando normalmente.

📄 Licença

Este projeto é licenciado sob a GNU General Public License v3 (GPLv3).

Copyright: 2026 Jean Lúcio