-
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
-
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
-
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
-
Comandos do Linux para Rede
Guia prático de comandos de rede Linux — Herez Guia prático de comandos de rede Linux Autor: Herez Este post reúne explicações objetivas de comandos essenciais para diagnóstico e administração
-
Instalação e primeiros comandos em Python
Curso Prático Python Básico — Guia Herez (Passo a passo, exemplos e projeto final) Curso Prático Python Básico — Guia Herez Visão geral: este curso passo a passo ensina os
-
Enunciado completo do jogo Campo Minado (Minesweeper)
Jogo Campo Minado — Enunciado e Implementação | Herez Jogo Campo Minado
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) comkminas 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
TabuleiroA classe
Tabuleirodeve 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 sucesso2→ posição já havia sido revelada antes-2→ parâmetros inválidos
Após fim da partida,
jogadadeve 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 comiminas 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
JogadorHumanoPermitir 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
JogadorAutomaticoDeve fornecer o método
public boolean iniciaJogo(Tabuleiro t), que joga a partida no tabuleirote retornatruese 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/. -
Comandos Linux para gerenciar Memória e Processos
Comandos essenciais e exemplos práticos | Herez Comandos essenciais e exemplos práticos | Herez
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.
$ dateExemplo profissional (Herez): ao investigar logs de um deploy automatizado, Herez usoudatepara 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.
$ uptimeExemplo profissional (Herez): após um pico de latência, Herez executouuptimepara 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.
$ whoamiExemplo profissional (Herez): durante manutenção remota, Herez usouwhoamiem 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 -hExemplo profissional (Herez): ao diagnosticar um serviço que consumia memória, Herez rodoufree -hantes 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 -hExemplo profissional (Herez): em um incidente de falta de espaço, Herez usoudf -hpara 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/logExemplo profissional (Herez): para localizar diretórios que consumiam espaço, Herez executoudu -shem 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 -aExemplo profissional (Herez): antes de compilar um módulo de kernel para otimização, Herez usouuname -apara confirmar versão do kernel e arquitetura da máquina.ps
O que faz: lista processos em execução no shell atual.
$ psExemplo profissional (Herez): em scripts de verificação, Herez usoupspara 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 auxExemplo profissional (Herez): para identificar processos que consumiam CPU excessiva, Herez rodoups aux --sort=-%cpue 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.
$ topExemplo profissional (Herez): durante um pico de uso, Herez abriutoppara 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 12345Exemplo profissional (Herez): ao encerrar um worker que não respondia a requisições, Herez primeiro tentoukill PIDpara 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 12345Exemplo profissional (Herez): quando um processo travado não respondia a SIGTERM e comprometia a estabilidade do serviço, Herez usoukill -9como ú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 PIDantes dekill -9para evitar corrupção de dados. - Monitore continuamente: combine
topeps auxcom ferramentas de monitoramento para alertas proativos. - Automatize verificações: scripts que usam
uptime,free -hedf -hajudam 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.
-
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.

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.
