Onde está o erro?

Iniciado por LeandroCGMS, 24 de Agosto de 2016, 08:20

tópico anterior - próximo tópico

LeandroCGMS

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;
}

jeflui

if (jogador < 1 || jogador >=3)if (jogador < 1 || jogador >=3)
{
exit(0);
}

Esse if você pode alterar para:
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.

Darcamo

A linha 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

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.


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");
      }
  }



LeandroCGMS

#3
Muito obrigado!