Enunciado

O computador “escolhe” (gera aleatoriamente) um número entre 1 e 1024, e o usuário tenta adivinhar o número escolhido. Para cada tentativa do usuário, o programa deve exibir na tela:

  • o número -1, se o número gerado for menor do que o número fornecido pelo usuário;
  • o número 1, se o número gerado for maior do que o número fornecido pelo usuário;
  • o número 0, se o número gerado for igual ao fornecido pelo usuário. Neste caso, o programa deve exibir o número de tentativas usadas pelo usuário para acertar a escolha do computador e finalizar a execução.

O usuário tem direito a um máximo de 20 tentativas. Quando se esgotarem, o programa deve imprimir “acabaram suas tentativas” e terminar.

Implemente e teste este jogo. Para implementar as repetidas tentativas, use recursão.

Passo 1

Coe, shinobi! Bora fazer um joguinho onde é o usuário que precisa acertar o número gerado aleatoriamente pelo programa. E o enunciado exige que as repetições sejam feitas usando recursão, o que nos obriga a programar o jogo dentro de uma função.

Então vamos começar definindo a função do nosso jogo que eu, criativamente, vou chamar de “jogo”.

Nossa função recebe quantas tentativas o usuário ainda tem e, se for maior do que 0, precisamos perguntar um número!

E, com o número em mãos, precisamos exibir 1, -1 ou 0, dependendo das condições impostas no enunciado.

Passo 2

Cara, o enunciado tá falando pra, em caso de acerto, exibir 0. Caso o chute seja menor, 1 e -1 caso o chute seja maior. Pra implementar essa lógica, vamos usar algumas estruturas condicionais.

E pronto! O programa já vai dar a resposta da primeira jogada. Mas esse jogo tem que se repetir 20 vezes, e com recursão. Por isso, depois do else a gente pode adicionar uma chamada recursiva, descontando uma tentativa...

Repara que a resposta continua sendo a mesma do início do jogo, ok?! Por isso passamos ela adiante sem alterações. Mas o enunciado também diz que, quando acerta, precisamos exibir o número de tentativas usadas. A gente pode fazer isso subtraindo o número total de tentativas pelo número que ainda restam. Tipo assim:

E pronto! Só falta a gente chamar essa função no nosso programa, né?!

Passo 3

Olha, pra gente começar o jogo que tá dentro da função, precisamos chamar a função no nosso programa. Porém, a resposta da partida tem que ser gerada de forma aleatória entre 0 e 1024, assim como dito no enunciado. Pra trabalhar com funções aleatórias, a gente tem que importar o módulo random no início do nosso arquivo, tá?

E aí, com o módulo random importado e a função do jogo devidamente declarada, a gente pode chamar com a resposta aleatória e com o número máximo de tentativas, que é 20:

E pronto, agora falta só mais um detalhe… Quando o usuário acerta, a gente não precisa mais continuar o jogo, temos que parar o loop. Mas acontece que não tem um “break” em repetições com recursão.

Mas dá uma segurada, porque a recursão tem o caso base, e ela só continua a repetição enquanto o caso base não é atingido. Pra gente parar imediatamente uma recursão, a gente só precisa forçar um caso base! Se liga na treta:

Olha! Depois de acertar, definimos “tentativa” pra 1. Aí, na chamada recursiva vai ser passada tentativa-1=0. Com isso, o loop vai terminar, porque na próxima repetição a tentativa não vai ser maior que 0.

E assim a gente finalizou a questão! Valeuuu!

Resposta

Exercícios Relacionados