elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en código para Piedra, Papel, o Tijeras (C++)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error en código para Piedra, Papel, o Tijeras (C++)  (Leído 3,185 veces)
xtremeair2

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Error en código para Piedra, Papel, o Tijeras (C++)
« en: 24 Enero 2023, 02:45 am »

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!


Código:
#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
*/



En línea

BloodSharp


Desconectado Desconectado

Mensajes: 812


¡ Hiperfoco !


Ver Perfil WWW
Re: Error en código para Piedra, Papel, o Tijeras (C++)
« Respuesta #1 en: 24 Enero 2023, 04:45 am »

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:

Código
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include<stdlib.h>
  5. #include<time.h>

Evitá el uso de las mismas librerías de C++ con C que definan lo mismo...

Código
  1. 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:
Código
  1. 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:
Código
  1. /* implementa aqui la funcion f_determina_ganador(int p_pc, int p_usuario)
  2.    Esta funcion debe contener la logica para determinar cual de los dos ha ganado.
  3.    Las reglas son: Piedra vence a tijera; Tijera vence a Papel; Papel vence Piedra.
  4.    Devuelve un tipo de datos char que identifica al ganador: "Computadora" o "Jugador".
  5. */
  6. char f_determina_ganador(int p_pc, int p_usuario)
  7. {
  8.    string ganador;
  9.  
  10.    if (p_pc = 1 && p_usuario = 2)
  11.        ganador = "Jugador";
  12.    else if (p_pc = 1 && p_usuario = 3)
  13.        ganador = "Computadora";
  14.    else if (p_pc = 2 && p_usuario = 1)
  15.        ganador = "Computadora";
  16.    else if (p_pc = 2 && p_usuario = 3)
  17.        ganador = "Jugador";
  18.    else if (p_pc = 3 && p_usuario = 1)
  19.        ganador = "Jugador";
  20.    else if (p_pc = 3 && p_usuario = 2)
  21.        ganador = "Computadora";
  22.    else
  23.        ganador = "Empate";  
  24. }

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).

Código
  1. enum
  2. {
  3.    WINNER_TYPE_PLAYER,
  4.    WINNER_TYPE_COMPUTER,
  5.    WINNER_TYPE_TIE,
  6. };
  7.  
  8. enum
  9. {
  10.    OPTION_TYPE_STONE = 1,
  11.    OPTION_TYPE_PAPER,
  12.    OPTION_TYPE_SCISSOR,
  13.    OPTION_TYPE_EXIT,
  14. };
  15.  
  16. char f_determina_ganador(int p_pc, int p_usuario)
  17. {
  18.    char cWinner;
  19.  
  20.    if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_PAPER)
  21.        cWinner = WINNER_TYPE_PLAYER;
  22.    else if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_SCISSOR)
  23.        cWinner = WINNER_TYPE_COMPUTER;
  24.    else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_STONE)
  25.        cWinner = WINNER_TYPE_COMPUTER;
  26.    else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_SCISSOR)
  27.        cWinner = WINNER_TYPE_PLAYER;
  28.    else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_STONE)
  29.        cWinner = WINNER_TYPE_PLAYER;
  30.    else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_PAPER)
  31.        cWinner = WINNER_TYPE_COMPUTER;
  32.    else
  33.        cWinner = WINNER_TYPE_TIE;
  34.  
  35.    return cWinner;    
  36. }

Con respecto a la función f_muestra_ganador que te falta se puede usar un simple switch:

Código
  1. /* Implementa aquí la función f_muestra_ganador la misma toma como parámetro un tipo de datos char
  2.    con el identificando el ganador. Debe mostrar la descripción indicando el ganador
  3. */
  4. void f_muestra_ganador(char p_ganador)
  5. {
  6.    switch(p_ganador)
  7.    {
  8.     case WINNER_TYPE_PLAYER:
  9.        std::cout << "El ganador es: Jugador" << std::endl;
  10.        break;
  11.     case WINNER_TYPE_COMPUTER:
  12.        std::cout << "El ganador es: Computer" << std::endl;
  13.        break;
  14.     case WINNER_TYPE_TIE:
  15.        std::cout << "El ganador es: Empate" << std::endl;
  16.        break;
  17.    }
  18. }

