• Enunciado completo do jogo Campo Minado (Minesweeper)

    Jogo Campo Minado — Enunciado e Implementação | Herez

    Jogo Campo Minado

    Divulgação do enunciado: 02/05/2026 — Prazo de entrega: 27/06/2026 — Disciplina: Introdução ao desenvolvimento de jogos digitais e javascript

    Enunciado completo do jogo Campo Minado (Minesweeper): regras, especificações das classes a implementar (Tabuleiro, JogadorHumano, JogadorAutomatico), exemplos de uso, dicas de implementação e critérios de avaliação e entrega. Leia também o jogo hospedado em herez.com.br/campo-minado/.

    1. Introdução

    O objetivo é implementar uma versão do jogo Campo Minado, incluindo a construção do tabuleiro e a implementação de jogadores (humano e automático). Antes de começar, recomenda-se jogar algumas partidas em uma implementação conhecida para compreender as regras.

    😂 Piadas sobre o jogo Campo Minado

    • 1. Por que o programador levou uma pá para o jogo? Porque ouviu que ia ter muitas minas para depurar. 😂
    • 2. Jogador automático: “Escolho a posição (1,1)!” Tabuleiro: “Surpresa!” Jogador automático: “Era só um teste unitário.” 😂
    • 3. Como o Campo Minado pede feedback? “Clique aqui para reportar um bug… e aqui para explodir ele.” 😂
    • 4. Por que o primeiro clique nunca é uma mina? Porque o jogo também acredita em segundas chances. 😉
    • 5. Dica de otimização: se o seu algoritmo sempre perde, troque o nome da função para ganhar() — pelo menos o log vai ficar bonito. 😂
    • 6. O que disse o tabuleiro ao jogador indeciso? “Relaxa, eu já marquei suas dúvidas com uma bandeira.” 😂
    • 7. Por que o professor pediu o código do Tabuleiro? Para ver se o aluno sabia lidar com exceções… e com explosões. 😉
    • 8. Se a IA do jogo perder no xadrez, ela culpa o tabuleiro; se perder no Campo Minado, culpa o RNG. 😂

    💣 Piadas rápidas — Campo Minado & Programadores

    • 1. Por que o programador adora o Campo Minado? Porque é o único lugar onde marcar uma bandeira é considerado progresso. 😂
    • 2. Primeiro clique seguro: quando o jogo garante que a primeira jogada não explode, é o equivalente a um teste unitário que passa na primeira execução. 😂
    • 3. O jogador automático disse que ia usar heurística — na prática, virou um gerador de números aleatórios com diploma. 😂
    • 4. Como o programador chama uma posição suspeita? “TODO: verificar depois” — e marca com uma bandeira para lembrar. 😂
    • 5. Dica de debugging: se o seu algoritmo sempre encontra minas, talvez o bug esteja no RNG — ou no karma. 😂
    • 6. Professor: “Mostre o código.” Aluno: “Mostre o tabuleiro.” Ambos esperam que ninguém exploda durante a demonstração. 😂
    • 7. Por que o tabuleiro é um bom colega de trabalho? Porque sempre revela o que precisa ser melhorado — às vezes com muita energia. ⚡️
    • 8. Se a IA perde no xadrez, culpa a estratégia; se perde no Campo Minado, culpa o RNG — o clássico “não é bug, é aleatoriedade”. 😂

    2. Regras do jogo

    O jogo é jogado em um tabuleiro quadriculado (matriz n × m) com k minas posicionadas aleatoriamente. O jogador revela posições até encontrar todas as minas ou até revelar uma posição com mina (perdendo).

    Comportamento ao revelar uma posição

    • Se a posição contém uma mina → jogador perde; o tabuleiro revela todas as minas.
    • Se a posição não contém mina → a posição é rotulada com o número de minas nas oito posições adjacentes.
    • Se esse número for zero → todas as posições adjacentes são reveladas recursivamente (efeito “expansão”).
    Observação: o jogo deve garantir que a primeira escolha do jogador nunca seja uma posição com mina.

    3. Especificação do exercício

    Implementar as seguintes classes em Java, respeitando as interfaces pedidas para permitir testes automáticos:

    3.1 Classe Tabuleiro

    A classe Tabuleiro deve oferecer os construtores e métodos abaixo.

    // Construtores:
    public Tabuleiro(int n, int m, int k);
    public Tabuleiro(int i);
    
    // Métodos de acesso:
    public int numLinhas();
    public int numColunas();
    public int numMinas();
    
    // Métodos de usuário:
    public int numPosRestantes();
    public int numPosReveladas();
    public int numJogadas();
    public boolean fim();
    public boolean ganhou();
    public boolean perdeu();
    public void recomeca();
    public void imprimeTabuleiro();
    public int jogada(int i, int j);
    

    Comportamento do construtor: Tabuleiro(int i) cria níveis predefinidos:

    • Fácil: n=8, m=8, k=10 (i = 1)
    • Médio: n=16, m=16, k=40 (i = 2)
    • Difícil: n=16, m=30, k=99 (i = 3)

    Se os parâmetros do construtor com três inteiros não forem viáveis, criar um tabuleiro de nível fácil.

    Retorno do método jogada

    • -1 → posição contém mina (jogador perdeu)
    • 0 → todas as posições foram reveladas (jogador venceu)
    • 1 → posição foi revelada com sucesso
    • 2 → posição já havia sido revelada antes
    • -2 → parâmetros inválidos

    Após fim da partida, jogada deve sempre devolver o mesmo valor (0 ou -1).

    3.1.1 Representação do tabuleiro

    Sugestão de representação por matriz de inteiros com valores:

    • -2 → posição contém mina;
    • -1 → posição não contém mina e não foi revelada;
    • i (0 ≤ i ≤ 8) → posição revelada com i minas nas 8 vizinhas.

    Dica: crie uma moldura (borda) e use matriz de tamanho (n+2) × (m+2) para simplificar verificações de vizinhança.

    3.1.2 Exemplo de uso

    > Tabuleiro tab = new Tabuleiro(1);
    > tab.jogada(1,7)
    1
    > tab.imprimeTabuleiro()
    1 2 3 4 5 6 7 8
    /-----------------\
    1 | + + 1 0 0 0 0 0 | 1
    2 | + + 3 2 1 1 0 0 | 2
    3 | + + + + + 1 0 0 | 3
    4 | + + 3 2 1 1 0 0 | 4
    5 | + + 1 0 0 0 1 1 | 5
    6 | + + 3 2 1 1 2 + | 6
    7 | + + + + + + + + | 7
    8 | + + + + + + + + | 8
    \-----------------/
    

    3.2 Classe JogadorHumano

    Permitir que uma pessoa jogue via teclado. Cada objeto deve oferecer o método public void iniciaJogo(), que conduz a partida, pedindo nível (ou tabuleiro personalizado) e coordenadas a cada iteração.

    3.3 Classe JogadorAutomatico

    Deve fornecer o método public boolean iniciaJogo(Tabuleiro t), que joga a partida no tabuleiro t e retorna true se vencer. Estratégia simples (aleatória) é aceitável; estratégias mais inteligentes são opcionais.

    4. Itens opcionais

    • Marcar o tempo do jogo;
    • Adicionar marcação de posições suspeitas (flags);
    • Tornar o jogador automático mais inteligente;
    • Criar interface gráfica.

    5. Observações importantes

    Sobre elaboração: o trabalho pode ser feito em dupla com programação pareada; siga as regras de cooperação descritas no enunciado.

    Sobre entrega: escreva cada classe em arquivo separado e inclua o cabeçalho sugerido no início de cada arquivo.

    6. Critérios de avaliação e entrega

    • Exercícios copiados receberão nota ZERO.
    • Exercícios atrasados não serão aceitos.
    • Qualidade de comentários, indentação e clareza das saídas influenciam a nota.
    • Prazo de entrega: 27/06/2026.

    7. Cabeçalho sugerido para arquivos

    /***********************************************************/
     /**
     Exercício-Programa -- Campo Minado
     Arquivo: <nome do arquivo>
     <nome do(a) aluno(a)>
     <número do(a) aluno(a)>
     <data de entrega>
     /***********************************************************/
    
    Link relacionado: versão hospedada e recursos adicionais em https://herez.com.br/campo-minado/.
    Tags sugeridas: Campo Minado Minesweeper Javascript Jogo Online

    Herez: Enunciado para programar o jogo Campo Minado

    Post gerado e otimizado para SEO por Herez visando a divulgação dos jogos do site e do jogo campo minado hospedado em herez.com.br/campo-minado/.

  • Comandos Linux para gerenciar Memória e Processos

    Comandos essenciais e exemplos práticos | Herez

    Comandos essenciais e exemplos práticos | Herez

    Post criado por Herez. Guia objetivo com explicação de comandos essenciais para administração de servidores e DevOps.

    Este post descreve comandos básicos de sistema e processos em Linux, detalha o que cada comando faz e traz exemplos profissionais de como Herez os utilizou em operações reais de administração e automação.

    Comandos e explicações

    date

    O que faz: mostra a data e hora atuais do sistema.

    $ date
    Exemplo profissional (Herez): ao investigar logs de um deploy automatizado, Herez usou date para confirmar o timestamp do servidor antes de correlacionar entradas de log entre máquinas em fusos horários diferentes.

    uptime

    O que faz: informa há quanto tempo o sistema está ligado, carga média e usuários conectados.

    $ uptime
    Exemplo profissional (Herez): após um pico de latência, Herez executou uptime para verificar se a carga média estava elevada e correlacionou com um cron job que iniciou no mesmo período.

    whoami

    O que faz: exibe o usuário atual no shell.

    $ whoami
    Exemplo profissional (Herez): durante manutenção remota, Herez usou whoami em scripts de deploy para garantir que comandos críticos eram executados com o usuário correto (evitando executar como root por engano).

    free -h

    O que faz: mostra uso de memória (RAM e swap) em formato legível (-h = human readable).

    $ free -h
    Exemplo profissional (Herez): ao diagnosticar um serviço que consumia memória, Herez rodou free -h antes e depois de reiniciar o serviço para quantificar a redução de uso de memória e ajustar limites de container.

    df -h

    O que faz: exibe espaço em disco usado e disponível em todas as partições, em formato legível.

    $ df -h
    Exemplo profissional (Herez): em um incidente de falta de espaço, Herez usou df -h para identificar partições quase cheias e priorizar limpeza de logs e arquivos temporários.

    du -sh pasta

    O que faz: mostra o tamanho total de um diretório especificado de forma resumida e legível (-s = summary, -h = human readable).

    $ du -sh /var/log
    Exemplo profissional (Herez): para localizar diretórios que consumiam espaço, Herez executou du -sh em subpastas de /var e identificou logs antigos que foram compactados e arquivados.

    uname -a

    O que faz: exibe informações detalhadas do kernel e do sistema operacional.

    $ uname -a
    Exemplo profissional (Herez): antes de compilar um módulo de kernel para otimização, Herez usou uname -a para confirmar versão do kernel e arquitetura da máquina.

    ps

    O que faz: lista processos em execução no shell atual.

    $ ps
    Exemplo profissional (Herez): em scripts de verificação, Herez usou ps para checar se um processo de manutenção havia sido iniciado corretamente antes de prosseguir com etapas dependentes.

    ps aux

    O que faz: lista todos os processos do sistema com detalhes (usuário, CPU, memória, comando).

    $ ps aux
    Exemplo profissional (Herez): para identificar processos que consumiam CPU excessiva, Herez rodou ps aux --sort=-%cpu e isolou o PID do serviço a ser otimizado.

    top

    O que faz: monitor em tempo real dos processos, uso de CPU, memória e carga do sistema.

    $ top
    Exemplo profissional (Herez): durante um pico de uso, Herez abriu top para observar comportamento em tempo real e identificar processos que precisavam ser reiniciados ou limitados via cgroups.

    kill PID

    O que faz: envia sinal SIGTERM ao processo identificado por PID, solicitando encerramento gracioso.

    $ kill 12345
    Exemplo profissional (Herez): ao encerrar um worker que não respondia a requisições, Herez primeiro tentou kill PID para permitir limpeza de recursos antes de forçar encerramento.

    kill -9 PID

    O que faz: envia sinal SIGKILL ao processo, forçando encerramento imediato sem chance de limpeza.

    $ kill -9 12345
    Exemplo profissional (Herez): quando um processo travado não respondia a SIGTERM e comprometia a estabilidade do serviço, Herez usou kill -9 como último recurso, documentando o evento e acionando reinício controlado.

    Boas práticas e recomendações

    • Documente ações críticas: sempre registre PID, horário e motivo ao encerrar processos em produção.
    • Prefira encerramento gracioso: tente kill PID antes de kill -9 para evitar corrupção de dados.
    • Monitore continuamente: combine top e ps aux com ferramentas de monitoramento para alertas proativos.
    • Automatize verificações: scripts que usam uptime, free -h e df -h ajudam a detectar degradação antes de incidentes.
    Observação: estes comandos são poderosos; execute-os com cuidado em ambientes de produção e, quando possível, em janelas de manutenção ou ambientes de teste.

    Post criado por Herez para documentação interna e compartilhamento de boas práticas em administração de servidores. Para referência e mais conteúdos técnicos, procure por herez.com.br.

    Última atualização: 16 de abril de 2026

  • Repositórios para aprender AI, Machine Learning, Deep Learning, NLP e Reinforcement Learning

    Repositórios para aprender AI/ML — Herez

    Repositórios para aprender AI/ML

    Autor: Herez

    Este post reúne descrições práticas de repositórios que eu, Herez, utilizei para estudar inteligência artificial e aprendizado de máquina. Para cada repositório há uma explicação objetiva e um exemplo real de como o utilizei para aprender, experimentar ou aplicar conceitos.


    microsoft/ML-For-Beginners

    O que é: Coleção estruturada de lições e notebooks para iniciantes em machine learning, cobrindo conceitos fundamentais com exercícios práticos.

    Como eu usei: Segui os notebooks de regressão e classificação para revisar conceitos básicos; adaptei um notebook de classificação para um dataset próprio e comparei resultados com diferentes pré-processamentos.

    Avik-Jain/100-Days-Of-ML-Code

    O que é: Plano de estudos com 100 exercícios e projetos curtos para praticar ML diariamente.

    Como eu usei: Adotei a rotina de 30 dias focada em feature engineering e deploy simples; documentei cada experimento em um repositório pessoal para acompanhar evolução.

    TheAlgorithms/Python

    O que é: Implementações em Python de algoritmos clássicos (estruturas de dados, algoritmos de busca, otimização), úteis para entender fundamentos computacionais.

    Como eu usei: Estudei implementações de algoritmos de otimização e reescrevi versões simplificadas para entender como gradientes e buscas locais funcionam em problemas de ML.

    mml-book/mml-book.github.io

    O que é: Material didático sobre machine learning moderno, com explicações teóricas e exemplos práticos.

    Como eu usei: Consultei capítulos sobre regularização e generalização para ajustar hiperparâmetros em modelos de redes neurais que eu treinava em pequenos datasets.

    GokuMohandas/Made-With-ML

    O que é: Coleção de projetos e tutoriais práticos que mostram aplicações reais de ML, desde protótipos até deploy.

    Como eu usei: Inspirei-me em um projeto de classificação de texto para montar um pipeline de pré-processamento e deploy em container para um protótipo pessoal.

    labmlai/annotated_deep_learning_papers

    O que é: Resumos e anotações de artigos importantes de deep learning, com explicações acessíveis e implementações de referência.

    Como eu usei: Li a anotação de um paper sobre atenção e implementei uma versão reduzida para testar impacto em uma tarefa de classificação de sequência.

    karpathy/nn-zero-to-hero

    O que é: Material didático que explica redes neurais do zero, com implementações simples para aprendizado conceitual.

    Como eu usei: Reproduzi os exercícios de backpropagation em NumPy para fixar a matemática por trás do treinamento de redes.

    HandsOnLLM/Hands-On-Large-Language-Models

    O que é: Recursos práticos para trabalhar com grandes modelos de linguagem (LLMs), incluindo exemplos de prompt engineering e pipelines de inferência.

    Como eu usei: Testei exemplos de fine-tuning leve e pipelines de inferência para entender trade-offs entre latência e qualidade em LLMs menores.

    dair-ai/Prompt-Engineering-Guide

    O que é: Guia com técnicas e padrões para criar prompts eficazes ao trabalhar com modelos de linguagem.

    Como eu usei: Apliquei padrões de prompt para melhorar respostas em tarefas de extração de informação e comparei variações para medir robustez.

    microsoft/ai-agents-for-beginners

    O que é: Recursos introdutórios sobre agentes de IA, cobrindo conceitos de arquitetura, planejamento e integração com modelos.

    Como eu usei: Experimentei um exemplo de agente simples para automatizar uma tarefa de coleta de dados e aprimorei a lógica de decisão com regras básicas.

    NirDiamant/GenAI_Agents

    O que é: Repositório com exemplos e padrões para construir agentes baseados em modelos generativos.

    Como eu usei: Combinei um padrão de agente com um fluxo de prompts para criar um assistente que gera resumos técnicos a partir de textos longos.

    NirDiamant/RAG_Techniques

    O que é: Técnicas e exemplos de Retrieval-Augmented Generation (RAG) para integrar recuperação de documentos com geração de texto.

    Como eu usei: Modelei um pipeline RAG para responder perguntas sobre um conjunto de documentos internos, avaliando precisão e latência.

    academic/awesome-datascience

    O que é: Curadoria de recursos, cursos e ferramentas para ciência de dados e aprendizado de máquina.

    Como eu usei: Usei a curadoria para montar um plano de estudos personalizado, priorizando tópicos de estatística aplicada e visualização de dados.

    keon/awesome-nlp

    O que é: Lista de recursos e bibliotecas para processamento de linguagem natural (NLP).

    Como eu usei: Explorei bibliotecas recomendadas para tokenização e embeddings e comparei resultados em tarefas de classificação de sentimento.

    aikorea/awesome-rl

    O que é: Coleção de recursos sobre reinforcement learning (RL), incluindo tutoriais, implementações e papers.

    Como eu usei: Segui um tutorial de RL para treinar um agente simples em um ambiente simulado e analisei curvas de recompensa para ajustar hiperparâmetros.

    FareedKhan-dev/all-rl-algorithms

    O que é: Implementações de diversos algoritmos de RL para estudo e comparação.

    Como eu usei: Comparei implementações de DQN e PPO em um problema reduzido para entender diferenças de estabilidade e convergência.

    Como eu recomendo usar esses repositórios

    • Monte um plano de estudos prático: combine um repositório teórico (papers/anotações) com um repositório de projetos práticos.
    • Reproduza experimentos mínimos: implemente versões reduzidas dos exemplos antes de tentar reproduzir o pipeline completo.
    • Documente tudo: mantenha um diário de experimentos com comandos, parâmetros e resultados para acelerar aprendizado.
    • Integre aprendizado com projetos reais: aplique conceitos em pequenos projetos que resolvam problemas concretos.
    Tags:
    AI, Machine Learning, Deep Learning, NLP, Reinforcement Learning, Herez, Tutoriais, Repositórios

    Este post foi redigido por Herez e apresenta experiências e exemplos práticos utilizados por ele para aprender e aplicar técnicas de IA/ML.

Biografia do autor: Doutor Herez possui Bacharelado em Análise de Sistemas, Mestrado em Engenharia de Computação/Software, Doutorado em Ciência da Computação e seu primeiro diploma acadêmico em Processamento de Dados em 1996. Início profissional na carreira em T.I. em 1993 com o primeiro certificado de programação de computadores em 1986 e início da participação em curso de programação em 1985. Microsoft Certified Professional desde 2000, entre outros títulos oficiais de diversos grandes fabricantes internacionais de software, também criou cursos e provas oficiais voltados à programação de computadores. Tem experiência na área de Ciência da Computação, com ênfase em Engenharia de Software, atuando principalmente nos seguintes temas: análise e desenvolvimento de sistemas, engenharia de software, métodos de pesquisa e métodos ágeis.