Autor Tópico: Onde está o erro?  (Lida 757 vezes)

Offline LeandroCGMS

  • Usuário Ubuntu
  • *
  • Mensagens: 38
    • Ver perfil
Onde está o erro?
« Online: 24 de Agosto de 2016, 08:20 »
Bom dia. Estou tentando dar uns primeiros passos em programação, então comecei com a linguagem C e nesse exercício não entendo o porquê de às vezes dar a mensagem de que ganhei e logo em seguida de que o computador ganhou ao mesmo tempo e em algumas vezes funciona perfeitamente.

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

int main(int argc, char *argv[])
{
int jogador;
int cpu;
setlocale(LC_ALL,"Portuguese");
printf("_______Jo Ken Pô_______\n\n");
printf("1. Pedra\n");
printf("2. Papel\n");
printf("3. Tesoura");
printf("\n\nDigite a opção desejada: ");
scanf("%d", &jogador);
if (jogador < 1 || jogador >=3)
{
exit(0);
}

switch(jogador)
{
case 1:
system("cls");
printf("Você escolheu Pedra\n");
break;


case 2:
system("cls");
printf("Você escolheu Papel\n");
break;

case 3:
system("cls");
printf("Você escolheu Tesoura\n");
break;
}
srand(time(NULL));
cpu = 1+ rand() % 3; //gera um numero aleatorio ente 1 e 3

switch(cpu)
{
case 1: printf ("CPU escolheu Pedra\n"); break;
case 2: printf ("CPU escolheu Papel\n"); break;
case 3: printf ("CPU escolheu Tesoura\n"); break;
}
if ((jogador == 1 && cpu == 3 || jogador == 2 && cpu == 1 || jogador == 3 && cpu == 2))
{
printf("Você Venceu. Parabéns!\n\n");
}
if (jogador == cpu) // verifica se houve empate
{
printf("Você empatou com o computador.\n\n");
}
else
{
printf("O computador venceu. Tenha mais sorte da próxima vez!\n\n");
}

system("pause");
return 0;
}
« Última modificação: 25 de Agosto de 2016, 22:21 por LeandroCGMS »

Offline jeflui

  • Usuário Ubuntu
  • *
  • Mensagens: 744
    • Ver perfil
Re:Onde está o erro?
« Resposta #1 Online: 24 de Agosto de 2016, 20:44 »
Código: [Selecionar]
if (jogador < 1 || jogador >=3)if (jogador < 1 || jogador >=3)
{
exit(0);
}
Esse if você pode alterar para:
Código: [Selecionar]
if (jogador < 1 || jogador >3)
{
exit(0);
}
Desta forma se a escolha for a opção 3 Tesoura o programa vai continuar como é esperado.

O resto está certo, acredito que você precisa validar se o número aleatório está sendo gerado entre 1 e 3.

Offline Darcamo

  • Usuário Ubuntu
  • *
  • Mensagens: 1.315
    • Ver perfil
Re:Onde está o erro?
« Resposta #2 Online: 25 de Agosto de 2016, 08:54 »
A linha
Código: [Selecionar]
cpu = 1+ rand() % 3; está certa. Vai gerar um número entre 1 e 3 sempre (incluindo os extremos).

O problema está no trecho abaixo
Código: [Selecionar]
if ((jogador == 1 && cpu == 3 || jogador == 2 && cpu == 1 || jogador == 3 && cpu == 2))
{
  printf("Você Venceu. Parabéns!\n\n");
}
if (jogador == cpu) // verifica se houve empate
{
  printf("Você empatou com o computador.\n\n");
}
else
{
  printf("O computador venceu. Tenha mais sorte da próxima vez!\n\n");
}

Caso o jogador tenha vencido ele vai entrar no primeiro "if", mas do jeito que está após o corpo desse if ele vai testar o segundo if.
Claro que, se ele entrou no primeiro if, não tem como a condição do segundo if (jogador == cpu) ser verdadeira e ele então ele SEMPRE vai entrar no "else" do segundo if se o jogador vencer. Dessa forma, sempre que o jogador vencer após imprimir que o jogador venceu ele também vai imprimir que o computador venceu.

Para resolver, coloque um else após o primeiro if para que os testes que vem depois só sejam executados se ele não entrar no primeiro if. O trecho ficaria como abaixo.

Código: [Selecionar]
if ((jogador == 1 && cpu == 3 || jogador == 2 && cpu == 1 || jogador == 3 && cpu == 2))
  {
    printf("Você Venceu. Parabéns!\n\n");
  }
else
  {
    if (jogador == cpu) // verifica se houve empate
      {
        printf("Você empatou com o computador.\n\n");
      }
    else
      {
        printf("O computador venceu. Tenha mais sorte da próxima vez!\n\n");
      }
  }


Offline LeandroCGMS

  • Usuário Ubuntu
  • *
  • Mensagens: 38
    • Ver perfil
Re:Onde está o erro?
« Resposta #3 Online: 25 de Agosto de 2016, 11:00 »
Muito obrigado!
« Última modificação: 25 de Agosto de 2016, 22:20 por LeandroCGMS »