Jogo em C: Adivinhe o número que o computador sorteou

Ok, se chegou até aqui, parabéns novamente, pois estudou bastante coisa!

Que tal agora fazer um jogo em C usando todos os conhecimentos que adquiriu até agora, em nossa apostila online de C?

Embora seja um game simples, você ver que a sensação de criar o próprio game com suas mãos, linha-a-linha irá lhe propiciar uma sensação única.

O curso online e gratuito de C, C Progressivo garante que este será o melhor game que você já jogou!

Como criar um jogo simples em C

Crie um jogo, em C, que sorteia um número entre 1 e mil.
O jogador deve tentar acertar o número sorteado.

Se ele errar, o programa deve dizer se o número sorteado é maior ou menor que o número que o jogador tentou.
Ao acertar o número sorteado, o programa deverá dizer em quantas tentativas o usuário acertou.

Você consegue pensar na melhor estratégia para ganhar esse jogo?


Para criar esse jogo, precisaremos dos conhecimentos de:
Teste condicional IF ELSE
Laço DO WHILE
Funções com uso de parâmetros e argumentos
Protótipo de funções
Funções com return
Números aleatórios em C

Vamos usar um laço DO WHILE para controlar se o jogo deve começar novamente, ou não.
A condição será a variável 'continuar'. Se o jogador não quiser mais jogar, ele digita 0 ou digita qualquer outro número para continuar a jogar (0 é falso e qualquer outro número é true).

Pois bem, decidido que ele vai jogar, precisamos sortear um número, e isso é feito dentro da função 'random()', que não recebe nenhum argumento, apenas retorna um inteiro entre 1 e mil.
Vamos armazenar o número sorteado na variável 'password', será a nossa senha.
Fazemos com que a variável 'attempt' receba valor 0, pois é ela que vai contar quantas tentativas o jogador fez até acertar a senha.

Ele tentará adivinhar o número, e essa entrada que ele der será armazenada na variável 'number'.
Após tentar acertar, vamos checar as dicas.
Mandamos as variáveis 'number', 'password' e 'attemp' para a função 'dicas()'.

Se o número 'number' que fornecemos for maior que a senha, a dica diz que nosso número está maior.
Se o 'number' for menor que a senha, a dica nos mostra que nossa tentativa foi abaixo do número correto.
Ora, se não for maior nem menor, é porque acertamos a senha, e a dica nos parabenizará e mostrará em quantas tentativas acertamos.

Quando a rodada acaba? Ora, quando o jogador acertar a senha!
Enquanto ele não acertar, ele ficará preso dentro do looping, que no caso é um novo laço DO WHILE, onde a condição para sair é acertar a senha.
Enquanto não acertar, a condição 'number != password' será verdadeira.








Assim, o código completo de nosso primeiro jogo em C fica:


#include <stdio.h>
#include <time.h>

int random();
void dicas(int number, int password, int attempt);

int main()
{
    int continuar=1,
        password,
        attempt,
        number;

    do
    {
        system("cls || clear");
        printf("Sorteando numero entre 1 e 1000...\n");
        password = random();

        printf("Comecou! Tente adivinhar o numero!\n\n");
        attempt = 0;

        do
        {
            attempt++;
            printf("Tentativa %d: ", attempt);
            scanf("%d", &number);
            dicas(number,password,attempt);
        }
        while( number != password);

        printf("Digite 0 para sair, ou qualquer outro numero para continuar: ");
        scanf("%d", &continuar);
    }
    while(continuar);

}

int random()
{
    srand( (unsigned)time(NULL) );

    return (1 + rand()%1000);
}

void dicas(int number, int password, int attempt)
{
    if(number > password)
                printf("O numero sorteado e menor que %d\n\n", number);
    else
        if(number < password)
            printf("O numero sorteado e maior que %d\n\n", number);
        else
            printf("Parabens! Voce acertou o numero em %d tentativas!\n\n", attempt);
}

A estratégia para acertar é sempre ir na metade. Primeiro tente o número 500.
Assim, você eliminará metade das possibilidades, pois já sabe que vai estar entre 1 e 499, ou entre 501 e 1000.

Se for maior que 500, tente 750. Se for menor, tente 250.
A explicação disso é eliminar metade (250), dos 500 possíveis números...depois 125, depois 62, depois 31, depois 15, depois 8, depois 4, depois 2 e por fim, 1. Ou seja, sempre se acerta, em no máximo 9 tentativas.

Gostou? Coloque seu nome
"Desenvolvido por Joãozinho - Curso C Progressivo: www.cprogressivo.net"
e envie para seus amigos.

8 comentários:

Santana .e disse...

Meu código ficou assim :
#include
#include
#include
#include


int random_x ();

int finding_random_x(int random_x);

int main(int randomx)
{
int
randomxx,
tentativas = 0;

do
{
finding_random_x();
}while ( randomxx != randomx );




}


int random_x()
{

int
random_num;

srand((unsigned) time(NULL));
random_num = rand()%1001;

finding_random_x(random_num);
main(random_num);

return (random_num);

}

