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

Piedra, Papel y Tijera

Estas en el tema de Piedra, Papel y Tijera en el foro de C/C++ en Foros del Web. Hola, me estoy apoyando en varios codigos para realizar el juego de Piedra, Papel y Tijera. Me esta costando mucho pero mas o menos lo ...
  #1 (permalink)  
Antiguo 07/03/2014, 10:59
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Piedra, Papel y Tijera

Hola, me estoy apoyando en varios codigos para realizar el juego de Piedra, Papel y Tijera. Me esta costando mucho pero mas o menos lo tengo, aunque como digo, me he apoyado en varios codigos vistos en la red y en esta web (tema cerrado) y tengo varias dudas, pero mas que problemas, es para saber el por que de ciertos usos de variables en ciertas partes del codigo. No se el por que de su usos pero quiero saberlos por aquello de aprender mas......... estoy muy verde, xD

Este es el codigo, compila y funciona:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.   char *materiales[3] = {"Piedra", "Papel", "Tijeras"};
  7.   int jugador, cpu;
  8.   int partidas = 0, ganados = 0, empate = 0, perdidos = 0;
  9.  
  10.   //1. Empieza el juego
  11.   do {
  12.       //2. Estadisticas
  13.       printf("\n\t\t\t\t  PJ PG PE PP\n");
  14.       printf("\n\t\t\t\t  %d  %d  %d  %d\n", partidas, ganados, empate, perdidos);
  15.      
  16.       //2.1. Jugador tira
  17.       printf("\n\n Piedra (1) - Papel (2) - Tijera (3)\n Elige opcion: ");
  18.      
  19.       do
  20.         scanf("%d", &jugador);
  21.        
  22.         while ((jugador == '\n') && (jugador != '1' || jugador != '2' || jugador != '3'));
  23.        
  24.         while (getchar()!= '\n');
  25.        
  26.         jugador--;
  27.         cpu = rand() % 3;
  28.        
  29.         //2.2. Informacion de la mano
  30.         printf ("\n\n MANOS\n");
  31.         printf (" -----\n");
  32.         printf ("\n Jugador:   %s"
  33.                 "\n CPU:       %s"
  34.                 "\n Resultado:", materiales[jugador], materiales[cpu]);
  35.        
  36.         //2.3. Comprobaciones de manos
  37.         if (jugador == cpu){
  38.           printf(" Empate\n");
  39.           empate++;
  40.           }
  41.          
  42.           else if ((jugador == 0 && cpu == 2)||(jugador == 1 && cpu == 0)||(jugador == 2 && cpu == 1)) {
  43.                printf(" Gana Jugador\n");
  44.                ganados++;
  45.                }
  46.                
  47.           else {
  48.                printf(" Gana CPU\n");
  49.                perdidos++;
  50.                }
  51.        
  52.         //2.4. Termina la mano, se suma otra partida.
  53.         partidas++;
  54.        
  55.         //2.5. Muestro informacion en pantalla asta que se introduce intro, por eso el uso de getchar.
  56.         printf ("\n\n\n Pulsa intro para siguiente mano");
  57.         getchar();
  58.         system ("CLS");
  59.  
  60.       }while (ganados < 5 && perdidos < 5);
  61.      
  62.       if (ganados > perdidos)
  63.         printf ("\n Has ganado en %d intentos.", partidas);
  64.      
  65.         else
  66.             printf ("\n Has perdido en %d intentos.", partidas);
  67.            
  68.             getchar();
  69.  
  70.  system ("PAUSE");
  71.  return 0;
  72.  }
  #2 (permalink)  
Antiguo 07/03/2014, 11:07
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

Las dudas que tengo son:

1. Por que dos "while" tras el scanf. El priemero se que es "mientras sea 1,2 o 3, sigue el proceso", pero ¿el segundo while?.

Código C:
Ver original
  1. while ((jugador == '\n') && (jugador != '1' || jugador != '2' || jugador != '3'));
  2.        
  3.         while (getchar()!= '\n');

2. Tras los while que cito, hay un uso de la variable jugador, que decrementa, pero no entiendo el por que, aunque ya he probado a comentarla para no ejecutarla y el programa falla, asi que se que tiene importancia pero no se el por que.

Código C:
Ver original
  1. jugador--;

Y por ultimo, si me quereis explicar un poco sobre el puntero que usa el array materiales, no entiendo el funcionamiento de este, se que es para acceder a la posicion, pero no se el por que de su importancia, pues si lo quito deja de funcionar el programa, asi que mi pregunta es mas para adquirir conocimientos sobre punteros.

