1

Estoy intentando que una función devuelva un string aleatorio de un array de strings pero se ve que no estoy pasándole los parámetros a la función de forma correcta. El problema está en el main.cpp

Este es mi código:

Player.h
#ifndef PLAYER_H
#define PLAYER_H
#include <string>

class Player{
public:
  Player(std::string name, int health, int damage);

      void setName(std::string name);
      std::string getName() const;

      void setHealth(int health);
      int getHealth() const;

      void setDamage(int damage);
      int getDamage() const;
  private:
   std::string name;
   int health;
   int damage;
 };  
  #endif /* JUGADOR_H */
Player.cpp
#include "Player.h"

Player::Player(std::string name, int health, int damage){
setName("default");
setHealth(100);
setDamage(30);
 }

void Player::setName(std::string name)
{
this->name = name;
}

void Player::setHealth(int health){

health = 100;
}

void Player::setDamage(int damage){

damage = 30;
}

std::string Player::getName() const{

return name;

}

int Player::getHealth() const{

return health;
}

int Player::getDamage() const{

return damage;

}
main.cpp
#include <cstdlib>
#include "Player.h"
#include "Monster.h"
#include <iostream>
#include <string>

int main(int argc, char** argv) {
std::string name;
std::cout <<"Hello! Write your name "<<std::endl;
getline(std::cin, name);
Player player(name, 100, 30);
std::cout <<"Welcome "<<player.getName();


std::string monsters[3] = {"Orc", "Troll", "Undead"};
srand(time(NULL));
int ranM = (rand() % 3); //random monster

Monster monster(std::string monsters[ranM], 50,15);
std::cout <<"Suddenly you encounter a"<<monster.getName();
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
JACK1ETO
  • 71
  • 5
  • Para futuras preguntas, por favor, procura poner un ejemplo **mínimo** y **completo** que repoduzca el problema... ¿Para qué pones la clase `Player` si no es para nada necesaria para reproducir el error? No se trata de poner todo el código que tengas... sino de elaborar un código mínimo que cualquiera pueda probar en su casa para reproducir el problema. Si esto no es posible al menos intenta reducir la cantidad de código al mínimo imprescindible – eferion Jun 14 '18 at 11:32
  • Tienes razón, simplemente lo pongo por si la alguien quiere comprobar que la implementación de la clase sea correcta o algo por el estilo, aún así intentaré ser mas conciso para el futuro. – JACK1ETO Jun 14 '18 at 11:42
  • Es que esa no debería ser nuestra responsabilidad sino la tuya. Tu quieres que te respondamos y el peaje a pagar es que elabores una pregunta en condiciones donde haya la menor cantidad de decorado posible para centrar la atención sobre lo que realmente importa. El hecho de que te esfuerces en crear un ejemplo mínimo te puede incluso permitir encontrar el problema por tus propios medios... y entonces aprenderás mucho más que publicando una pregunta en [es.so] – eferion Jun 14 '18 at 11:44
  • Y para evitar malentendidos, no te estoy hechando la bronca. Solo te informo sobre cómo debes actuar para captar la mayor atención posible en futuras preguntas – eferion Jun 14 '18 at 11:45

2 Answers2

3

Esta línea:

Monster monster(std::string monsters[ranM], 50,15);

Debería quedar así:

Monster monster(monsters[ranM], 50,15);

Solo es necesario indicar el tipo para declarar variables o para forzar conversiones y este caso no ocupa ninguno de los dos supuestos.

eferion
  • 49,291
  • 5
  • 30
  • 72
2

No uses rand.

Estás programando en C++, así que no insistas en utilizar utilidades de C; no uses rand pues no forma parte de la especificación de C++ y en consecuencia puede no ser portable y puede ofrecer resultados y rendimiento cuestionables. Por ello se está estudiando deprecarlo.

A partir del estándar C++11 el lenguaje C++ ofrece una completa librería de generación de números pseudoaleatorios que permite escoger la distribución de probabilidad (uniforme, Bernoulli, Poisson, normal, discreta, constante, lineal...), el tipo subyacente del valor generado e incluso el algoritmo a usar (minstd, mt19937, ranlux, knuth...).

Estás falseando la distribución.

La distribución numérica de std::rand es homogénea entre 0 y RAND_MAX, esto significa que cualquier número dentro de dicho rango tiene las mismas probabilidades de ser esogido (1 entre RAND_MAX).

Al hacer módulo (%) sobre el resultado de std::rand rompes la homogeneidad si el divisor no es múltiplo de RAND_MAX. Suponiendo un RAND_MAX de 32767 con un módulo sobre 3 obtenemos que el número 0 tiene una probabilidad de aparición mayor que el 1 y el 2 (un 0,0031% mayor).

Propuesta.

Usa las utilidades de números pseudo-aleatorios de C++:

int main(int argc, char** argv) {
    std::string name;
    std::cout <<"Hello! Write your name "<<std::endl;
    getline(std::cin, name);
    Player player(name, 100, 30);
    std::cout <<"Welcome "<<player.getName();

    std::string monsters[3] = {"Orc", "Troll", "Undead"};

    // Tenemos control sobre el algoritmo y distribución a usar.
    random_device device;
    // Se usa el algoritmo Mersenne twister
    // https://es.wikipedia.org/wiki/Mersenne_twister
    mt19937 generador(device());
    // Escogemos una distribucion uniforme entre 0 y 3
    uniform_int_distribution<> distribucion(0, 3);

    /* Generamos un número pseudo-aleatorio con el algoritmo
    mt19937 distribuido uniformemente entre 0 y 3
                                         vvvvvvvvvvvvvvvvvvvvvvv */
    Monster monster(std::string monsters[distribucion(generador)], 50,15);
    std::cout <<"Suddenly you encounter a"<<monster.getName();

    return 0;
}

Otras cosas a tener en cuenta.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82