Ir ao conteúdo
  • Cadastre-se

C Jogo jan-ken-pon em C


Julia_Lucia
Ir à solução Resolvido por V!OLADOR,

Posts recomendados

Olá pessoal, estou com dificuldade para finalizar um programa. O enunciado do meu problema é o seguinte:

 

"Implementar um jogo de Pedra, Papel e Tesoura (jan-ken-pon). O usuário deve jogar uma das opções, 1 para pedra, 2 para papel ou 3 para tesoura. O computador deve jogar também (um número aleatório entre 1 e 3). Devem ser implementadas pelo menos 3 funções (além da main):

 

• Lê jogada (sem parâmetros, retorna um inteiro) - informa ao usuário quais são as opções de jogada que ele pode fazer, lê a opção selecionada pelo usuário e verifica se ele informou uma jogada válida (1, 2 ou 3). Ao final retorna o número da jogada feita pelo usuário.

• Imprime jogada (recebe uma jogada inteira, não retorna nada) - de acordo com a entrada informada imprime na tela pedra, papel ou tesoura.

• Calcula resultado (recebe dois parâmetros, a jogada do usuário e a do computador, retorna o resultado inteiro) - de acordo com as jogadas a função deve imprimir: “Papel cobre pedra” ou “Tesoura corta papel” ou “Pedra amassa tesoura”. Ao final, a função "calcula resultado" retorna, 1 em caso de empate, 2 para vitória do usuário ou 3 para vitória do computador.

 

A função principal (main) deve chamar as outras funções para fazer o jogo funcionar. Primeiro deve-se ler a opção do usuário e gerar uma opção para o computador. Depois imprimir as duas jogadas. Por fim calcular o resultado e dizer quem venceu ou se houve empate. Em caso de empate, iniciar uma nova rodada.

 

Atenção: O programa deverá obrigatoriamente usar funções."

 

O que desenvolvi até agora foi:

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

//Lê a jogada do usuário
int usuario()
{
    int num;
    do
    {
        printf("Digite o número da sua jogada: ");
        scanf("%d" , &num);

        if (num < 1 || num > 3)
        {
            printf("\nNúmero inválido.\n\n");
        }
    } while (num < 1 || num > 3);

    return num;
}

//Interpreta o que o usuário jogos e imprime na tela.
char jogada(int j)
{
    if (j == 1)
    {
        printf("\nVocê jogou pedra\n");
    }
    else
    {
        if (j == 2)
        {
            printf("\nVocê jogou papel\n");
        }
        else
        {
            if (j == 3)
            {
                printf("\nVocê jogou tesoura\n");
            }
        }
    }
}

//O computador escolhe aleatóriamente um número entre 1 e 3 e imprime na tela a interpretação do número.
int computador()
{

    int numero;
    numero = rand() %3 + 1;
    if (numero == 1)
    {
        printf("O computador jogou pedra\n");
    }
    else
    {
        if (numero == 2)
        {
            printf("O computador jogou papel\n");
        }
        else
        {
            if (numero == 3)
            {
                printf("O computador jogou tesoura\n");
            }
    return numero;
        }
    }
}

//Calculando o resultado.
int resultado (int a, int b)
{
    int empate = 0;

    if (a == 1 && b == 2)
    {
        printf("\nPapel cobre pedra!\n");
        printf("\n3 - O COMPUTADOR GANHOU!");
    }
    else
    {
        if (a == 1 && b == 3)
        {
            printf("\nPedra amassa tesoura!\n");
            printf("\n2 - VOCÊ GANHOU!");
        }
        else
        {
            if (a == 2 && b == 1)
            {
                printf("\nPapel cobre pedra!\n");
                printf("\n2 - VOCÊ GANHOU!");
            }
            else
            {
                if (a == 2 && b == 3)
                {
                    printf("\nTesoura corta papel!\n");
                    printf("\n3 - O COMPUTADOR GANHOU!");
                }
                else
                {
                    if (a == 3 && b == 1)
                    {
                        printf("\nPedra amassa tesoura!\n");
                        printf("\n3 - O COMPUTADOR GANHOU!");
                    }
                    else
                    {
                        if (a == 3 && b == 2)
                        {
                            printf("\nTesoura corta papel!\n");
                            printf("\n2 - VOCÊ GANHOU!");
                        }
                        else
                        {
                                printf("\n1 - EMPATE! JOGUE NOVAMENTE!!!\n\n");
                                empate = 1;
                        }
                    }
                }
            }
        }
    }
    return empate;
}



int main(){

srand ( time ( NULL ) );
setlocale(LC_ALL, "Portuguese");

int jogada_usuario, jogada_computador, empate;

    printf("TABELA DE JOGADAS\n\n1 - PEDRA \n2 - PAPEL\n3 - TESOURA\n\n");

    do
    {
    jogada_usuario = usuario();
    jogada (jogada_usuario);
    jogada_computador = computador();
    empate = resultado(jogada_usuario , jogada_computador);
    } while (empate == 1);

    return 0;
}

 

