Hola buenas a todos.
Tengo un pequeño problema con este ejercicio de C++.
Debo crear el juego de piedra, papel o tijeras utilizando funciones.
Estoy cometiendo un error en la función correspondiente a determinar el ganador (char f_determina_ganador") y es que todos los valores de la variable p_pc marcan error y Visual Studio por cada uno me avisa lo siguiente:
error:E0137 "la expresión debe ser un valor L modificable"
He intentado comprender el error con las referencias de Microsoft usando el código de error, pero no logro entender la explicación.
¿Me podrían dar alguna pista para ubicarme en donde estoy fallando?
Aquí les dejo el código.
De antemano ¡Muchas gracias!
#include <iostream>
#include <ctime>
#include <cstdlib>
#include<stdlib.h>
#include<time.h>
using namespace std;
//Prototipado de las funciones o firma de las funciones
int f_opcion_de_la_pc();
void f_muestra_opciones_menu();
char f_determina_ganador(int pp_pc, int pp_usuario);
void f_muestra_ganador(char p_ganador);
int main() {
int opcion_del_usuario;
int opcion_de_la_pc;
cout << " \t Bienvenidos al juego Piedra, papel y Tijera" << endl << endl;
f_muestra_opciones_menu();
/* Captura la opcion seleccionada por el usuario.
Valida que la opcion sea valida. Si es una entre 1 y 3, llama a la funcion
f_opcion_de_la_pc() captura el resultado y pasalo como parametro junto con la
opcion tomada por el usuario a la funcion f_determina_ganador.
Si el usuario elige la opcion 4, termina el programa.
*/
cin >> opcion_del_usuario;
while (opcion_del_usuario < 1 or opcion_del_usuario > 4)
{
cout << "Esa opcion no esta disponible, intentelo otra vez."<<endl;
f_muestra_opciones_menu();
cin >> opcion_del_usuario;
}
opcion_de_la_pc = f_opcion_de_la_pc();
cout << f_determina_ganador(opcion_de_la_pc, opcion_del_usuario);
/* En la función f_muestra_ganador captura ganador que devuelve
la funcion f_determina_ganador(int p_pc, int p_usuario)
Muestra el mensaje: "El ganador es: " + ganador.
Como un plus, pregunta si quiere seguir jugando y continua el juego
*/
}
//Definicion de las funciones
void f_muestra_opciones_menu() {
cout << "\t 1 - Piedra" << endl;
cout << "\t 2 - Papel" << endl;
cout << "\t 3 - Tijera" << endl;
cout << "\t 4 - Salir" << endl;
cout << "Elige tu opcion: ";
}
//Implementar aqui la funcion f_opcion_de_la_pc()
//Este funcion generara un numero aleatorio entre 1 y 3 y lo devolvera
int f_opcion_de_la_pc()
{
srand(time(NULL));
int num;
num = 1 + rand() % (3 + 1 - 1);
return num;
}
/* implementa aqui la funcion f_determina_ganador(int p_pc, int p_usuario)
Esta funcion debe contener la logica para determinar cual de los dos ha ganado.
Las reglas son: Piedra vence a tijera; Tijera vence a Papel; Papel vence Piedra.
Devuelve un tipo de datos char que identifica al ganador: "Computadora" o "Jugador".
*/
char f_determina_ganador(int p_pc, int p_usuario)
{
string ganador;
if (p_pc = 1 && p_usuario = 2)
ganador = "Jugador";
else if (p_pc = 1 && p_usuario = 3)
ganador = "Computadora";
else if (p_pc = 2 && p_usuario = 1)
ganador = "Computadora";
else if (p_pc = 2 && p_usuario = 3)
ganador = "Jugador";
else if (p_pc = 3 && p_usuario = 1)
ganador = "Jugador";
else if (p_pc = 3 && p_usuario = 2)
ganador = "Computadora";
else
ganador = "Empate";
}
/* Implementa aquí la función f_muestra_ganador la misma toma como parámetro un tipo de datos char
con el identificando el ganador. Debe mostrar la descripción indicando el ganador
*/
error:E0137 "la expresión debe ser un valor L modificable"
(...)
¿Me podrían dar alguna pista para ubicarme en donde estoy fallando?
Quisiera mencionar un par de detalles:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include<stdlib.h>
#include<time.h>
Evitá el uso de las mismas librerías de C++ con C que definan lo mismo...
using namespace std;
Usar el namespace std de manera global tengo entendido que suele ser mala práctica, siempre es mejor considerar escribir la función con su namespace completo, por ejemplo:
std::cout << "Hola" << std::endl
Siempre recordá el uso del nombre de las variables en C++ debe tener notación húngara.
Ahora sí con respecto a tu función:
/* implementa aqui la funcion f_determina_ganador(int p_pc, int p_usuario)
Esta funcion debe contener la logica para determinar cual de los dos ha ganado.
Las reglas son: Piedra vence a tijera; Tijera vence a Papel; Papel vence Piedra.
Devuelve un tipo de datos char que identifica al ganador: "Computadora" o "Jugador".
*/
char f_determina_ganador(int p_pc, int p_usuario)
{
string ganador;
if (p_pc = 1 && p_usuario = 2)
ganador = "Jugador";
else if (p_pc = 1 && p_usuario = 3)
ganador = "Computadora";
else if (p_pc = 2 && p_usuario = 1)
ganador = "Computadora";
else if (p_pc = 2 && p_usuario = 3)
ganador = "Jugador";
else if (p_pc = 3 && p_usuario = 1)
ganador = "Jugador";
else if (p_pc = 3 && p_usuario = 2)
ganador = "Computadora";
else
ganador = "Empate";
}
Recordá que char por si solo es simplemente un número entero con signo de 1 byte y no un string, aparte en cada if estás asignando los valores en lugar de compararlos (un signo igual es asignación, mientras que dos signos iguales es comparación).
enum
{
WINNER_TYPE_PLAYER,
WINNER_TYPE_COMPUTER,
WINNER_TYPE_TIE,
};
enum
{
OPTION_TYPE_STONE = 1,
OPTION_TYPE_PAPER,
OPTION_TYPE_SCISSOR,
OPTION_TYPE_EXIT,
};
char f_determina_ganador(int p_pc, int p_usuario)
{
char cWinner;
if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_PAPER)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_SCISSOR)
cWinner = WINNER_TYPE_COMPUTER;
else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_STONE)
cWinner = WINNER_TYPE_COMPUTER;
else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_SCISSOR)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_STONE)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_PAPER)
cWinner = WINNER_TYPE_COMPUTER;
else
cWinner = WINNER_TYPE_TIE;
return cWinner;
}
Con respecto a la función
f_muestra_ganador que te falta se puede usar un simple switch:
/* Implementa aquí la función f_muestra_ganador la misma toma como parámetro un tipo de datos char
con el identificando el ganador. Debe mostrar la descripción indicando el ganador
*/
void f_muestra_ganador(char p_ganador)
{
switch(p_ganador)
{
case WINNER_TYPE_PLAYER:
std::cout << "El ganador es: Jugador" << std::endl;
break;
case WINNER_TYPE_COMPUTER:
std::cout << "El ganador es: Computer" << std::endl;
break;
case WINNER_TYPE_TIE:
std::cout << "El ganador es: Empate" << std::endl;
break;
}
}
Te dejo el código completo que me funcionó a mi en Linux:
(https://i.imgur.com/ylyU9EN.png)
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <random>
#include <string>
//Prototipado de las funciones o firma de las funciones
int f_opcion_de_la_pc();
void f_muestra_opciones_menu();
char f_determina_ganador(int pp_pc, int pp_usuario);
void f_muestra_ganador(char p_ganador);
enum
{
WINNER_TYPE_PLAYER,
WINNER_TYPE_COMPUTER,
WINNER_TYPE_TIE,
};
enum
{
OPTION_TYPE_STONE = 1,
OPTION_TYPE_PAPER,
OPTION_TYPE_SCISSOR,
OPTION_TYPE_EXIT,
};
int main() {
int iUserOption;
int iPCOption;
std::cout << " \t Bienvenidos al juego Piedra, papel y Tijera" << std::endl << std::endl;
f_muestra_opciones_menu();
/* Captura la opcion seleccionada por el usuario.
Valida que la opcion sea valida. Si es una entre 1 y 3, llama a la funcion
f_iPCOption() captura el resultado y pasalo como parametro junto con la
opcion tomada por el usuario a la funcion f_determina_ganador.
Si el usuario elige la opcion 4, termina el programa.
*/
std::cin >> iUserOption;
if (iUserOption == OPTION_TYPE_EXIT)
return 0;
while (iUserOption < OPTION_TYPE_STONE || iUserOption > OPTION_TYPE_EXIT)
{
std::cout << "Esa opcion no esta disponible, intentelo otra vez." << std::endl;
f_muestra_opciones_menu();
std::cin >> iUserOption;
if (iUserOption == OPTION_TYPE_EXIT)
return 0;
}
iPCOption = f_opcion_de_la_pc();
/* En la función f_muestra_ganador captura ganador que devuelve
la funcion f_determina_ganador(int p_pc, int p_usuario)
Muestra el mensaje: "El ganador es: " + ganador.
Como un plus, pregunta si quiere seguir jugando y continua el juego
*/
f_muestra_ganador(f_determina_ganador(iPCOption, iUserOption));
return 0;
}
//Definicion de las funciones
void f_muestra_opciones_menu() {
std::cout << "\t 1 - Piedra" << std::endl;
std::cout << "\t 2 - Papel" << std::endl;
std::cout << "\t 3 - Tijera" << std::endl;
std::cout << "\t 4 - Salir" << std::endl;
std::cout << "Elige tu opcion: ";
}
//Implementar aqui la funcion f_opcion_de_la_pc()
//Este funcion generara un numero aleatorio entre 1 y 3 y lo devolvera
int f_opcion_de_la_pc()
{
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1,3);
return distribution(generator);
}
/* implementa aqui la funcion f_determina_ganador(int p_pc, int p_usuario)
Esta funcion debe contener la logica para determinar cual de los dos ha ganado.
Las reglas son: Piedra vence a tijera; Tijera vence a Papel; Papel vence Piedra.
Devuelve un tipo de datos char que identifica al ganador: "Computadora" o "Jugador".
*/
char f_determina_ganador(int p_pc, int p_usuario)
{
char cWinner;
if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_PAPER)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_SCISSOR)
cWinner = WINNER_TYPE_COMPUTER;
else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_STONE)
cWinner = WINNER_TYPE_COMPUTER;
else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_SCISSOR)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_STONE)
cWinner = WINNER_TYPE_PLAYER;
else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_PAPER)
cWinner = WINNER_TYPE_COMPUTER;
else
cWinner = WINNER_TYPE_TIE;
return cWinner;
}
/* Implementa aquí la función f_muestra_ganador la misma toma como parámetro un tipo de datos char
con el identificando el ganador. Debe mostrar la descripción indicando el ganador
*/
void f_muestra_ganador(char p_ganador)
{
switch(p_ganador)
{
case WINNER_TYPE_PLAYER:
std::cout << "El ganador es: Jugador" << std::endl;
break;
case WINNER_TYPE_COMPUTER:
std::cout << "El ganador es: Computer" << std::endl;
break;
case WINNER_TYPE_TIE:
std::cout << "El ganador es: Empate" << std::endl;
break;
}
}
B#