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.

19 comentários:

  1. 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!!!

    ResponderExcluir
  2. 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);
    }

    ResponderExcluir
  3. 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;
    }

    ResponderExcluir
  4. 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 ();
    }

    ResponderExcluir
  5. #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);
    }
    }

    ResponderExcluir
  6. Eu fiz um com dificuldade selecionada pelo usuário. Eu coloquei os códigos aqui no Pastebin.

    ResponderExcluir
  7. Eu consegui nesse:


    #include
    #include
    #include
    int main (){
    system("color 09");

    int pass , attempt, certo ,
    count = 1;

    srand((unsigned)time(NULL));

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


    printf("ACERTE O NUMERO : ");
    scanf("%d",&attempt);
    count++;
    do{

    count++;




    if (attempt > pass){
    printf("Tente um numero mais baixo...");
    scanf("%d",&attempt);


    }
    if (attempt < pass){
    printf("Tente um numero maior ...");
    scanf("%d",&attempt);


    }
    if (attempt == pass){
    printf("PARABENS VOCE ACERTOU EM %d TENTATIVAS \n" , count);
    break;

    }







    }
    while(attempt);


    }

    ResponderExcluir
  8. #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");
    }
    }

    ResponderExcluir
  9. 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.

    ResponderExcluir
  10. #include
    #include
    #include

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

    main(void)
    {
    int control, sort, num;
    sort = sortear();

    printf("\tTente acertar qual eh o numero aleatorio\n");

    for(control=1;; control++)
    {
    scanf("%d", &num);

    if(num < sort)
    {
    printf("O numero sorteado eh maior que %d\n", num);
    }
    else if(num > sort)
    {
    printf("O numero sorteado eh menor que %d\n", num);
    }
    else
    {
    printf("\n\tParabens, voce acertou!!\n\to numero eh %d\n\t e voce acertou na %d vez\n", num, control);
    break;
    }
    }
    return 0;
    }

    ResponderExcluir
  11. Eu tentei, e acho q ficou legal !!!


    #include stdio. h
    #include time. h

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

    main(void)
    {
    int control, sort, num;
    sort = sortear();

    printf("\tTente acertar qual eh o numero aleatorio\n\t\t\tEntre 1 e 100\n");

    for(control=1;; control++)
    {
    printf("[%d] tentativa: ", control);
    scanf("%d", &num);

    //verificar se os números são válidos
    if(num > 0 && num < 1000)
    {

    if(num < sort) // testes
    {
    printf("O numero sorteado eh maior que %d\n\n", num);
    }
    else if(num > sort)
    {
    printf("O numero sorteado eh menor que %d\n\n", num);
    }
    else
    {
    printf("\n\tParabens, voce acertou!!\n\to numero eh %d\n\t e voce acertou na %d vez\n", num, control);
    break;
    }
    }
    else // caso o numero for menor que 0 e maior que 1000
    {
    printf("\n\tCaractere invalido\n\tVoltar apartir do inicio");
    getch();
    control = 0;
    system("cls");
    }
    }
    return 0;
    }

    ResponderExcluir
  12. Ta dando certo mas tem como melhorar?

    #include
    #include
    #include

    int GerarNum(void);
    int Jogo(int valor);
    void choice(int num,int valor,int tent);

    int main()
    {


    int choice,resp;

    do
    {

    resp=GerarNum();
    choice=Jogo(resp);

    }while(choice);

    printf("\t \t \t FIM DE JOGO!!!\n");

    }

    int GerarNum(void)
    {
    int resp;
    srand((unsigned)time(NULL));
    resp=1+(rand()%1000);

    return resp;
    }
    void choice(int num,int valor,int tent)
    {


    if(valor>num)
    {
    printf("Tentativa %d:Numero sorteado é maior que %d\n",tent,num);
    printf("Digite novamente\n");

    }
    if(valor<num)
    {

    printf("Tentativa %d:Numero sorteado é menor que %d\n",tent,num);
    printf("Digite novamente\n");
    }

    }
    int Jogo(int valor)
    {
    int resp,num,tent=0;
    int escolha;
    printf("GAME ON\n");

    printf("Digite o numero sorteado que esta entre 1 e 1000.\n");
    do
    {
    scanf("%d",&num);
    tent++;
    choice(num,valor,tent);



    }while(valor!=num);
    printf("Parabens vc acertou o numero:%d em %d tentativa(s)\n",num,tent);

    printf("Digite 0 para sair ou outro numero para continuar:");

    scanf("%d",&escolha);
    return escolha;

    }

    ResponderExcluir
  13. #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);
    }

    ResponderExcluir
  14. Nao li a resuluçao e fui direto tentar fazer, deu certo assim:

    #include
    #include
    #include

    int main(void)
    {
    int teste,
    chute,
    tentativa=0;

    srand((unsigned)time(NULL));
    teste=(rand()%999);
    teste++;

    printf("Chute um numero entre 1 e 1000... ");

    do
    {
    scanf("%d", &chute);
    fflush(stdin);
    tentativa=tentativa+1;
    printf("\n\n");

    if(chute==teste)
    {
    printf("Voce acertou com apenas %d tentativa(s)!\n\n", tentativa);
    break;
    }
    else
    {
    if(chute>teste)
    {
    printf("O seu chute eh muito alto.\n");
    }
    else
    {
    printf("O seu chute eh muito baixo.\n");
    }
    }
    }
    while(chute!=teste);
    return 0;
    }

    ResponderExcluir
  15. #include
    #include
    #include

    int ramdom (void);
    int tentativa (int);

    int main(void)
    {
    int ramdomOut, tentativa_out;
    do
    {
    printf("Sorteando numero entre 1 e 1000... \n");
    ramdomOut = ramdom();
    printf("Comecou! Tente advinhar o numero! \n");
    tentativa_out = tentativa(ramdomOut);
    }while( tentativa_out != 0 );
    }

    int ramdom (void)
    {
    int ramdom;
    srand( (unsigned)time(NULL) );
    ramdom = 1 + rand()%1000;
    printf(" Funcao ramdom - return ramdomOut = %d\n", ramdom );
    return ramdom;
    }

    int tentativa (int tentativaInput)
    {
    int number, counter = 1;
    //printf("Funcao Tentativa - Recebe ramdomOut = %d \n", tentativaInput);
    do
    {
    printf("\n Tentativa %d: ", counter);
    scanf("%d", &number);

    if ( number < tentativaInput )
    printf("\n O numero sorteado e maior que: %d", number);
    else if ( number > tentativaInput )
    printf("\n O numero sorteado e menor que: %d", number);
    else
    {
    printf("\n Parabens! Voce acertou o numero em %d tentativas!", counter);
    printf("\n Digite 0 para sair, ou qualquer numero para continuar");
    scanf("%d", &number);
    system("cls || clear");
    if ( number == 0 )
    {
    return number;
    break;
    }
    else
    {
    return number;
    break;
    }
    }
    counter++;

    }while( tentativaInput != 0 );

    }

    ResponderExcluir
  16. Consegui fazer um simples:

    #include
    #include
    #include

    int main(void)
    {
    int num,
    tent=1,
    chute;

    printf("Em que numero de 1 a 1000 eu estou pensando?...\n");
    scanf("%d", &chute);
    srand ((unsigned) time (NULL));
    num = (rand()%999)+1;
    for(; chute!=num; tent++)
    {
    if(chute>num)
    printf("Numero muito alto!\n");
    else
    printf("Numero muito baixo!\n");
    scanf("%d",&chute);
    }
    printf("Parabens, voce acertou em %d tentativas!\n\n",tent);
    return 0;
    }

    ResponderExcluir
  17. ae boy que aplicativo ses usa

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.