Em alguns casos o programa funciona corretamente, mas na maioria da algum tipo de erro sobre a mensagem que aparece na tela ou sobre o sistema que eu criei em casos de empate.

Agradeço desde já! :D

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Aparentemente a lógica se perde porque você condiciona um caso else a um caso if externo e isso não gera o comportamento esperado. Ao invés de um if-else dentro de outro if-else, utilize um if-else-if. Ou seja, na função resultado

 

if ()
{
}

else if ()
{
}

else if ()
{
}

/* ...as 7 possibilidades de a e b */

else
{
	/* caso empate */
	return 1;
}

return 0;

 

Por sinal, nas duas funções anteriores o mesmo comportamento errático pode acontecer.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

você ainda está empacada nesse problema aqui Números aleatórios em c a resposta desse vai te dar a resposta para esse aqui.

 

Eu acabei fazendo aqui, então tá aí.

Spoiler

/*
 *  ██ ▄█▀▒██   ██▒  ██████▓██   ██▓
 *  ██▄█▒ ▒▒ █ █ ▒░▒██    ▒ ▒██  ██▒
 * ▓███▄░ ░░  █   ░░ ▓██▄    ▒██ ██░
 * ▓██ █▄  ░ █ █ ▒   ▒   ██▒ ░ ▐██▓░
 * ▒██▒ █▄▒██▒ ▒██▒▒██████▒▒ ░ ██▒▓░
 * ▒ ▒▒ ▓▒▒▒ ░ ░▓ ░▒ ▒▓▒ ▒ ░  ██▒▒▒ 
 * ░ ░▒ ▒░░░   ░▒ ░░ ░▒  ░ ░▓██ ░▒░ 
 * ░ ░░ ░  ░    ░  ░  ░  ░  ▒ ▒ ░░  
 * ░  ░    ░    ░        ░  ░ ░     
 *                         ░ ░  
 *   
 * Feito por KXSY as 12:24 de 10/27/20
 */

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


/* Constantes */
#define Q_JOGADAS 3
const char *N_VALORES[] = {"Pedra", "Papel", "Tesoura"};

const char *CONS_VITORIAS[] = {"Papel cobre pedra.",
                               "Tesoura corta papel.",
                               "Pedra quebra tesoura.",
                               "Empate!",
							   "KXSY"};

enum v_jogada {PEDRA, PAPEL, TESOURA};


void
iniciaJogadas(enum v_jogada *j);

void
embaraJogadas(enum v_jogada *j);

void
mostraJogada(enum v_jogada j);

enum v_jogada
computadorJogada(enum v_jogada *j);

enum v_jogada
pegaJogada(void);

int
checaVitoria(enum v_jogada usuario, enum v_jogada computador);


int main(void)
{
    int v;
    enum v_jogada usuario, computador, jogadas[Q_JOGADAS];
    iniciaJogadas(jogadas);
    printf("\n\tJogo Jokempo\n");
    do {
        usuario = pegaJogada();
        computador = computadorJogada(jogadas);
        printf("\nJogada do usuario.");
        mostraJogada(usuario);
        printf("\nJogada do computador.");
        mostraJogada(computador);
        v = checaVitoria(usuario, computador);
    } while (v == 1);
    printf("\nFim!");
    getchar();
    return(0);
}

void
iniciaJogadas(enum v_jogada *j)
{
    int cont;
    for (cont = 0; cont < Q_JOGADAS; cont++) {
        j[cont] = cont;
    }
}

void
trocaJogada(enum v_jogada *x, enum v_jogada *y)
{
    enum v_jogada tmp = *x;
    *x = *y;
    *y = tmp;
}

void
embaraJogadas(enum v_jogada *j)
{
    int cont;
    srand(clock());
    for (cont = 0; cont < Q_JOGADAS; cont++) {
        trocaJogada(&j[rand()%Q_JOGADAS],&j[cont]);
    }
}

void
mostraJogada(enum v_jogada j)
{
    switch (j) {
        case PAPEL:
            printf("\n%s",N_VALORES[PAPEL]);
            break;

        case PEDRA:
            printf("\n%s",N_VALORES[PEDRA]);
            break;

        case TESOURA:
            printf("\n%s",N_VALORES[TESOURA]);
            break;
    }
}

enum v_jogada
computadorJogada(enum v_jogada *j)
{
    embaraJogadas(j);
    return(j[0]);
}

