Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Piedra, Papel, Tijeras (C) Problema

Estas en el tema de Piedra, Papel, Tijeras (C) Problema en el foro de C/C++ en Foros del Web. Código: #include <winbgim.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <time.h> int main() { int victoria, j, jm, vida, ch; victoria = 0; j = ...
  #1 (permalink)  
Antiguo 28/08/2012, 16:46
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Piedra, Papel, Tijeras (C) Problema

Código:
#include <winbgim.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

int main()
{
    int victoria, j, jm, vida, ch;
    victoria = 0;
    j = 0;
    vida = 5;
    jm = 0;
    
    srand(time(NULL));
    printf("Bienvenido a Piedra, papel o tijeras\n");
    do{
    printf("1.Piedra\n");
    printf("2.Papel\n");
    printf("3.Tijeras\n");
    while ((ch = getchar()) != '\n' && ch != EOF);
    scanf("%d",&j);
    while ((ch = getchar()) != '\n' && ch != EOF);
    jm = rand() % 4;
    if(j > 3)
    {
         do{
         printf("Coloque un numero menor o igual a tres\n");
         scanf("%d",&j);
         }while(j > 3);
    }
    
    if(j == 1)
    {
         printf("Usted eligio rocas\n");
         if(jm == 3)
         {
               printf("Computadora eligio tijeras. Roca rompe tijeras.\n");
               printf("Jugador gana un punto.\n");
               victoria = victoria + 1;
               printf("Usted tiene %d vidas.\n",vida);
               printf("Usted tiene %d puntos.\n",victoria);
         }
         if(jm == 2)
         {
               printf("Computadora eligio papel. Papel envuelve roca.\n");
               printf("Usted pierde una vida\n");
               vida = vida - 1;
               printf("Usted tiene %d vidas\n",vida);
               printf("Usted tiene %d puntos\n",victoria);
               
         }
         if(jm == j)
         {
               printf("Computadora eligio roca.\n Empate");
         }
    }
    if(j == 2)
    {
         printf("Usted eligio papel");
         if(jm == 1)
         {
               printf("Computadora eligio roca.\n Papel envuelve roca.\n Usted gana un punto.\n");
               victoria = victoria + 1;
               printf("Usted tiene %d vidas\n",vida);
               printf("Usted tiene %d puntos\n",victoria);
         }
         if(jm == 3)
         {
               printf("Computadora eligio tijera.\n Tijera corta papel.\n Usted pierde una vida.\n");
               vida = vida - 1;
               printf("Usted tiene %d vidas\n",vida);
               printf("Usted tiene %d puntos\n",victoria);
         }
         if(jm == j)
         {
               printf("Computadora eligio papel.\n Empate");
         }
    }
    if(j == 3)
    {
         printf("Usted eligio tijeras\n");
         if(jm == 1)
         {
               printf("Computadora eligio piedra.\n Roca rompe tijera.\n.Usted pierde una vida.\n");
               vida = vida - 1;
               printf("Usted tiene %d vidas\n",vida);
               printf("Usted tiene %d puntos\n",victoria);
         }
         if(jm == 2)
         {
               printf("Computadora eligio papel.\n Tijera corta papel. Usted gana un punto\n");
               victoria = victoria + 1;
               printf("Usted tiene %d vidas\n",vida);
               printf("Usted tiene %d puntos\n",victoria);
         }
         if(jm == j)
         {
               printf("Computadora eligio tijeras.\n Empate.\n");
         }
    }
}while(victoria < 5 || vida > 0);
if(victoria == 5)
{
            printf("Usted ha ganado");
}
if(vida < 0)
{
        printf("Usted perdio");
}

getchar();
return 0;
}
Hola!!!

Dejo este otro codigo. Estoy algito triste, me pase media hora pensando como hacer un programa que hiciera el juegito piedra papel o tijeras. Despues, como una hora haciendo el diagrama de flujo del programa, para asegurarme de que la logica estuviera correcta, y como otra hora mas codificando.