Un saludo
  #3 (permalink)  
Antiguo 07/03/2014, 12:38
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 3 meses
Puntos: 29
Respuesta: Piedra, Papel y Tijera

El segundo while limpia el buffer de entrada y como termina con \n nueva linea pues ya sabes.
Y luego el jugador-- resta -1 porque luego al usarlo con los materiales pues empieza desde 0 la lista.

Luego el puntero array materiales si te refieres a char * pues es un puntero que contiene char pero como supongo que sabes que todos las listas "lista[size]" son un puntero a "lista[0]" pues es parecido a declarar char listas[]={""...}

Saludos
  #4 (permalink)  
Antiguo 08/03/2014, 04:42
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

Muchas gracias patilanz. Aunque el punto 2 del por que jugador-- sigue sin quedarme claro, jejeje

Un saludo
  #5 (permalink)  
Antiguo 08/03/2014, 05:03
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Piedra, Papel y Tijera

//mientras jugador pulsa enter y no elije 1 o 2 o 3 no se ejecuta el segundo bucle,
//lo que hace es pegar un salto hacia la linea cpu = rand() % 3; si no se da la
//condicion del primer bucle
while ((jugador == '\n') && (jugador != '1' || jugador != '2' || jugador != '3'));

while (getchar()!= '\n');

jugador--;

o sea que mientras pulses enter sin elejir o 1 o 2 o 3 el programa no lee nada, te quedara pediendo el numero toda la vida XDDD

Última edición por vangodp; 08/03/2014 a las 05:12
  #6 (permalink)  
Antiguo 08/03/2014, 05:49
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 3 meses
Puntos: 29
Respuesta: Piedra, Papel y Tijera

El jugador-- es supongo para controlar mejor el array. Osea la variable jugador contiene la elección del jugador entre 1 y 3. Pero luego se usa esta variable como indice para ver que material ha elegido el jugador pero como los materiales empiezan desde 0 le resta uno al jugador de modo que si elige 1 sera el indice 0 osea Piedra.

También puedes hacer esto:

char *materiales[4] = {"","Piedra", "Papel", "Tijeras"};

Dejas un espacio y luego no hace falta restar 1 al jugador.

Así lo entiendes ?
  #7 (permalink)  
Antiguo 08/03/2014, 09:23
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

si, jejeje muchisimas gracias a ambos, sois grandes!!!!

Para no abrir otro tema (si tengo que hacerlo lo hago) pongo aqui otra duda con otro programa.

De un array que almacena 25 palabras, quiero sacar una de estas (uso rand para hacerlo de forma aleatoria) y copiar esa palabra en otra variable de tipo char.

