Ir ao conteúdo

C Jogo jan-ken-pon em C


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

Posts recomendados

Postado

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
  • Solução
Postado

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
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!