Sin embargo, cuando corro el programa tiene muchisimos errores (bugs) que en realidad no impiden que el juego corra, pero son molestisimos.

Por ejemplo, en muchas ocasiones, no me reconoce los if, o me los saltea, o solo me dice"Usted ha escogido X", y ya me vuelve a aparecer el menu de opcion.

Que deberia hacer?

Saludos y gracias de antemano.

Nota: La libreria Winbgim esta ahi, porque cuando termine voy a hacerlo grafico al juegito, por ahora solo quiero que me ande la logica, jeje.

Prometo que cuando termine lo subo, para que se vicien con el piedra papel o tijera (es un chiste, juego mas aburrido que este en el mundo no ha de haber, jeje)

Saludos!!
  #2 (permalink)  
Antiguo 28/08/2012, 17:43
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola harryarcoiris.

Proba de este modo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.   char *v[3] = {"piedra","papel","tijeras"};
  7.   int ju, pc, jugados = 1, ganados = 0, perdidos = 0;
  8.  
  9.   randomize();
  10.   do {
  11.     printf("Jugada %d, elija una opcion (1, 2, 3) G:%d P:%d\n",jugados, ganados, perdidos);
  12.     printf("1. Piedra\n");
  13.     printf("2. Papel\n");
  14.     printf("3. Tijeras\n");
  15.     do
  16.       scanf("%d",&ju);
  17.     while ((ju == '\n') && (ju != '1' || ju != '2' || ju != '3'));
  18.     while(getchar()!='\n');
  19.     ju--;
  20.     pc = rand() % 3;
  21.     printf("Ud eligio %s, la PC eligio %s => ",v[ju], v[pc]);
  22.     if (ju == pc)
  23.       printf("Hay empate\n");
  24.     else if ((ju == 0 && pc == 2)||(ju == 1 && pc == 0)||(ju == 2 && pc == 1)) {
  25.       printf("Ud. gana\n");
  26.       ganados++;
  27.     }
  28.     else {
  29.       printf("La PC gana\n");
  30.       perdidos++;
  31.     }
  32.     jugados++;
  33.     printf("-----------------------------\n");
  34.   } while (ganados < 5 && perdidos < 5);
  35.   if (ganados > perdidos)
  36.     printf("Ud ha ganado en %d intentos.",jugados);
  37.   else
  38.     printf("Ud ha perdido en %d intentos.",jugados);
  39.   getchar();
  40.   return 0;
  41. }

Saludos.
  #3 (permalink)  
Antiguo 28/08/2012, 18:34
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: Piedra, Papel, Tijeras (C) Problema

Tu code esta mas profesional, es mas eficiente, pero cuando lo compilo, tengo un problema, en la funcion randomize.

Que es lo que hace excactamente? Es igual a srand?