int finding_random_x(int random_x)
{

int
randomxx,
tentativas = 0;
printf("Advinhe o número!\n\n");
scanf(" %d",&randomxx);

if ( randomxx == random_x)
{
printf("Parabéns você encontrou o número!\n\n");
printf("O numéro de tentativas para você acertar foi de : %d",tentativas);
}

if ( randomxx > random_x )
{
printf("Esse valor é maior que o número!\n\n");
}

if ( randomxx < random_x )
{
printf("Esse valor é menor que o número!\n\n");
}


tentativas++;
return 0;



}

Tá suja ta feio,e não ta pegando.
Eu fiz ele da primeira,não consegui ,refiz e não deu também,mas eu tentei! :)
Se alguém puder me dar uma força,ficarei grato.
Abraços e os tutos desse site são demais!!!

Alexandre Richard disse...

O meu deu certo. Obrigado pelo curso e segue o codico com poucas alterações, apenas para imprimir de forma mais limpo no console.

#include
#include

int random();
void dicas(int number, int password, int attempt);

void main()
{
int continuar = 1, password, attempt, number;
do
{
printf("*************** Sorteando numero entre 1 e 1000...\n\n");
password = random();

printf("*************** Comecou, tente adivinhar o numero e boa sorte!...\n\n");
attempt = 0;

do
{
attempt++;
printf("Tentativa %d\n", attempt);
scanf("%d", &number);

dicas(number, password, attempt);
}
while(number != password);
printf("Digite 0 para sair. ");
scanf("%d", &continuar);
}
while(continuar);
}

int random()
{
srand((unsigned) time(NULL));
return (1 + rand()% 1000);
}
void dicas(int number, int password, int attempt)
{
if(number > password)
printf("O numero sorteado e menor que %d\n\n", number);

else
if (number < password)
printf("O numero sorteado e maior que %d\n\n", number);

else
printf("Parabens! Vc acertou o numero em %d tentativas.\n\n", attempt);
}

Darlan Simplicio disse...

O MEU FUNCIONOU PERFEITAMENTE !! VLW ;)



#include
#include
#include


void menu(){

int escolha= 0;
printf("====== TENTE ACERTAR UM NUMERO DE 1 A 1000 ====== \n\n");
printf(" ===== FUNCIONA ASSIM: ===== \n A CADA TENTATIVA VAMOS TE DAR UMA DICA DE QUANTO ARRISCAR APROXIMADAMENTE! \n\n");
printf(" PARA COMECAR O JOGO PRESSIONE 1. PARA SAIR PRESSIONE 0 : \n\n");
}

int teste_para_entrada (int a){

if (a == 1)
{
printf(" VAMOS COMECAR! \n\n");

}else if (a != 0 && a != 1 ){

while(a != 0 || a != 1){

printf("ERROR: ESCOLHA SO ENTRE 0 OU 1 \n\n\n");


tente_novamente();

}
}else if (a == 0){

printf("Saindo.. \n");

}

return a;
}
void tente_novamente(void){

int contador=0, numero=0, escolha= 0;

menu();
scanf ("%d", &escolha);
teste_para_entrada(escolha);

}
int jogo(int a){
srand(time(NULL));

a = 1 + (rand() % 1000);

return a;
}

int processamento(int a, int b){

int contador= 2, num_tenta= 0;

while ( a != b){

if (a > b ) {

printf("%d TENTATIVA..\nDica - O Numero Sorteado, E Menor QE %d : ", contador,a);
contador++;

} else if (a < b){

printf("%d TENTATIVA..\nDica - O Numero Sorteado, E Maior QE %d : ", contador,a);
contador++; }




scanf("%d", &a);
printf("\n\n");

}

num_tenta = contador - 1;
if (a == b){

printf("PARABENS ACERTOU EM %d TENTATIVAS !! \n\n", num_tenta);
printf("FIM DO JOGO.. \n\n");

}
}

int main() {

int retorno=0, teste= 0, contador=2, numero=0, escolha= 0;

menu();

scanf ("%d", &escolha); printf("\n");
teste= teste_para_entrada(escolha);

retorno= jogo(retorno);

if (teste == 1) {

printf("\n\nDIGITE UM NUMERO : ");

scanf("%d", &numero);
printf("\n\n");

processamento(numero, retorno);

}

return 0;
}

José Renato do Guanor disse...

Gostaria de saber porque meu código não da as dicas. Eu já olhei muitas vezes e não consegui achar o erro.
Alguém poderia me ajudar? Obrigado.

# include
# include
# include

int aleatorio ()
{
srand( (unsigned)time(NULL) );
return (1+rand()%1000);
}

void dicas (int num, int pass, int tent)
{
if (numpass)
{
printf ("\nDica: O numero e menor que %d!",num);
}
else
{
system ("clear || cls");
printf("\n\nParabéns! Voce acertou!\n\nO numero sorteado foi %d\n\nNumero de tentativas: %d\n", pass, tent);
}
}
}
int main ()
{
int num, pass, tent;
pass=aleatorio();
tent=1;
printf ("Prepare-se para o desafio!\n\n");
do
{
printf ("\n\nTente adivinhar o numero sorteado entre 0 e 1000: ");
scanf("%d", &num);
if (num<1 || num>1000)
{
printf ("Opcao invalida!\nDigite um valor entre 0 e 1000!");
}
else
{
void dicas (num,pass,tent);
}

printf ("\nTentativas: %d", tent++);

} while (num!=pass);
getch ();
}