Código C:
Ver original
  1. char palabras[25][20] = {"real murcia", "universo", "pesadilla", "programacion", "juegos olimpicos",
  2.                              "television", "videojuegos", "telefono", "ignorancia", "euforia",
  3.                              "arquitecto", "entusiasmo", "cuestionar", "orhuela", "drogueria",
  4.                              "murcielago", "echevarria", "menorquina", "degustacion", "ayuntamiento",
  5.                              "subdirectora", "automoviles", "julia roberts", "ultraligero", "albaricoques"};
  6.  
  7.     int hora = time(NULL);
  8.     int aleatorio;
  9.     int barra_baja;
  10.     char pal_oculta;
  11.    
  12.     srand(hora);
  13.    
  14.     do{
  15.         aleatorio = rand()%25;
  16.  
  17.         strcpy (pal_oculta, palabras[aleatorio]);

con mis pocos conocimientos, lo unico que veo idoneo para hacer lo que pido, es usar la funcion strcpy pues copia cadenas de texto de origen a destino, pero por las pruebas que llevo veo que no es la forma correcta, asi que, ¿como deberia hacerlo?. Es para el juego del ahorcado y la idea es sacar palabras del array de forma aleatoria y pasar estas a la variable pal_oculta para jugar con esta. Tengo incluido la libreria para cadenas de texto
  #8 (permalink)  
Antiguo 08/03/2014, 10:15
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

me contesto a mi mismo por que creo que ya lo tengo:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <time.h>
  6.  
  7. void muneco1();
  8. void muneco2();
  9. void muneco3();
  10. void muneco4();
  11. void muneco5();
  12. void muneco6();
  13. void muneco7();
  14.  
  15. int main(int argc, char *argv[])
  16. {
  17.     char palabras[25][20] = {"real murcia", "universo", "pesadilla", "programacion", "juegos olimpicos",
  18.                              "television", "videojuegos", "telefono", "ignorancia", "euforia",
  19.                              "arquitecto", "entusiasmo", "cuestionar", "orhuela", "drogueria",
  20.                              "murcielago", "echevarria", "menorquina", "degustacion", "ayuntamiento",
  21.                              "subdirectora", "automoviles", "julia roberts", "ultraligero", "albaricoques"};
  22.  
  23.     int hora = time(NULL);
  24.     int aleatorio;
  25.     int barra_baja, a, oculta;
  26.    
  27.     srand(hora);
  28.    
  29.     do{
  30.         aleatorio = rand()%25;
  31.    
  32.         strcpy(oculta, palabras[aleatorio]);
  33.                
  34.         printf ("%s", oculta);
  35.        
  36.         //1. Estadisticas        
  37.         printf ("\n\t\t\t\t    AHORCADO");
  38.         printf ("\n\t\t\t\t   ----------");
  39.         printf ("\n\n\t\t\t\t PJ  PG  PP  TJ");
  40.         printf ("\n\t\t\t\t 0   0   0   0 ");
  41.        
  42.         void muneco7();
  43.        
  44.         //2. Inicia el juego
  45.         printf ("\n\n %cCUAL ES LA PALABRA OCULTA?\n\n ", 168); //168: Ascii para "¿"
  46.        
  47.         //2.1. Genera el num de barras correspondiente a la palabra
  48.         for(barra_baja = 1; barra_baja <= strlen(oculta); barra_baja++){
  49.               printf ("-");
  50.              
  51.               /*for(){
  52.                    
  53.                     }*/
  54.                    
  55.               };
  56.        
  57.         printf ("\n\n\n\n");
  58.        
  59.         system ("PAUSE");
  60.        
  61.         }while(1);
  62.  
  63.   system("PAUSE"); 
  64.   return 0;
  65. }
  #9 (permalink)  
Antiguo 08/03/2014, 10:19
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

por cierto, es curioso lo de la variable "a", la cual declare para unas pruebas con un for, pero como veis ya no la uso en el cogido, pero la tengo que dejar por que cuando la borro el programa me falla........... sin que la variable sea usada en el codigo, jaja estoy muy verde en programacion, pero no tanto para saber que si no uso la variable no deberia generar problemas y menos como este, es cuanto menos raro.

De echo, la variable "oculta" que queria declararla de tipo char no puedo quitarla de esa linea nº25 por que cuando lo hago, me vuelve el mismo fallo, el programa falla.

Es raro o no se me escapa algo?
  #10 (permalink)  
Antiguo 08/03/2014, 10:44
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Piedra, Papel y Tijera

dale a rebuild, eso es por el archivo object a lo mejor, sino ve a la carpeta y borra todo lo que no sea el archivo de proyecto y los códigos.
  #11 (permalink)  
Antiguo 08/03/2014, 10:46
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 3 meses
Puntos: 29
Respuesta: Piedra, Papel y Tijera

Tu codigo te funciona? Porque en la funcion strcpy pasas una variable oculta de tipo int cuando debe de ser char *

Edit: Y otra cosa, cuando declaras las palabras yo habria hecho algo asi:

Código C++:
Ver original
  1. char *palabras[]={""...}

Es un array que contiene punteros hacia char que son otro array de char.
  #12 (permalink)  
Antiguo 08/03/2014, 11:02
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Piedra, Papel y Tijera

voy a probar esto ultimo que me comentas patilanz, muchas gracias pixa

Y tambien a vangodp, aunque no se lo que es el rebuild, jeje lo dicho, muy verde, jeje. Ahora mismo en la carpeta donde guardo este trabajo contiene 5 ficheros:

  #13 (permalink)  
Antiguo 08/03/2014, 21:59
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Piedra, Papel y Tijera

El que termina en .o puede ser el que te da problemas.
Todos ellos se generan menos el que pone dev en el icono, que es tipo dev c++ project....
Si no estas seguro, no los borres simplemente quitar de la carpeta.
El proyecto digamos que es la configuración de donde están las carpetas, que tipo de aplicación es, opciones para el compilador....
El .c es el código.
El .o es el archivo objeto que contiene el código maquina.
El makefile gestiona las dependencias entre los archivos.
El exe se genera cada vez que lo compilas.
Los archivos que no debes borrar son 2 en este caso, el .c y el dev project, los demás se vuelven a reconstruir cada vez que das a construir, compilar o como llames XDDD.
Deberías quitar en el windows la opción para que no este a prueba de noobs, para que puedas ver las extensiones de los archivos XDD

Última edición por vangodp; 08/03/2014 a las 22:04

Etiquetas: funcion, int, papel
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 15:16.