Me da este error,
11 C:\Dev-Cpp\Programacion desde 0\Proyectos\Piedra Papel Tijera 2.cpp `randomize' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)

Sin el randomize anda perfecto, me encanta!!!

Che, pero no sabes porque el mio no funka?
  #4 (permalink)  
Antiguo 28/08/2012, 19:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: Piedra, Papel, Tijeras (C) Problema

Nota: Ya arregle uno de mis problemas, lo de que se me saltaba. Era porque rand elegia entre 0 y cuatro, es decir, que cuando elegia 0 habia problemas.

Bueno, pero aun tengo problemas, para entrar el dato se debe darlo dos veces, no se porque
  #5 (permalink)  
Antiguo 28/08/2012, 21:40
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 4 meses
Puntos: 94
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola!
Cita:
para entrar el dato se debe darlo dos veces, no se porque
eso se debe al bucle while que esta antes del scanf. Como ya sabes ese bucle lo que hace es limpiar el bufer, pero cuando el programa se ejecuta el bufer del teclado esta limpio por lo tanto el getchar espera por caracteres hasta encontrar '\n'(una vez encontrado el '\n' por el getchar() recien scanf pide el ingreso)...



Código C:
Ver original
  1. do
  2.       scanf("%d",&ju);
  3.     while ((ju == '\n') && (ju != '1' || ju != '2' || ju != '3'));
ju es una variable de tipo int por lo tanto compararlo con el ascii de esos caracteres no tiene sentido ya que siempre va a ser falso la condicion(ju deberia ser un char para hacer uso del do-while)


Saludos
  #6 (permalink)  
Antiguo 29/08/2012, 13:18
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Cita:
ju es una variable de tipo int por lo tanto compararlo con el ascii de esos caracteres no tiene sentido ya que siempre va a ser falso la condicion...
Hola cesar_casla.

Es cierto que 'ju' podría haber sido declarado como char, pero disiento con tu concepto en este caso.

En C/C++ existen moldeos explícitos e implícitos, en este caso aplica el último. Por ejemplo:
Código C:
Ver original
  1. {
  2.   char ch = 'A';
  3.   int  i = ch;  // cast implicito
  4.  
  5.   printf("%c %d\n",i ,i);
  6.   i += 1;
  7.   printf("%c %d\n", i ,i);
  8.   ...
  9.   for(i=ch; i < ch+26; i++ ) printf("%c", i);
  10.   ...
  11. }


Si probamos este código:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  int ju;
  6.  
  7.   ju = 49;
  8.   if (ju == '1')
  9.     printf("ju es el caracter 1 !\n");
  10.  
  11.   ju = 50;
  12.   if (ju == '2');
  13.     printf("Ahora ju es el caracter 2 !\n");
  14.  
  15.    ju = 52;
  16.   if (ju == '3');
  17.     printf("Ahora ju es el caracter 3 !\n");
  18.  
  19.   ju = 10;
  20.   if (ju == '\n')
  21.     printf("Ahora ju es nueva linea !\n");
  22.  
  23.   getchar();
  24. }
Queda claro que se aplica el cast apropiado y el resultado de los condicionales son correctos.

Saludos.

Última edición por ecfisa; 29/08/2012 a las 13:24
  #7 (permalink)  
Antiguo 29/08/2012, 14:54
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 4 meses
Puntos: 94
Respuesta: Piedra, Papel, Tijeras (C) Problema

Entiendo lo del casteo explicito e implicito, pero a lo q yo me referia es que si en el scanf usas "%d" como formato en ju se guarda un entero(1,2 ó 3 decimal) y no un caracter('1'=49, '2'=50 ó '3'=51), por lo tanto no tiene sentido ese bucle ya que estas comparando, por ejemplo: 1!=10 1!=49, 1!=50...

Saludos
  #8 (permalink)  
Antiguo 29/08/2012, 15:30
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola cesar_casla.

Cita:
a lo q yo me referia es que si en el scanf usas "%d" como formato en ju se guarda un entero
Tenes razón, no había reparado que había puesto "%d" como formato.

Saludos.
  #9 (permalink)  
Antiguo 29/08/2012, 16:11
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola.

Y para no dejar las cosas a medio hacer, como bién lo destacó cesar_casla , el código donde se solicita la opción del jugador debería haber sido:
Código C:
Ver original
  1. ...
  2.   do
  3.    scanf("%c", &ju);
  4.   while (ju != '1' && ju != '2' && ju != '3');
  5.   ...
Siendo ju de tipo char.

Saludos.
  #10 (permalink)  
Antiguo 30/08/2012, 13:32
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: Piedra, Papel, Tijeras (C) Problema

Disculpen, empece hace bastante poco con este tipo de cosas, pero me dejaron con una duda.

Gracias por lo del limpiador de buffer.

Porque ju debe ser char, si va a tener un numero?

Si, lo del while es muy inteligente, para impedir que se elijan otro numero que no sea 3.

Saludos!
  #11 (permalink)  
Antiguo 30/08/2012, 15:38
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola.

Cita:
Porque ju debe ser char, si va a tener un numero?
En realidad por que es mas sencillo de evaluar como caracter, luego se puede convertir a su valor numérico.
Con la modificación de la elección quedaría:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>  
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7.   char *v[3] = {"piedra","papel","tijeras"};
  8.   char ju, pc, jugados = 1, ganados = 0, perdidos = 0;
  9.  
  10.   srand((unsigned) time(NULL));  /* por que tuviste problemas con randomize */
  11.   do {
  12.     printf("Jugada %d | Ganados:%2d Perdidos:%2d\n",jugados, ganados, perdidos);
  13.     printf("---------------------------------------\n");
  14.     printf("1. Piedra\n");
  15.     printf("2. Papel\n");
  16.     printf("3. Tijeras\n");
  17.     printf("elija una opcion (1-3)\n");
  18.  
  19.     do
  20.       scanf("%c", &ju);
  21.     while (ju != '1' && ju != '2' && ju != '3');
  22.     ju -= 49; /* '1' = 49, '2' = 50, '3' = 51 => 0,1,2 (también puede usarse atoi ) */
  23.     pc = rand() % 3;
  24.  
  25.     printf("Ud eligio %s, la PC eligio %s => ", v[ju], v[pc]);
  26.     if (ju == pc)
  27.       printf("Hay empate\n");
  28.     else if ((ju == 0 && pc == 2)||(ju == 1 && pc == 0)||(ju == 2 && pc == 1)) {
  29.       printf("Ud. gana\n");
  30.       ganados++;
  31.     }
  32.     else {
  33.       printf("La PC gana\n");
  34.       perdidos++;
  35.     }
  36.  
  37.     jugados++;
  38.     printf("\n\n");
  39.   } while (ganados < 5 && perdidos < 5);
  40.  
  41.   if (ganados > perdidos)
  42.     printf("Ud ha ganado en %d intentos.",jugados);
  43.   else
  44.     printf("Ud ha perdido en %d intentos.",jugados);
  45.  
  46.   while(getchar()!='\n');
  47.   getchar();
  48.   return 0;
  49. }

Saludos.
  #12 (permalink)  
Antiguo 31/08/2012, 09:43
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola de nuevo!!!

Cita:
ju -= 49;
Y esto porque?

Que tiene que ver todo esto con el 49?

Lo mas probable que sea algo que tenga que ver con pura ignorancia mia, disculpenme si es asi?

Cita:
while (ju != '1' && ju != '2' && ju != '3');
O sea que mientras While no sea igual a uno, y a dos, y a tres, espera, entra en bucle infinito, o que hace?

Saludos de Antemano, me han ayudado mucho con este programa, y he aprendido muchisimo.

Saludos!
  #13 (permalink)  
Antiguo 07/09/2012, 05:14
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Piedra, Papel, Tijeras (C) Problema

Hola harryarcoiris.

Cita:
Cita:
ju -= 49;
Y esto porque?
Esa línea está comentada en el código, pero empecemos por lo primero: http://es.wikipedia.org/wiki/ASCII (Código ASCII).
El valor ASCII del caracter '0' es 49, el de el '1' es 50 y el del '2' es 51, por lo tanto si el caracter presionado fué:
  • '0' (49) => ju = 49-49 = 0
  • '1' (50) => ju = 50-49 = 1
  • '2' (51) => ju = 51-49 = 2

Cita:
O sea que mientras While no sea igual a uno, y a dos, y a tres, espera, entra en bucle infinito, o que hace?
Pide un caracter, lo almacena en ju hasta que el valor de ju sea '1','2' ó '3'.

Saludos.
  #14 (permalink)  
Antiguo 09/09/2012, 19:49
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: Piedra, Papel, Tijeras (C) Problema

Ah!!!!

Si, el ASCII me lo se, pero no lo relacione, que bobo que me estoy haciendo, jeje,

Bueno, gracias por todo. Saludos!

Etiquetas: int, papel, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:50.