[SOLUCIONADO] Generar nombre aleatorio.

Iniciado por Yugget, 8 Marzo 2014, 13:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Yugget

Hola, muy buenas.

Muchas gracias, por vuestra ayuda.
Ya está todo solucionado, he echo lo de los if y ya todo me funciona correctamente.

Muchas gracias por vuestra ayuda.

Un cordial saludo.

Yoel Alejandro

Hola a todos. Creo que al programilla le falta la parte donde decide quién ganó (o quizá yo no la vi, sorry). Como un switch() anidado con las nueve posibilidades sería muy tedioso es más cómodo definir una matriz de 3x3, donde la opción 1 representa tijera, 2 la piedra, 3 el papel. En la posición (i,j) de la matriz se pone:

  • 1, si i le gana a j
  • -1, si i pierde ante j
  • 0, si son iguales y hay empate

Así por ejemplo, para el caso de la tijera, como empata consigo misma, pierde ante piedra y gana ante papel, la primera fila de la matriz debe ser {0, -1, 1}. El programa inspecciona el elemento de la matriz, y ahí sabe si usted ganó, perdió o empató.

En la primera parte del programa el usuario elige tijera, piedra o papel pulsando '1', '2' ó '3' (más cómodo que escribir el nombre completo), y este valor entero se deposita en la variable human_op. Luego, elige la máquina al azar usando rand() y srand(), y su valor se deposita en machine_op. Como ya se explicó, el valor de A[human_op - 1][machine_op - 1] dará la respuesta.

Al final, te pregunta si quieres jugar de nuevo y así sucesivamente. Confieso que yo mismo me puse a jugar contra la máquina y casi me envicio, jajaja  >:D.

Un detalle, la función clear_screen() está codificada para Windows y para Linux. En Windows debes dejar la línea system("cls") y comentariar  system("clear"), mientras en Linux se hace al revés. La versión que pongo aquí está para Windows:

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <time.h>

void clear_screen( void );

using namespace std;

int main () {
   
    string human, machine;
    int human_op = 0;        /* 1: tijera, 2: piedra, 3: papel */
    int machine_op = 0;
    char next;                /* next == 's' indica que se quiere seguir jugando */
   
    /* Declarar matriz de casos:
     *
     * 1: tijera, 2: piedra, 3: papel
     *
     * El elemento (i,j) vale:
     *   1 si "i le gana a j"
     *  -1 si "i pierde ante j"
     *   0 si hay empate
     */
    int A[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
   
    /* inicializar semilla */
    srand( time(NULL) );
   
    do {
   
        /* El humano elige */
        do {
            clear_screen( );        /* borrar pantalla */
            cout << "Juego piedra, papel o tijera ..." << endl << endl
                << "1: tijera" << endl
                << "2: piedra" << endl
                << "3: papel" << endl << endl
                << "elige: ";
            cin >> human_op;
        } while ( human_op < 1 || human_op > 3 );
        switch ( human_op ) {
            case 1:
                human = "tijera";
                break;
            case 2:
                human = "piedra";
                break;
            case 3:
                human = "papel";
                break;
        }
       
        /* La maquina elige */
        machine_op = rand( ) % 3 + 1;
        switch ( machine_op ) {
            case 1:
                machine = "tijera";
                break;
            case 2:
                machine = "piedra";
                break;
            case 3:
                machine = "papel";
                break;
        }
       
        /* Ahora se decide quien gana */
        cout << endl << "Usted elige: " << human << endl
            << "La maquina elige: " << machine << endl << endl
            << "... ";
        switch ( A[human_op - 1][machine_op - 1] ) {
            case 1:
                cout << "Usted gana !!!" << endl;
                break;
            case -1:
                cout << "Ups, usted pierde" << endl;
                break;
            case 0:
                cout << "Empate" << endl;
                break;
        }
       
        /* Seguir jugando ? */
        cout << "Seguir jugando s/n? ";
        cin >> next;
    } while ( next == 's' );
}

/* Borra la pantalla */
void clear_screen( void ) {
   
    /* para Windows */
    system( "cls" );
    /* para Linux */
    //system( "clear" );
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan


* Te faltó el return de main.

*  Es  más propio de C++ usar <ctime> en lugar de  <time.h> ...pijo que es uno.

* Hecho de menos unos contadores de las partidas ganadas, empatadas y perdidas.

Por lo demás, lo has bordado con la matriz.


¡¡¡¡ Saluditos! ..... !!!!




BlackM4ster

Cuando he leído el título, pensaba que hablabas sobre algo así:
http://zonaisc.com/web/?q=node/16
- Pásate por mi web -
https://codeisc.com

Yoel Alejandro

Leo, ¿En serio se me olvidó el return de main()? Jaja, pero que burdo, sorry  :-[ !!!

Pero de veras que el programa está divertido, provoca fajarse a jugar contra la máquina, jaja.
Bueno, con las modificaciones que propones (contador de ganadas, perdidas y empatadas), quedaría:

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <ctime>

void clear_screen( void );

using namespace std;

int main () {
   
   string human, machine;
   int human_op = 0;      /* 1: tijera, 2: piedra, 3: papel */
   int machine_op = 0;
   char next;            /* next == 's' indica que se quiere seguir jugando */
   int ganadas, perdidas, empates;
   
   /* Declarar matriz de casos:
    *
    * 1: tijera, 2: piedra, 3: papel
    *
    * El elemento (i,j) vale:
    *   1 si "i le gana a j"
    *  -1 si "i pierde ante j"
    *   0 si hay empate
    */
   int A[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
   
   /* inicializar semilla */
   srand( time(NULL) );
   ganadas = perdidas = empates = 0;
   
   do {
   
      /* El humano elige */
      do {
         clear_screen( );      /* borrar pantalla */
         cout << "Juego piedra, papel o tijera ..." << endl << endl
            << "1: tijera" << endl
            << "2: piedra" << endl
            << "3: papel" << endl << endl
            << "elige: ";
         cin >> human_op;
      } while ( human_op < 1 || human_op > 3 );
      switch ( human_op ) {
         case 1:
            human = "tijera";
            break;
         case 2:
            human = "piedra";
            break;
         case 3:
            human = "papel";
            break;
      }
     
      /* La máquina elige */
      machine_op = rand( ) % 3 + 1;
      switch ( machine_op ) {
         case 1:
            machine = "tijera";
            break;
         case 2:
            machine = "piedra";
            break;
         case 3:
            machine = "papel";
            break;
      }
     
      /* Ahora se decide quien gana */
      cout << endl << "Usted elige: " << human << endl
         << "La maquina elige: " << machine << endl << endl
         << "... ";
      switch ( A[human_op - 1][machine_op - 1] ) {
         case 1:
            cout << "Usted gana !!!" << endl;
            ganadas++;
            break;
         case -1:
            cout << "Ups, usted pierde" << endl;
            perdidas++;
            break;
         case 0:
            cout << "Empate" << endl;
            empates++;
            break;
      }
     
      /* Seguir jugando ? */
      cout << ganadas << " ganadas, " << perdidas << " perdidas, "
         << empates << " empates" << endl << endl;
      cout << "Seguir jugando s/n? ";
      cin >> next;
   } while ( next == 's' );
   
   return 0;
}

/* Borra la pantalla */
void clear_screen( void ) {
   
   /* para Windows */
   //system( "cls" );
   /* para Linux */
   system( "clear" );
}


Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)