Autor Tema: Juego roca, papel y tijeras código programa con switch case decide [C] lenguajeC  (Leído 4494 veces)

Darklexis312

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola, qué tal. Soy nuevo en este foro y tengo un problema. Me atoré con este programa, ya no supe qué más hacer cuando corro el programa y elijo cualquier opción para el jugador 1 me lo manda como caracter no valido. ¿Qué hace falta para que funcione bien mi programa?, espero que puedan iluminarme amigos, de antemano muchas gracias

SOURCE

Código: [Seleccionar]
/*1. En el juego para dos personas llamado "ROCA, PAPEL Y TIJERAS" cada jugador escoge ser "T", "R" o "P" respectivamente.
El jugador se determina así por medio de la función: roca rompe tijeras, las tijeras cortan el papel, el papel cubre la roca,
el juego es un empate si ambos jugadores eligen la misma opción. Elaborar un programa para que determine cual jugador gana,
la salida debe mostrarse por la función de la siguiente forma: "T-R Roca rompe tijeras gana el jugador 2"*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "juego.h"

void main()
{
int Juego;
char x, y;
printf("\t\t\tJUEGO ROCA, PAPEL Y TIJERAS\n");
printf("Bienvenidos elijan un arma\nR.-Roca\nP.-Papel\nT.-Tijeras\n");
printf("Arma jugador 1: [ ]\b\b");
fflush(stdin);
scanf_s("%c", &x);
toupper(x);
printf("Arma jugador 2: [ ]\b\b");
fflush(stdin);
scanf_s("%c", &y);
toupper(y);

if (x == 'R' &&y == 'R')
{
Juego = 1;
}
else
if (x == 'P' &&y == 'P')
{
Juego = 2;
}
else
if (x == 'T' &&y == 'T')
{
Juego = 3;
}
if (x == 'R' &&y == 'P')
{
Juego = 4;
}
else
if (x == 'P' &&y == 'T')
{
Juego = 5;
}
else
if (x == 'T' &&y == 'R')
{
Juego = 6;
}
if (x == 'R' &&y == 'T')
{
Juego = 7;
}
else
if (x == 'P' &&y == 'R')
{
Juego = 8;
}
else
if (x == 'T' &&y == 'P')
{
Juego = 9;
}
else
{
Juego = 0;
}

switch (Juego)
{
case 1:
printf("\nR-R Empate");
break;
case 2:
printf("\nP-P Empate");
break;
case 3:
printf("\nT-T Empate");
break;
case 4:
papel_cubre_roca(x, y);
break;
case 5:
tijeras_cortan_papel(x, y);
break;
case 6:
roca_rompe_tijeras(x, y);
break;
case 7:
roca_rompe_tijeras(x, y);
break;
case 8:
papel_cubre_roca(x, y);
break;
case 9:
tijeras_cortan_papel(x, y);
break;
case 0:
printf("\nCARACTER INVALIDO");
break;
}
system("pause>null");
}

HEADER

juego.h

Código: [Seleccionar]
void papel_cubre_roca(char,char);
void tijeras_cortan_papel(char, char);
void roca_rompe_tijeras(char, char);

void papel_cubre_roca(char x, char y)
{
if (x == 'P'&& y == 'R')
{
printf("\n%c-%c P-R Papel cubre roca gana el jugador 1", x, y);
}
else
printf("\n%c-%c R-P Papel cubre roca gana el jugador 2", x, y);
}
void tijeras_cortan_papel(char x, char y)
{
if (x == 'T'&& y == 'P')
{
printf("\n%c-%c T-P Tijeras cortan papel gana el jugador 1", x, y);
}
else
printf("\n%c-%c P-T Tijeras cortan papel gana el jugador 2", x, y);
}
void roca_rompe_tijeras(char x, char y)
{
if (x == 'R'&& y == 'T')
{
printf("\n%c-%c R-T Roca rompe tijeras gana el jugador 1",x,y);
}
else
printf("\n%c-%c T-R Roca rompe tijeras gana el jugador 2", x, y);
}
« Última modificación: 26 de Junio 2018, 19:36 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, para quien lea este hilo, he adaptado el código a mi compilador (he usado el IDE Codeblocks) p.ej. en lugar de scanf_s he usado scanf... Además he introducido unas líneas de prueba. El único archivo que he tocado es el main.c que he dejado así:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "juego.h"

int main()
{

int Juego;
char x, y;
printf("Hello world!\n");
printf("\t\t\tJUEGO ROCA, PAPEL Y TIJERAS\n");
printf("Bienvenidos elijan un arma\nR.-Roca\nP.-Papel\nT.-Tijeras\n");
printf("Arma jugador 1: [ ]\b\b");
fflush(stdin);
scanf("%c", &x);
toupper(x);
printf("Arma jugador 2: [ ]\b\b");
fflush(stdin);
scanf("%c", &y);
toupper(y);

if (x == 'R' &&y == 'R')
{
Juego = 1;
}
else
if (x == 'P' &&y == 'P')
{
Juego = 2;
}
else
if (x == 'T' &&y == 'T')
{
Juego = 3;
}
if (x == 'R' &&y == 'P')
{
Juego = 4;
}
else
if (x == 'P' &&y == 'T')
{
Juego = 5;
}
else
if (x == 'T' &&y == 'R')
{
Juego = 6;
}
if (x == 'R' &&y == 'T')
{
Juego = 7;
}
else
if (x == 'P' &&y == 'R')
{
Juego = 8;
}
else
if (x == 'T' &&y == 'P')
{
Juego = 9;
}
else
{
Juego = 0;
}

    if (x==65) {printf("Has introducido A mayuscula"); Juego=99;}

switch (Juego)
{
case 1:
printf("\nR-R Empate");
break;
case 2:
printf("\nP-P Empate");
break;
case 3:
printf("\nT-T Empate");
break;
case 4:
papel_cubre_roca(x, y);
break;
case 5:
tijeras_cortan_papel(x, y);
break;
case 6:
roca_rompe_tijeras(x, y);
break;
case 7:
roca_rompe_tijeras(x, y);
break;
case 8:
papel_cubre_roca(x, y);
break;
case 9:
tijeras_cortan_papel(x, y);
break;
    case 99:
        printf("\nProblema detectado");
break;
case 0:
printf("\nCARACTER INVALIDO");
break;
}
system("pause>null");
return 0;
}

El problema parece estar en cuestiones de base de la programación en C. Un char no puede compararse usando == , un == es un comparador numérico. Si se usa el tipo char, C utiliza además del carácter su equivalente numérico en ASCII. Por ejemplo la A mayúscula es el valor numérico 65, la B mayúscula el 66 y así sucesivamente. He introducido

if (x==65) {printf("Has introducido A mayuscula"); Juego=99;}

para ver si detecta que se introduce una A.

En el case he introducido

    case 99:
        printf("\nProblema detectado");
        break;

Luego ejecuto el programa e introduzco A y T como armas de los jugadores y me aparece el mensaje "Has introducido A" y "Problema detectado"

Posiblemente debería usarse otro tipo de comparador de cadenas como strcmp si se quiere hacer la comparación no numérica. Otra opción es usar los equivalentes numéricos ASCII de cada letra.

También hay que tener cuidado con la posible presencia de caracteres ocultos o en el búfer cuando se hagan comparaciones.

En resumen creo que sería bueno revisar cuestiones de base del lenguaje C para detectar todos los cambios a realizar. Para adquirir los conceptos básicos de C es recomendable seguir el curso básico de programación en lenguaje C desde cero disponible en https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=82&Itemid=210

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".