Te dejo el código completo que me funcionó a mi en Linux:



Código
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include <iostream>
  4. #include <random>
  5. #include <string>
  6.  
  7. //Prototipado de las funciones o firma de las funciones
  8. int f_opcion_de_la_pc();
  9. void f_muestra_opciones_menu();
  10. char f_determina_ganador(int pp_pc, int pp_usuario);
  11. void f_muestra_ganador(char p_ganador);
  12.  
  13. enum
  14. {
  15.    WINNER_TYPE_PLAYER,
  16.    WINNER_TYPE_COMPUTER,
  17.    WINNER_TYPE_TIE,
  18. };
  19.  
  20. enum
  21. {
  22.    OPTION_TYPE_STONE = 1,
  23.    OPTION_TYPE_PAPER,
  24.    OPTION_TYPE_SCISSOR,
  25.    OPTION_TYPE_EXIT,
  26. };
  27.  
  28. int main() {
  29.  
  30.    int iUserOption;
  31.    int iPCOption;
  32.  
  33.    std::cout << " \t Bienvenidos al juego Piedra, papel y Tijera" << std::endl << std::endl;
  34.    f_muestra_opciones_menu();
  35.  
  36.    /*  Captura la opcion seleccionada por el usuario.
  37.     Valida que la opcion sea valida. Si es una entre 1 y 3, llama a la funcion
  38.     f_iPCOption() captura el resultado y pasalo como parametro junto con la
  39.     opcion tomada por el usuario a la funcion f_determina_ganador.
  40.     Si el usuario elige la opcion 4, termina el programa.
  41. */
  42.  
  43.    std::cin >> iUserOption;
  44.    if (iUserOption == OPTION_TYPE_EXIT)
  45.        return 0;
  46.  
  47.    while (iUserOption < OPTION_TYPE_STONE || iUserOption > OPTION_TYPE_EXIT)
  48.    {
  49.        std::cout << "Esa opcion no esta disponible, intentelo otra vez." << std::endl;
  50.  
  51.        f_muestra_opciones_menu();
  52.        std::cin >> iUserOption;
  53.        if (iUserOption == OPTION_TYPE_EXIT)
  54.            return 0;
  55.    }
  56.  
  57.    iPCOption = f_opcion_de_la_pc();
  58.  
  59.    /* En la función f_muestra_ganador captura ganador que devuelve
  60.        la funcion f_determina_ganador(int p_pc, int p_usuario)
  61.        Muestra el mensaje: "El ganador es: " + ganador.
  62.        Como un plus, pregunta si quiere seguir jugando y continua el juego
  63.     */
  64.    f_muestra_ganador(f_determina_ganador(iPCOption, iUserOption));
  65.  
  66.    return 0;
  67. }
  68.  
  69. //Definicion de las funciones
  70. void f_muestra_opciones_menu() {
  71.    std::cout << "\t 1 - Piedra" << std::endl;
  72.    std::cout << "\t 2 - Papel" << std::endl;
  73.    std::cout << "\t 3 - Tijera" << std::endl;
  74.    std::cout << "\t 4 - Salir" << std::endl;
  75.  
  76.    std::cout << "Elige tu opcion: ";
  77. }
  78.  
  79. //Implementar aqui la funcion f_opcion_de_la_pc()
  80. //Este funcion generara un numero aleatorio entre 1 y 3 y lo devolvera
  81. int f_opcion_de_la_pc()
  82. {
  83.    std::default_random_engine generator;
  84.    std::uniform_int_distribution<int> distribution(1,3);
  85.  
  86.    return distribution(generator);
  87. }
  88.  
  89. /* implementa aqui la funcion f_determina_ganador(int p_pc, int p_usuario)
  90.    Esta funcion debe contener la logica para determinar cual de los dos ha ganado.
  91.    Las reglas son: Piedra vence a tijera; Tijera vence a Papel; Papel vence Piedra.
  92.    Devuelve un tipo de datos char que identifica al ganador: "Computadora" o "Jugador".
  93. */
  94. char f_determina_ganador(int p_pc, int p_usuario)
  95. {
  96.    char cWinner;
  97.  
  98.    if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_PAPER)
  99.        cWinner = WINNER_TYPE_PLAYER;
  100.    else if (p_pc == OPTION_TYPE_STONE && p_usuario == OPTION_TYPE_SCISSOR)
  101.        cWinner = WINNER_TYPE_COMPUTER;
  102.    else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_STONE)
  103.        cWinner = WINNER_TYPE_COMPUTER;
  104.    else if (p_pc == OPTION_TYPE_PAPER && p_usuario == OPTION_TYPE_SCISSOR)
  105.        cWinner = WINNER_TYPE_PLAYER;
  106.    else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_STONE)
  107.        cWinner = WINNER_TYPE_PLAYER;
  108.    else if (p_pc == OPTION_TYPE_SCISSOR && p_usuario == OPTION_TYPE_PAPER)
  109.        cWinner = WINNER_TYPE_COMPUTER;
  110.    else
  111.        cWinner = WINNER_TYPE_TIE;
  112.  
  113.    return cWinner;    
  114. }
  115.  
  116.  
  117. /* Implementa aquí la función f_muestra_ganador la misma toma como parámetro un tipo de datos char
  118.    con el identificando el ganador. Debe mostrar la descripción indicando el ganador
  119. */
  120. void f_muestra_ganador(char p_ganador)
  121. {
  122.    switch(p_ganador)
  123.    {
  124.     case WINNER_TYPE_PLAYER:
  125.        std::cout << "El ganador es: Jugador" << std::endl;
  126.        break;
  127.     case WINNER_TYPE_COMPUTER:
  128.        std::cout << "El ganador es: Computer" << std::endl;
  129.        break;
  130.     case WINNER_TYPE_TIE:
  131.        std::cout << "El ganador es: Empate" << std::endl;
  132.        break;
  133.    }
  134. }


