Hola, muy buenas.
Estoy recién aprendiendo c++, y tengo un problema con un mini-juego por así llamarlo.
El problema es que no sé cómo hacer que se genere un nombre aleatorio.
Por ejemplo tengo: Tomás,Antonio,Juan y quiero que cada vez que inicie el programa se muestre uno de esos nombres aleatoriamente... estoy probando con rand() pero no me da resultado y estaba buscando información pero no logro encontrarlo... y si ustedes me pudieran echar una mano lo agradecería.
El código:
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
string num;
cout << "Introduce un numero: " << endl;
cin >> num;
char *a[] = { "tijeras", "piedra", "papel" };
if(num == "tijeras")
{
cout << "tijeritas" << endl;
}
else if(num == "piedra")
{
cout << "piedrita" << endl;
}
else if(num == "papel")
{
cout << "papelin" << endl;
}
else
{
cout << "No es correcto." << endl;
}
cout << rand(a) << endl;
getch();
return 0;
}
Como se abran dado cuenta es un juego de piedra papel o tijeras... jeje
Muchas gracias y disculpen las molestias.
Un cordial saludo.
Documentación de rand():
http://www.cplusplus.com/reference/cstdlib/rand/
A veces para saber como funciona algo es tan fácil como buscarlo.
Saludos
Hola, muy buenas.
Gracias por tu respuesta...
Estoy probando con esto:
int t1;
t1 = rand() % 10 + 1;
cout << t1 << endl;
Pero solo se muestra el numero 2...
Saludos.
Tienes que inicializar una semilla para que te genere números aleatorios con srand() (http://www.cplusplus.com/reference/cstdlib/srand/).
Código cogido directamente de la página web que te he pasado:
/* initialize random seed: */
srand (time(NULL));
/* generate secret number between 1 and 10: */
iSecret = rand() % 10 + 1;
Rand genera un número pseudoaleatorio. Tienes que establecerle en cada programa, una semilla de la cual, sacará los números.
El comando es:
srand();
Normalmente, la semilla se le pone según la hora.
#include <ctime>
int main(){
srand(time(0));
}
Muchas gracias, y disculpen mi ignorancia ha sido culpa mía no poner eso... pensé que no hacía falta...
Ahora ya todo va bien pero... ahora quiero que me lo elija entre tres variables:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
string num;
string texto;
string texto1;
string texto2;
int t1;
cout << "Introduce un numero: " << endl;
cin >> num;
if(num == "tijeras")
{
cout << "tijeritas" << endl;
}
else if(num == "piedra")
{
cout << "piedrita" << endl;
}
else if(num == "papel")
{
cout << "papelin" << endl;
}
else
{
cout << "No es correcto." << endl;
}
texto = "tijeras";
texto1 = "piedra";
texto2 = "papel";
srand(time(0));
t1 = rand() % texto + texto1;
getch();
return 0;
}
Un cordial saludo.
Tienes varias opciones. Te propongo 3:
En primer lugar, generas el número aleatorio entre 0 y 2. Luego...
- 1: Pones 3 IF-ELSE para cada valor
- 2: Mejor que la anterior: Haces un SWITCH, con 3 CASE
- 3: Guardas las string en un array (string arr[3];) y luego haces arr[num_aleatorio];
Por cierto, el srand solo hay que realizarlo UNA VEZ. Lo digo por si después haces un bucle y haces srand todo el rato...
Hola, muy buenas.
Gracias a todos por vuestra colaboración, ya está funcionando correctamente ahora solo tengo un problema... y es que se me muestra un número... que será el del case.
ivancea seguí más o menos tus instrucciones....
Código:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
string num;
int t1;
int resultado;
srand(time(0));
resultado = rand() % 3 + 1;
cout << "Introduzca piedra, papel o tijeras: " << endl;
cin >> num;
switch(resultado)
{
case 1:
cout << "Tijeras" << endl;
break;
case 2:
cout << "Piedra" << endl;
break;
case 3:
cout << "Papel" << endl;
break;
default:
cout << "Ha ocurrido un error..." << endl;
}
if(num == "tijeras")
{
cout << resultado << endl;
}
else if(num == "piedra")
{
cout << resultado << endl;
}
else if(num == "papel")
{
cout << resultado << endl;
}
else
{
cout << "No es correcto." << endl;
}
getch();
return 0;
}
Aquí una imagen del problema:
(http://i.imgur.com/wHK2OMZ.png)
He introducido: tijeras y me da de resultado: piedra < perfecto pero como pueden observar me sale abajo el número 2, si es otro resultado me sale otro número... según haciendo referencia al case opino.
amchacon, gracias lo tendré en cuenta.
Un cordial saludo.
[quote author=TomasinSG link=topic=410167.msg1925421#msg1925421 date=1394290846]
if(num == "tijeras")
{
cout << resultado << endl;
}
else if(num == "piedra")
{
cout << resultado << endl;
}
else if(num == "papel")
{
cout << resultado << endl;
}
}
[/quote]
Haces cout de "resultado" jiji
Hola, muy buenas.
¿Entonces cómo puedo imprimirlo?.
Por que he intentado cambiar la variable:
resultado = rand() % 3 + 1;
abajo del switch... pero me lanza al default...
Un cordial saludo.
Qué quieres imprimir? Quién ganó?
Hola muy buenas,
Osea yo ingreaso: tijeras, papel o piedra... y luego se genera un resultado que es: piedra, papel, o tijeras...
Eso es.. se muestra correctamente pero se muestra el número incognico del case...
Un cordial saludo.
No entiendes lo que hace tu código. Te he añadido un par de líneas de ayuda para que averigües dónde está tu fallo, aunque ya te lo hayan dicho...
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
string num;
int t1;
int resultado;
srand(time(0));
resultado = rand() % 3 + 1;
cout << "Introduzca piedra, papel o tijeras: " << endl;
cin >> num;
//Resultado aleatorio
switch(resultado)
{
case 1:
cout << "Tijeras" << endl;
break;
case 2:
cout << "Piedra" << endl;
break;
case 3:
cout << "Papel" << endl;
break;
default:
cout << "Ha ocurrido un error..." << endl;
}
//Resultados no aleatorios (escogido por el usuario)
if(num == "tijeras")
{
cout << resultado << endl;
}
else if(num == "piedra")
{
cout << resultado << endl;
}
else if(num == "papel")
{
cout << resultado << endl;
}
else
{
cout << "No es correcto." << endl;
}
getch();
return 0;
}
Hola, muy buenas.
Por mi parte no le veo ningún fallo, funciona todo correctamente solo que se muestra el número del case... seguramente por que muestro la variable resultado en un cout como me han dicho:
Haces cout de "resultado" jiji
Pero entonces cómo podría imprimirlo... estoy probando cambiando de estructura y demás pero sigue igual.
¿Podrían darme alguna otra pista por favor?.
Gracias y disculpe las molestias.
Un cordial saludo.
Imprimir el que? Explícate mejor, no soy el primero en preguntártelo ya...
Dejemos las cosas claras:
if(num == "tijeras")
{
cout << resultado << endl;
}
else if(num == "piedra")
{
cout << resultado << endl;
}
else if(num == "papel")
{
cout << resultado << endl;
}
else
{
cout << "No es correcto." << endl;
}
getch();
return 0;
}
Esa línea escribe el número del case, si "num" es una entrada válida (piedra, papel o tijera). Sinó, muestra el otro mensaje.
Esos if son absurdos. ¿Qué pretendías que hicieran?
Hola, muy buenas.
He echo esos if, para determinar los caracteres que han introducido en la variable num, osea que si en la variable escribo tijeras y es igual al texto del if se ejecute una sentencia, osea el resultado elejido al azar por el pc.
Y si lo escrito no es ninguno de esos if lo tomará como nulo.
Un cordial saludo.
Esque el resultado, es un numero del 1 al 3.
Quizás prefieras hacer 3 "IF" dentro de cada IF, para poner "Empate", "Derrota", "Victoria".
Hola muy buenas,
Eso también es verdad, de echo lo voy a probar...
Pero me gustaría antes saber una cosa a poder ser,
¿No hay alguna forma de poder hacer un case con letras?.
Osea en vez de ser así:
case 1
sea
case HOLA
Un cordial saludo.
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.
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:
#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" );
}
* 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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Cuando he leído el título, pensaba que hablabas sobre algo así:
http://zonaisc.com/web/?q=node/16
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:
#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" );
}