enum v_jogada
pegaJogada(void)
{
    char tecla;
    do {
        printf("\nFaca a sua jogada!");
        printf("\nDigite");
        printf("\n%i ou q para %s", PEDRA, N_VALORES[PEDRA]);
        printf("\n%i ou w para %s", PAPEL, N_VALORES[PAPEL]);
        printf("\n%i ou e para %s", TESOURA, N_VALORES[TESOURA]);
        printf("\n:");
        scanf("%c%*c", &tecla);

        tecla = toupper(tecla);

        if (!(tecla == 'Q' || tecla == 'W' ||
              tecla == 'E' || tecla == '0' || 
              tecla == '1' || tecla == '2')) {
                printf("\nTecla invalida!");
                printf("\nTente novamente.");
                printf("\nPressione enter para continuar.\n");
                getchar();
        }
    } while (!(tecla == 'Q' || tecla == 'W' ||
               tecla == 'E' || tecla == '0' || 
               tecla == '1' || tecla == '2'));

    switch (tecla) {
        case 'Q':
        case '0':
            return(PEDRA);

        case 'W':
        case '1':
            return(PAPEL);

        case 'E':
        case '2':
            return(TESOURA);
    }

    return(0);
}

int
checaVitoria(enum v_jogada usuario, enum v_jogada computador)
{
    if (usuario == computador) {
        printf("\n%s\n", CONS_VITORIAS[3]);
        return(1);
    } else {
        switch (usuario) {
            case PEDRA:
                if (computador == PAPEL) {
                    printf("\nVitoria do computador!\n");
                    puts(CONS_VITORIAS[0]);
                    return(2);
                } else if (computador == TESOURA) {
                    printf("\nVitoria do usuario!\n");
                    puts(CONS_VITORIAS[2]);
                    return(3);
                }
                break;
            
            case PAPEL:
                if (computador == TESOURA) {
                    printf("\nVitoria do computador!\n");
                    puts(CONS_VITORIAS[1]);
                    return(2);
                } else if (computador == PEDRA) {
                    printf("\nVitoria do usuario!\n");
                    puts(CONS_VITORIAS[0]);
                    return(3);
                }
                break;

            case TESOURA:
                if (computador == PEDRA) {
                    printf("\nVitoria do computador!\n");
                    puts(CONS_VITORIAS[2]);
                    return(2);
                } else if (computador == PAPEL) {
                    printf("\nVitoria do usuario!\n");
                    puts(CONS_VITORIAS[1]);
                    return(3);
                }
                break;
        }
    }
    return(0);
}

/* KXSY */

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Boa Dia! Quando diz 'Digite o número da sua jogada' fica impreciso porque não há informação (mensagem) que auxilie o usuário na associação de números e símbolos, mas se escrevesse mensagens mais amigáveis e com entendimento no jogo essa imprecisão acabaria.

Citação

• Lê jogada (sem parâmetros, retorna um inteiro) - informa ao usuário quais são as opções de jogada que ele pode fazer, lê a opção selecionada pelo usuário e verifica se ele informou uma jogada válida (1, 2 ou 3). Ao final retorna o número da jogada feita pelo usuário

/******************************************************************************
Exercicio
---------
[...]

• Lê jogada (sem parâmetros, retorna um inteiro) — Informa ao usuário quais
são as opções de jogada que ele pode fazer, lê a opção selecionada pelo usuário
e verifica se ele informou uma jogada válida (1, 2 ou 3). Ao final retorna o
número da jogada feita pelo usuário.
[...]

Atenção
-------
O programa deverá obrigatoriamente usar funções."
*******************************************************************************/
#include <stdio.h>

//simbolos de mao comuns na competicao jan-ken-pon
enum sinais_de_mao {NENHUM= 0x0, PEDRA, PAPEL, TESOURA}; //constantes

// ler jogada (sinal de mao) do usuario  
enum sinais_de_mao
ler_jogada(void) {
  
    //declarar variaveis e iniciar com prodrao
    enum  sinais_de_mao  do_usuario= NENHUM;
    
    //explicar a jogada
    printf("%s",
    "JAN-KEN-PON\n"
    "As regras da jogada sao as seguintes, voce tem 3 opções PEDRA, PAPEL e "
    "TESOURA. Para agilizar a jogada um numero foi associado ao sinais de mao. "
    "Escolha apenas um numero, digite-o e depois ENTER [para CONFIRMAR].\n"
    "\n");
    
    //jogar
    do {
        //enquanto invalida
        printf("%s",
        "JAN-KEN-PON\n"
        "Pedra, papel e tesoura sao as jogadas, siga as regras do jogo.\n"
        "\n");
        
        printf("%s",
        "   Por favor, digite o numero de sua jogada? 1)PEDRA  2)PAPEL  3)TESOURA\n"
        "   USUARIO . . . . . . . . . . . . . . . . ? "
        ); scanf("%u", &do_usuario);
 
        //linha estetica
        printf("\n");
    
    //expressao para fora do intervalo de 1 ate 3
    } while ((do_usuario < PEDRA) || (TESOURA < do_usuario));
    
    //fim
    printf("%s",
    "JAN-KEN-PON\n"
    "Obrigado e Boa Sorte!");
    
    return do_usuario;
}

int
main(void) {
    ler_jogada() //do usuario;
    
    //fim
    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!