B#


« Última modificación: 24 Enero 2023, 04:55 am por BloodSharp » En línea



RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Error en código para Piedra, Papel, o Tijeras (C++)
« Respuesta #2 en: 24 Enero 2023, 22:28 pm »

Siempre recordá el uso del nombre de las variables en C++ debe tener notación húngara.

 :o Para nada; de hecho es más bien al contrario. No sólo no es necesario usar la notación húngara sino que prácticamente nadie lo hace. Se usaba dentro de Microsoft, y a veces por consistencia al programar con la API de Windows, pero nada más. Su uso jamás estuvo extendido fuera de ese ámbito, y es casi universalmente rechazada, motivo de burlas y abiertamente desaconsejada y criticada en el propio comité de C++ desde hace años. Incluso dentro de Microsoft ha quedado prácticamente en desuso en la actualidad.
En línea

xtremeair2

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Error en código para Piedra, Papel, o Tijeras (C++)
« Respuesta #3 en: 24 Enero 2023, 23:53 pm »


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).


Más claro imposible.
Con esto fue suficiente para resolver el problema.

Muchas gracias por la dedicada respuesta!!! Y tomaré en cuenta las recomendaciones para futuras tareas en C++  ;D

Un saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
piedra papel tijera....en c++
Programación C/C++
flony 6 14,500 Último mensaje 9 Agosto 2010, 05:24 am
por Beakman
Piedra Papel Tijeras [JAVA]
Java
overxfl0w13 2 12,225 Último mensaje 9 Noviembre 2012, 15:33 pm
por overxfl0w13
[Resuelto] Piedra, papel, tijeras y algo más... en javascript
Desarrollo Web
HelThunk 8 5,789 Último mensaje 16 Abril 2016, 14:42 pm
por MinusFour
Piedra papel o tijeras
Programación C/C++
JaviCasti 1 4,907 Último mensaje 11 Enero 2017, 19:29 pm
por AlbertoBSD
Roca, papel y tijeras-Problema [C]
Programación C/C++
Darklexis312 1 3,161 Último mensaje 9 Abril 2018, 12:24 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines