[Funciona com Copiar e Colar!] Guia de Iniciante para Criar um Jogo de Adivinhação de Número com Python: A Jornada de um Novato com IA
Olá! Bem-vindo ao mundo da programação.
Há apenas alguns meses, eu era exatamente como você, com conhecimento zero em programação. Eu não sabia por onde começar e quebrava a cabeça todos os dias sempre que um erro aparecia... Mas com a ajuda da IA, através de muita tentativa e erro, hoje consigo gerenciar dois sites que criei sozinho (buyonjapan.com, copicode.com).
Neste site, eu explico as coisas que eu "realmente queria saber", os "pontos em que realmente travei" e "como resolvi", tudo da perspectiva de um colega iniciante, usando o mínimo de jargão técnico possível.
Desta vez, vamos criar um "Jogo de Adivinhação de Número" em Python, um primeiro passo muito popular no aprendizado de programação. O objetivo deste artigo é um só: "Fornecer um código que funciona perfeitamente apenas copiando e colando, para que você possa primeiro experimentar o sucesso de fazer algo 'funcionar'".
Vamos experimentar juntos a diversão de programar!
Primeiro, experimente a versão final! O código completo que funciona com copiar e colar
Ver para crer. Primeiro, deixe-me mostrar o código completo do jogo de adivinhação de número que construiremos juntos. Copie todo o código abaixo e execute-o em seu ambiente (como VSCode ou Google Colaboratory). A melhor maneira de entender como o jogo funciona é jogá-lo primeiro!
import random
def number_guessing_game():
while True:
print("\n--- Jogo de Adivinhação de Número ---")
print("Escolha um nível de dificuldade:")
print("1: Fácil (1-10)")
print("2: Normal (1-100)")
print("3: Difícil (1-1000)")
level = input("Digite a dificuldade (1, 2, 3): ")
if level == '1':
min_num, max_num = 1, 10
elif level == '2':
min_num, max_num = 1, 100
elif level == '3':
min_num, max_num = 1, 1000
else:
print("Opção inválida. Por favor, digite '1', '2' ou '3'.")
continue
answer = random.randint(min_num, max_num)
count = 0
print(f"\nAdivinhe o número entre {min_num} e {max_num}!")
while True:
try:
guess_str = input(f"Seu palpite (Tentativas restantes: Ilimitadas): ")
guess = int(guess_str)
count += 1
if guess < min_num or guess > max_num:
print(f"Fora do intervalo! Por favor, digite um número entre {min_num} e {max_num}.")
elif guess < answer:
print(f"Que pena! O número é maior. (Tentativas: {count})")
elif guess > answer:
print(f"Que pena! O número é menor. (Tentativas: {count})")
else:
print(f"\n🎉🎉🎉 Certo! Parabéns! 🎉🎉🎉")
print(f"O número correto era {answer}.")
print(f"Você levou {count} tentativas para acertar.")
break
except ValueError:
print("Erro: Por favor, digite um número. Letras e símbolos não são permitidos.")
while True:
replay = input("\nJogar novamente? (sim / nao): ").lower()
if replay in ["sim", "nao"]:
break
else:
print("Entrada inválida. Por favor, digite 'sim' ou 'nao'.")
if replay == "nao":
print("Obrigado por jogar! Até a próxima!")
break
# Iniciar o jogo
number_guessing_game()
Como foi? É um jogo simples em que você adivinha um número que o computador pensou. A partir da próxima seção, vamos desmontar este código em cada uma de suas partes e montá-lo do zero.
Passo 1: Construir o esqueleto do jogo (versão mínima)
Não importa quão complexo um programa pareça, na sua essência, ele é apenas uma combinação de comandos simples. Vamos começar construindo a parte do "esqueleto", que é o mínimo necessário para este jogo.
Ferramenta necessária: O que é o módulo `random`?
Para criar um jogo de adivinhação de número, primeiro precisamos que o computador escolha um número aleatório. Para isso, usamos um recurso padrão do Python chamado "módulo `random`".
"Módulo" pode soar complicado, mas pense nele simplesmente como uma "caixa de ferramentas cheia de funções úteis". O módulo `random` contém funções para criar números aleatórios, embaralhar elementos de uma lista e muito mais.
Desta vez, usaremos uma função chamada `random.randint(a, b)`. Este é um comando que cria um único número inteiro aleatório que está no intervalo de `a` a `b`, inclusive. Por exemplo, se você escrever `random.randint(1, 100)`, um número aleatório entre 1 e 100 será escolhido.
Para mais detalhes, você pode consultar a documentação oficial do Python, mas por enquanto, basta saber que "existe tal função".
O primeiro código: Funciona apenas com isto!
Agora, vamos criar o coração do jogo. Precisamos dos seguintes 4 passos:
- Habilitar o uso do módulo `random` (`import`)
- Criar um número de resposta aleatório de 1 a 100
- Pedir ao jogador para digitar seu palpite (`input`)
- Comparar a resposta e o palpite, e exibir o resultado (`if/else`)
Convertido para código, fica assim:
# 1. Importar o módulo random
import random
# 2. Gerar um inteiro aleatório de 1 a 100 e armazená-lo na variável 'answer'
answer = random.randint(1, 100)
print("Adivinhe o número entre 1 e 100!")
# 3. Receber a entrada do jogador
guess_str = input("Seu palpite: ")
# Converter a string recebida de input() para um número (inteiro) que pode ser calculado
guess = int(guess_str)
# 4. Comparar o palpite com a resposta e exibir o resultado
if guess == answer:
print("🎉 Certo! Parabéns!")
else:
print(f"Que pena! A resposta correta era {answer}.")
Ao executar este código, você pode dar um palpite apenas uma vez. Ele julga corretamente se você acertou ou errou. Este é o ponto de partida do nosso jogo.
Ponto chave: O valor recebido com `input()` é sempre tratado como uma "string", mesmo que você digite um número. Portanto, antes de poder compará-lo ou fazer cálculos com ele como um número, você precisa convertê-lo para "inteiro" usando `int()`. Isso é chamado de "conversão de tipo".
Passo 2: Fazer o jogo ser repetível (usando o laço `while`)
Com o código atual, o jogo termina assim que você dá um palpite. Isso não é bem um jogo, certo? Vamos melhorá-lo para que você possa continuar adivinhando repetidamente até acertar.
Por que precisamos de um laço?
Quando você quer repetir o mesmo processo várias vezes, na programação, usa-se uma estrutura chamada "laço" (ou loop). O Python tem laços `for` e laços `while`, mas desta vez usaremos um laço `while`, que é adequado para "repetir até que uma condição específica seja satisfeita".
Melhorando com o laço `while`!
A condição "até acertar" pode ser reformulada como "continuar repetindo enquanto não estiver certo". Usar o `while` para isso dá uma forma mais parecida com um jogo.
Desta vez, usaremos a sintaxe `while True:`. Isso significa "repetir infinitamente", mas não se preocupe. Usando um comando chamado `break` de dentro do laço, você pode sair dele a qualquer momento que desejar.
import random
answer = random.randint(1, 100)
print("Adivinhe o número entre 1 e 100!")
# Iniciar um laço infinito
while True:
guess_str = input("Seu palpite: ")
guess = int(guess_str)
if guess == answer:
print("🎉 Certo! Parabéns!")
break # Se acertar, sai do laço
else:
print("Que pena! Tente novamente.")
E então? Ao executar, agora você pode digitar seu palpite quantas vezes quiser até acertar. Se não houvesse o `break`, o programa nunca terminaria, mesmo que você acertasse. Lembre-se de usar `while True:` e `break` como um par.
Passo 3: Tornar o jogo mais amigável (recurso de dicas)
Do jeito que está, ele só diz "Que pena!" e não dá nenhuma pista sobre qual número você deveria tentar em seguida. Vamos adicionar um recurso de dicas para que o jogador se divirta mais.
Dicas que dizem se é "maior" ou "menor"
Se o palpite estiver errado, dizer ao jogador se o número que ele digitou é "maior" ou "menor" que a resposta tornará o jogo muito mais interessante. Isso pode ser implementado facilmente adicionando `elif` (abreviação de else if) à instrução `if`.
Vamos contar as tentativas
Além disso, se registrarmos quantas tentativas foram necessárias para acertar e exibirmos no final, isso cria uma sensação de conquista. Para isso, antes do laço começar, preparamos uma variável de contador como `count = 0`, e a cada palpite, a incrementamos em 1 com `count += 1`.
import random
answer = random.randint(1, 100)
count = 0 # Inicializar a variável para contar as tentativas
print("Adivinhe o número entre 1 e 100!")
while True:
guess_str = input("Seu palpite: ")
guess = int(guess_str)
count += 1 # Incrementar o contador a cada palpite
if guess < answer:
print(f"Que pena! O número é maior. (Tentativas: {count})")
elif guess > answer:
print(f"Que pena! O número é menor. (Tentativas: {count})")
else: # se guess == answer
print(f"\n🎉 Certo! Parabéns!")
print(f"O número correto era {answer}.")
print(f"Você acertou em {count} tentativas!")
break
Agora que as dicas e a contagem de tentativas são exibidas, ele se parece muito mais com um jogo de verdade! Usar `f-string` do Python (colocar um `f` antes da string) é muito conveniente porque permite embutir facilmente o valor de variáveis dentro da string, como `{nome_da_variavel}`.
Passo 4: Rumo a um programa à prova de erros (o ponto mais importante e diferenciador)
Certo, aqui começa a parte mais importante deste artigo. O código atual tem uma "fraqueza" oculta. É que, quando o jogador digita algo que não é um número, o programa é encerrado à força.
A armadilha do `ValueError` em que todo iniciante cai
Tente executar o código anterior e, na hora de adivinhar o número, digite letras como "abc" ou "olá".
`ValueError: invalid literal for int() with base 10: 'abc'`
Você deve ter visto uma mensagem de erro vermelha como esta, e o programa parou. Isso acontece porque a função `int()` é para "converter uma string em um inteiro", mas recebeu um texto que não pode converter (como 'abc'), o que causa o erro.
Esta foi uma barreira que enfrentei muitas vezes quando era iniciante. Um programa que "funciona bem no meu PC, mas trava assim que outra pessoa usa..." infelizmente não pode ser considerado um "bom programa". Vamos visar um programa "robusto" que não trave facilmente, mesmo que o usuário cometa um erro.
Capturando erros com `try-except`!
A sintaxe mágica que resolve este `ValueError` é `try-except`.
- Bloco `try:`: Você coloca o código que pode causar um erro aqui dentro. A ideia é "Tente fazer isto!".
- Bloco `except TipoDeErro:`: Se o tipo de erro especificado ocorrer dentro do `try`, este bloco de código é executado. A ideia é "Se por acaso der erro, faça isto em vez disso".
Usando esta sintaxe, envolvemos o processo de conversão `int()` em um bloco `try` e escrevemos o tratamento para o caso de um `ValueError` em um bloco `except`, evitando assim que o programa seja encerrado por um erro.
import random
answer = random.randint(1, 100)
count = 0
print("Adivinhe o número entre 1 e 100!")
while True:
guess_str = input("Seu palpite: ")
try:
# Código que pode causar um erro
guess = int(guess_str)
count += 1
if guess < answer:
print(f"Que pena! O número é maior. (Tentativas: {count})")
elif guess > answer:
print(f"Que pena! O número é menor. (Tentativas: {count})")
else:
print(f"\n🎉 Certo! Parabéns!")
print(f"O número correto era {answer}.")
print(f"Você acertou em {count} tentativas!")
break
except ValueError:
# Código a ser executado se ocorrer um ValueError
print("Erro: Por favor, digite um número. Letras e símbolos não são permitidos.")
Execute este código e tente digitar "abc" novamente. Desta vez, em vez de parar com um erro, a mensagem "Erro: Por favor, digite um número." deve ser exibida, e você será solicitado a digitar novamente.
Dominar o `try-except` é um grande passo para sair do nível iniciante!
[Coluna] Como pedir ajuda a uma IA para resolver erros
Quando eu estava aprendendo a programar, minha maior ajuda foi a IA. Quando eu recebia um erro como `ValueError`, eu copiava a mensagem de erro inteira e perguntava à IA (no meu caso, Gemini ou ChatGPT) assim:
"Estou praticando programação com Python. Meu programa parou e exibiu a seguinte mensagem de erro. Qual é a causa deste erro? Além disso, como posso modificar o código para que o programa não pare mesmo que este erro ocorra? Por favor, explique de uma forma que um iniciante possa entender."
`ValueError: invalid literal for int() with base 10: 'abc'`
E a IA, quase sem falhar, me apresentava uma solução usando `try-except`. Não ter medo de mensagens de erro e usá-las como "material para perguntas" para uma IA é o melhor truque para acelerar o autoaprendizado.
Passo 5: Tornando mais divertido! (Recursos avançados)
Agora que as funcionalidades básicas e o tratamento de erros estão implementados, vamos adicionar mais alguns recursos para finalizar o jogo e deixá-lo mais polido. Esta parte é a explicação do conteúdo do código completo apresentado no início do artigo.
Permitir a escolha da dificuldade
Adivinhar sempre de 1 a 100 pode se tornar entediante. Se permitirmos que o jogador escolha o intervalo de números no início do jogo, como "Fácil (1-10)", "Normal (1-100)" ou "Difícil (1-1000)", faremos com que ele queira jogar de novo e de novo.
Isso pode ser implementado adicionando um laço para selecionar a dificuldade antes do laço principal do jogo. Dependendo da entrada do jogador, basta alterar os valores mínimo (`min_num`) e máximo (`max_num`) passados para `random.randint()` e pronto.
Permitir jogar novamente
É um pouco chato ter que executar o programa novamente toda vez que uma partida termina. Depois de acertar, vamos perguntar "Jogar novamente? (sim / nao)" e, se a resposta for "sim", reiniciamos o jogo inteiro desde o começo, e se for "nao", o encerramos.
A maneira mais fácil de conseguir isso é envolvendo toda a lógica do jogo que construímos até agora em um laço `while` ainda maior. E então, no final do jogo, confirmamos a intenção de jogar novamente e, se a entrada for "nao", quebramos o laço grande com `break` para encerrar o programa completamente.
O "código completo" apresentado no início deste artigo é o resultado da incorporação de todos esses recursos. Por favor, dê uma olhada no código novamente e veja se consegue identificar qual parte corresponde a cada recurso.
Conclusão: Experimente a alegria de criar algo que funciona!
Ótimo trabalho! Desta vez, você experimentou o processo de criar um simples jogo de adivinhação de número do zero usando Python.
Ao longo deste artigo, você teve contato com os seguintes elementos básicos e importantes do Python:
- `import`: Carregamento de módulos
- `random.randint()`: Geração de números inteiros aleatórios
- `input()`: Recebimento de entrada do teclado do usuário
- `int()`: Conversão de tipo de string para inteiro
- `print()` (f-string): Exibição de resultados e mensagens na tela
- `if/elif/else`: Ramificação do processo de acordo com as condições
- Laço `while` (`break`): Repetição e saída de um processo
- `try-except`: Tratamento de erros
No aprendizado da programação, tentar construir algo que realmente "funcione" é o atalho mais rápido para melhorar, muito mais do que simplesmente memorizar a sintaxe. Pequenas experiências de sucesso se tornam uma grande motivação para o próximo passo no seu aprendizado.
Seria interessante tentar modificar o código que criamos, por exemplo, "adicionando um limite de tentativas" ou "detalhando mais as dicas", para criar seu próprio jogo original. Por favor, use este artigo como seu primeiro passo na sua jornada de programação.
Próximo passo
Depois de se familiarizar com a programação básica, por que não tentar o processamento de imagens? Usando a biblioteca "Pillow" do Python, você pode criar facilmente ferramentas úteis, como uma que redimensiona muitas imagens em um instante.
[Resumo] Sobre o exemplo de HTML completo e funcional
Esta seção é um exemplo de HTML que você pode copiar e colar ao publicar conteúdo como este artigo de blog em seu próprio site.
O código abaixo contém todo o conteúdo deste artigo (títulos, texto, blocos de código, etc.). No entanto, o próprio código Python deve ser executado no ambiente de execução Python do leitor em seu PC (como um terminal ou prompt de comando).
Nota: O código HTML dentro do bloco de código abaixo teve seus caracteres especiais escapados (ex: `<` se torna `<`) para ser exibido corretamente em uma página da web.
<article>
<h1 style="color: #669df6;">[Funciona com Copiar e Colar!] Guia de Iniciante para Criar um Jogo de Adivinhação de Número com Python: A Jornada de um Novato com IA</h1>
<p>
Olá! Bem-vindo ao mundo da programação.
</p>
<p>
Há apenas alguns meses, eu era exatamente como você, com conhecimento zero em programação. Eu não sabia por onde começar e quebrava a cabeça todos os dias sempre que um erro aparecia... Mas com a ajuda da IA, através de muita tentativa e erro, hoje consigo gerenciar dois sites que criei sozinho (<a href="https://buyonjapan.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">buyonjapan.com</a>, <a href="https://copicode.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">copicode.com</a>).
</p>
<p>
Neste site, eu explico as coisas que eu "realmente queria saber", os "pontos em que realmente travei" e "como resolvi", tudo da perspectiva de um colega iniciante, usando o mínimo de jargão técnico possível.
</p>
<p>
Desta vez, vamos criar um "<strong>Jogo de Adivinhação de Número</strong>" em Python, um primeiro passo muito popular no aprendizado de programação. O objetivo deste artigo é um só: "<strong>Fornecer um código que funciona perfeitamente apenas copiando e colando, para que você possa primeiro experimentar o sucesso de fazer algo 'funcionar'.</strong>"
</p>
<p>
Vamos experimentar juntos a diversão de programar!
</p>
<hr style="margin: 4rem 0;">
<h2 style="color: #669df6;">Primeiro, experimente la versão final! O código completo que funciona com copiar e colar</h2>
<p>
Ver para crer. Primeiro, deixe-me mostrar o código completo do jogo de adivinhação de número que construiremos juntos. Copie todo o código abaixo e execute-o em seu ambiente (como VSCode ou Google Colaboratory). A melhor maneira de entender como o jogo funciona é jogá-lo primeiro!
</p>
<div class="code-wrapper">
<button class="copy-btn" data-target="code-block-1">📋 Copiar</button>
<pre><code id="code-block-1">
import random
def number_guessing_game():
while True:
print("\n--- Jogo de Adivinhação de Número ---")
print("Escolha um nível de dificuldade:")
print("1: Fácil (1-10)")
print("2: Normal (1-100)")
print("3: Difícil (1-1000)")
level = input("Digite a dificuldade (1, 2, 3): ")
if level == '1':
min_num, max_num = 1, 10
elif level == '2':
min_num, max_num = 1, 100
elif level == '3':
min_num, max_num = 1, 1000
else:
print("Opção inválida. Por favor, digite '1', '2' ou '3'.")
continue
answer = random.randint(min_num, max_num)
count = 0
print(f"\nAdivinhe o número entre {min_num} e {max_num}!")
while True:
try:
guess_str = input(f"Seu palpite (Tentativas restantes: Ilimitadas): ")
guess = int(guess_str)
count += 1
if guess < min_num or guess > max_num:
print(f"Fora do intervalo! Por favor, digite um número entre {min_num} e {max_num}.")
elif guess < answer:
print(f"Que pena! O número é maior. (Tentativas: {count})")
elif guess > answer:
print(f"Que pena! O número é menor. (Tentativas: {count})")
else:
print(f"\n🎉🎉🎉 Certo! Parabéns! 🎉🎉🎉")
print(f"O número correto era {answer}.")
print(f"Você levou {count} tentativas para acertar.")
break
except ValueError:
print("Erro: Por favor, digite um número. Letras e símbolos não são permitidos.")
while True:
replay = input("\nJogar novamente? (sim / nao): ").lower()
if replay in ["sim", "nao"]:
break
else:
print("Entrada inválida. Por favor, digite 'sim' ou 'nao'.")
if replay == "nao":
print("Obrigado por jogar! Até a próxima!")
break
# Iniciar o jogo
number_guessing_game()
</code></pre>
</div>
<p>
Como foi? É um jogo simples em que você adivinha um número que o computador pensou. A partir da próxima seção, vamos desmontar este código em cada uma de suas partes e montá-lo do zero.
</p>
<!-- Cada seção continua de forma semelhante -->
</article>