Fernando Barbosa disse...

#include
#include
#include

void jogar (void);
void dica (int x, int num);
int calc_x (void);

int main(void)
{
int opcao, op = 1;
printf(" ----- Bem vindo ao QUAL EH O NUMERO versao 1.0 ----- \n\n");
printf("Voce deseja: \n1. Jogar\n2. Sair\n\n");
printf("Opcao: \n");
scanf("%d", &opcao);
do {
switch (opcao){

case 1:
jogar ();
break;
case 2:
break;

}

printf("\n\nJogar novamente?\nSim: Digite qualquer numero\nNao: Digite 0 \n");
scanf("%d", &op);

} while (op);
printf("\nSaindo...\nDesenvolvido por Fernando Barbosa\n");

return 0;
}

void jogar (void){
int i, num, x;
printf("\n --- Sorteando número entre 1 e 1000... --- \n\n");
x = calc_x();
printf("Comecou!!! Tente adivinhar o numero!!!\n\n");
do {
for(i = 1; i < 100; i++){
printf("Tentativa %d: ", i);
scanf("%d", &num);
dica(x, num);
if (x == num){
break;
}
}

} while (num =! x);

printf("\nParabens!!! Voce acertou o numero em %d tentativas\n", i);
}

int calc_x (void){
int valor_x;
srand( (unsigned)time(NULL) );
valor_x = 1 + (rand() % 10);
return valor_x;
}

void dica(int x, int num){
if (x > num){
printf("O numero sorteado eh maior que %d\n", num);
}
if (x < num){
printf("O numero sorteado eh menor que %d\n", num);
}
}

rodrigo pereira disse...

#include
#include
#include
#include
#include

int main()
{
setlocale(LC_ALL,"");

int count=0,x,xrand,decisao;

printf("--------------------------------JOGO DO ETEVALDO--------------------------------\n");
srand((unsigned)time(NULL));
xrand= rand()%1001;
printf("Advinhe o número que estou pensando!\nDigite um número de 0 a 1000\n");

while(x!=xrand)
{
count++;
scanf("%d",&x);
if(x==xrand)
{
printf("\n\nAté que enfim acertou!!!\nDepois de %d tentativas fica fácil né terráqueo?\n",count);
printf("Bora jogar mais uma?\n");
printf("1.Bora\n2.Nem?\n");
scanf("%d",&decisao);

switch(decisao)
{
case 1:
system("cls");
main();
break;

default:
system("cls");
printf("Também nem queria,bye!");
getche();
break;
}}
else
printf("Errooou!\n-------------------------------------------------\n");
if(x<xrand)
printf("Que tal tentar um número maior que o seu?\n");
else
printf("Que tal tentar um número menor que o seu?\n");
}
}

Christopher Albert F. de Aguiar disse...

Eu acho que existe um erro no enunciado do problema. A parte onde diz: "o programa deverá dizer em quantas tentativas o usuário acertou.", pelo modo como a variável "attempt" é incrementada deveria ser: "o programa deverá dizer em quantas tentativas o usuário REALIZOU.". Porque é isso que o jogo está fazendo.

Jonathan Reis disse...

#include
#include

void introducao() {
printf("*********************\n"
"* Adivinhe o numero *\n"
"*********************\n"
"Bem vindo(a) ao jogo!\n"
"Informe um numero entre 1 e 1000.\n"
"Tente acertar com o menor numero de tentativas.\n\n");
}

int sorteio() {
srand((unsigned) time(NULL));
return (rand() % 1000) + 1;
}

void iniciar() {
int numero = sorteio();
int jogador;
int tentativas = 0;
do {
tentativas++;
printf("Tentativa %d\n"
"Informe um numero: ", tentativas);
scanf(" %d", &jogador);
if (jogador == numero) {
printf("\nParabens voce acertou.\n"
"Numero de tentativas %d\n\n", tentativas);
break;
}
if (jogador > numero) {
printf("Voce informou um numero maior.\n\n");
continue;
}
if (jogador < numero) {
printf("Voce informou um numero menor.\n\n");
continue;
}
} while (1);
}

int continuar() {
char continuar;
printf("Para jogar novamente digite N|n ou para sair S|s: ");
do {
scanf(" %c", &continuar);
if (continuar == 'N' || continuar == 'n') {
system("clear");
continuar = 1;
break;
}
if (continuar == 'S' || continuar == 's') {
continuar = 0;
break;
}
system("clear");
printf("Por favor informe N|n para jogar novamente ou S|s: para sair: ");
} while (1);
return continuar;
}

int main() {
int c;
do {
introducao();
iniciar();
c = continuar();
} while (c);
}

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.