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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: [1] 2 3
1  Programación / Programación C/C++ / Duda de probabilidad de pasarse en: 12 Diciembre 2018, 23:21 pm
Hola, tengo que hacer que la máquina se ha vuelto más prudente y se plantará cuando su puntuación sea superior a la del humano o, en caso de que estén empatados, si la probabilidad de pasarse supera el 50%.


He creado esto pero no se para cuando la probabilidad de pasarse es mayor a un 50%.

Código
  1. bool esProbablePasarse(double puntosMaquina, const tCartasPorAparecer cartas)
  2. {
  3. int variable = 0, variable2 = 0;
  4. bool pasarse,probabilidad;
  5. double dato = 7.5 - puntosMaquina;
  6.  
  7. for (int i = 0; i < 8; i++)
  8. {
  9. variable = variable + cartas[i];
  10. variable2 = cartas[i] + variable2;
  11. }
  12.  
  13.  
  14. probabilidad = variable / variable2;
  15.  
  16. if (probabilidad < 0.5)
  17. {
  18. pasarse = false;
  19. }
  20. else
  21. pasarse = true;
  22.  
  23. return pasarse;
  24. }
2  Programación / Programación C/C++ / Re: Error al compilar en: 11 Diciembre 2018, 19:42 pm
Par empezar el tipo de dato de la variable Dato es double no Int, no puedes o mas bien vas a tener errores por guardar un dato entero cuando realemnte esperas un tipo de dato flotante o double.

Segundo segun veo tu Screenshot.

Código:
	for (int i = dato; i < 8; i++)
{
variable = variable + cartas[i];
}

Iguales i al valor de dato pero cuando realizas una Operacion en dato como:

Código:
dato = 7.5 - puntosMaquina;

El resultado no va a ser siempre el que esperes, a no ser que estes 100% seguro que la operacion siempre va a devolver un numero entero.

ahora el error que te aparece es que estas tratando de acceder a una region de memoria no valida, ya sea que te excediste del limite del arreglo o la variable cartas es apuntador No valido. (Cosas que no podemos saber por que no tenemos acceso al resto del codigo.

Te recomiendo colocar Mejores nombres a tus variables por que los nombres de "dato" y "variable" son muy escuetos.

Saludos

Gracias, como puedo haberme pasado si yo he definido el array como
Código
  1. typedef int tCartasPorAparecer[8];
  y con el for he hecho que lea hasta el 8 a si que no creo que me haya pasado... y lo de no valido no se como ver si es eso...
3  Programación / Programación C/C++ / Re: Error al compilar en: 11 Diciembre 2018, 19:14 pm
Código:
int dato;



Me sigue dando el error
4  Programación / Programación C/C++ / Error al compilar en: 11 Diciembre 2018, 19:00 pm
Buenas, me sale un error al compilar y luego en la puntuación me salen numeros negativos cuando deberían salir numeros pequeños...Es un error que nunca me habia salido y no se por que es.

https://gyazo.com/dd40d2b77b7fa13ba755a169e3b819fe

Código
  1. bool esProbablePasarse(double puntosMaquina, const tCartasPorAparecer cartas)
  2. {
  3. int dato, variable = 0, variable2 = 0, probabilidad;
  4. bool pasarse;
  5. dato = 7.5 - puntosMaquina;
  6.  
  7. for (int i = dato; i < 8; i++)
  8. {
  9. variable = variable + cartas[i];
  10. }
  11.  
  12. for (int i = 0; i < 8; i++)
  13. {
  14. variable2 = cartas[i] + variable2;
  15. }
  16.  
  17. probabilidad = variable / variable2;
  18.  
  19. if (probabilidad < 0.5)
  20. {
  21. pasarse = false;
  22. }
  23. else
  24. pasarse = true;
  25.  
  26. return pasarse;
  27.  
  28. }
5  Programación / Programación C/C++ / Re: Ayuda con programa en: 10 Diciembre 2018, 21:30 pm
Primero si no es para citar algo concreto de otro mensaje no incluyas una cita a cada respuesta porque cada mensaje se hace larguísimo. Además de eso un tema se crea para resolver una duda específica, no para hacer un programa entero. Ya sé que es mucho más cómodo abrir un tema y que esté activo hasta que tu programa funcione completamente pero no es así. Ese programa cada vez es más largo y no vamos a estar revisándolo entero. Cuando tengas una duda, específica la duda y manda el código necesario para resolverla, a veces será el programa entero, otras veces sólo será necesario mandar una función o un bloque. Si hace falta más código ya te lo diremos.

Segundo tu función de generar un número aleatorio en un sitio tiene una definición y en otro sitio otra. Te recomiendo que si la función se encarga de generar números aleatorios, tenga dos parámetros que indiquen el mínimo y el máximo para determinar el rango.Así la función será más polivalente que si simplemente cogemos un trozo del <main> lo metemos en una función y lo dejamos igual, hay que aprovechar las ventajas de las funciones.

Un prototipo que yo creo que estaría bastante bien para generar números aleatorios puede ser:
Código
  1. int generarNumeroAleatorio(int minimo, int maximo);
Si no quieres que tu función sea así y tenga otra definición, es tu decisión pero fíjate en lo que le pasas como parámetros ya que primero has puesto un código donde le pasas un entero y luego en el programa entero tiene otro prototipo sin parámetros.

Precisamente ahí si te da un problema al usar la función eso es lo que tienes que mandar para que te ayudemos, la función y explicar el error que te da, no decir que te da algún error y soltar 357 líneas de código.
Hay que tener un poco de consideración en lo que se pide, no estamos aquí para salvarte de cada problema que tengas. Aquí el que más tiene que poner de su parte eres tú, no nosotros.

En otro tema posterior a este he comentado como usar <typedef>, me había confundido así que ahora voy a modificar ese mensaje y de momento te dejo la respuesta correcta por aquí:
Código
  1. typedef int array10[10];
  2. int main(){
  3.    array10 miArray;
  4.    for(int i = 0; i < 10; i++)
  5.        miArray[i] = i;
  6. }
Ahí tienes como se usa el <typedef> para lo que tú querías hacer y un ejemplo de uso para que veas como se usan los índices, no tiene mucha complicación eso.

Por mi parte si tienes una duda concreta en un trozo de código concreto igual puedo ayudarte, revisar 357 líneas de código para solucionar todos tus problemas es algo que no voy a hacer. Suerte. :-X

PD: Tampoco recortes el programa y mandes lo mismo con menos código. Dudas concretas es preguntar por qué te sale un error o cómo puedes hacer tal cosa y te podremos dar una idea ya sea un ejemplo de código o una explicación en pseudocódigo para que tú después te encargues de implementarlo.

Vale perdon, soy bastante nuevo, pero gracias por todo en serio, todavia me queda bastante pero gracias por todo hasta ahora :)
6  Programación / Programación C/C++ / Re: Ayuda con programa en: 10 Diciembre 2018, 21:17 pm
No es que la puntuación de la máquina salga al final, simplemente al ser un bucle en el que el usuario no tiene que hacer nada el programa se ejecuta muy rápido y por eso se muestra la puntuación y de seguido el ganador. Si quieres ver la puntuación en cada iteración lo que puedes hacer es meter una pausa por ejemplo con <cin.get()>. Así se va a parar en cada vuelta hasta que pulses enter.
Código
  1. double modoBmaquina(ifstream & archivo, int numeroAleatorio, double puntosHumano){
  2. int final = 0, aux;
  3. double puntos = 0;
  4.  
  5. while (final < numeroAleatorio && puntosHumano < puntos && puntos < PUNTUACION_LIMITE){
  6. archivo >> aux;
  7. if (aux > 7)
  8. puntos += 0.5;
  9. else
  10. puntos += aux;
  11. cout << "La maquina ha robado : " << aux << endl;
  12. cout << "La puntuacion de la maquina es : " << puntos << endl;
  13.                cin.get();
  14.        }
  15. return puntos;
  16. }

El tema de la <PUNTUACION_LIMITE> si lo único que has hecho ha sido declarar la variable y sustituir en cada <7.5> por <PUNTUACION_LIMITE> el programa no tiene que cambiar. Puede que sea que si usas números aleatorios para la cantidad de cartas que se roban y has aplicado alguno de los métodos que te comenté para robar cartas desordenadas haya coincidido que el humano haya tenido 7 puntos con las cartas que ha robado y la máquina se haya pasado en la última iteración a 8.
Prueba a quitar los trozos de código aleatorios para que las cartas que se cogen siempre sean las mismas y así poder controlar los resultados.

Un par de consejos más:
Código
  1. if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO) {
  2. cout << "Ha ganado el HUMANO" << endl;
  3. cin.get();
  4. }
  5. else{
  6. cout<<"El ganador es la maquina"<<endl;
  7. cin.get();
  8. }
Si tienes un <if> que ejecuta una instrucción y un <else> que ejecuta la misma instrucción, esa instrucción se ejecutará siempre. Entonces se pone después del <else> y así sólo se pone una vez.
Código
  1. if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO)
  2. cout << "Ha ganado el HUMANO" << endl;
  3. else
  4. cout<<"El ganador es la maquina"<<endl;
  5. cin.get();

Y esto:
Código
  1. while (responder < 1 || responder > 2)
Sería más correcto usar el operador "distinto" <!=>.
Código
  1. while(responder != 1 && responder != 2)

Por lo menos dime por que me da error en tCartasPorAparecer (error de sintaxis) y en "cartas"(en las primeras lineas)

Agradeceria mucho la ayuda.
7  Programación / Programación C/C++ / Re: Ayuda con programa en: 10 Diciembre 2018, 18:53 pm
Código:
[quote author=YreX-DwX link=topic=489919.msg2180460#msg2180460 date=1544368262]
No es que la puntuación de la máquina salga al final, simplemente al ser un bucle en el que el usuario no tiene que hacer nada el programa se ejecuta muy rápido y por eso se muestra la puntuación y de seguido el ganador. Si quieres ver la puntuación en cada iteración lo que puedes hacer es meter una pausa por ejemplo con <cin.get()>. Así se va a parar en cada vuelta hasta que pulses enter.
[code=cpp]
double modoBmaquina(ifstream & archivo, int numeroAleatorio, double puntosHumano){
int final = 0, aux;
double puntos = 0;
 
while (final < numeroAleatorio && puntosHumano < puntos && puntos < PUNTUACION_LIMITE){
archivo >> aux;
if (aux > 7)
puntos += 0.5;
else
puntos += aux;
cout << "La maquina ha robado : " << aux << endl;
cout << "La puntuacion de la maquina es : " << puntos << endl;
                cin.get();
        }
return puntos;
}

El tema de la <PUNTUACION_LIMITE> si lo único que has hecho ha sido declarar la variable y sustituir en cada <7.5> por <PUNTUACION_LIMITE> el programa no tiene que cambiar. Puede que sea que si usas números aleatorios para la cantidad de cartas que se roban y has aplicado alguno de los métodos que te comenté para robar cartas desordenadas haya coincidido que el humano haya tenido 7 puntos con las cartas que ha robado y la máquina se haya pasado en la última iteración a 8.
Prueba a quitar los trozos de código aleatorios para que las cartas que se cogen siempre sean las mismas y así poder controlar los resultados.

Un par de consejos más:
Código
  1. if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO) {
  2. cout << "Ha ganado el HUMANO" << endl;
  3. cin.get();
  4. }
  5. else{
  6. cout<<"El ganador es la maquina"<<endl;
  7. cin.get();
  8. }
Si tienes un <if> que ejecuta una instrucción y un <else> que ejecuta la misma instrucción, esa instrucción se ejecutará siempre. Entonces se pone después del <else> y así sólo se pone una vez.
Código
  1. if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO)
  2. cout << "Ha ganado el HUMANO" << endl;
  3. else
  4. cout<<"El ganador es la maquina"<<endl;
  5. cin.get();

Y esto:
Código
  1. while (responder < 1 || responder > 2)
Sería más correcto usar el operador "distinto" <!=>.
Código
  1. while(responder != 1 && responder != 2)
[/quote]


   srand(time(NULL));
   numeroAleatorio = 3 + rand() % 5 - 3 + 1;

   return numeroAleatorio;
}[/code]
8  Programación / Programación C/C++ / Re: Ayuda con programa en: 9 Diciembre 2018, 13:56 pm
Primero para la función que tienes no se usa un <while> sino un <if>. Es muy común traducir una sentencia como "mientras..." pero en realidad es "si...".Un <while> se usa si vas a repetir un trozo de código hasta que se cumpla una condición, por lo tanto los valores de la condición tienen que ir cambiando dentro del <while>, por ejemplo:
Código
  1. while(puntosMaquina < puntosHumano && puntosMaquina < 7.5)
  2.    puntosMaquina += carta;
Eso sería un <while>. Mientras los puntos de la máquina no superen al humano ni el 7.5 entonces le sumamos otra carta. No digo que lo tengas que hacer así ya que tienes tus propias funciones para robar cartas. Es sólo para que veas el uso del <while>.

En tu caso si es para determinar un ganador es con un <if>. Además en programación lo que se suele hacer para dar menos vueltas es asumir un caso y si la condición es la opuesta, modificar el resultado, tu caso:
Código
  1. int determinaGanador(int puntosHumano, int puntosMaquina){
  2.    int ganador = HUMANO;
  3.    if(puntosHumano > 7.5 || (puntosMaquina < 7.5 && puntosHumano < puntosMaquina))
  4.        ganador = MAQUINA;
  5.    else if(puntosHumano == puntosMaquina)
  6.        ganador += rand() % 2;
  7.    return ganador;
  8. }
Esa es tu función que una vez tiene los puntos de ambos, te dice quien es el ganador. No contempla el caso de que los dos jugadores se hayan pasado del 7.5. Eso ya te lo dejo a ti.  :rolleyes:

Si lo que quieres es interrumpir el programa en cuanto uno de los dos pasa de 7.5. Entonces la modificación la tienes que hacer al momento en que van robando cartas. He mirado un poco tu programa por encima y en cada función del modo de juego ya compruebas que no se haya pasado de 7.5, eso está bien. Lo que puedes hacer en el <main> sería algo así:
Código
  1. puntosHumano = modoA(archivo, numeroAleatorio);
  2. if(puntosHumano < 7.5)
  3.    puntosMaquina = modoA(archivo, numeroAleatorio);
  4. //...
Así si el humano se pasa de 7.5 tal y como te he hecho la función anterior ganaría la máquina sin necesidad de robar cartas. Esto tendrías que implementarlo para cada uno de los modos. Además te recomiendo no usar números mágicos, es decir, números que aparecen literalmente por ahí y no se sabe lo que son. Dale un nombre a 7.5 y sustitúyelo en el programa por ejemplo:
Código
  1. const int PUNTUACION_LIMITE = 7.5;
  2. // y en el resto del programa poner PUNTUACION_LIMITE donde ponga 7.5
Así cambiando sólo ese número puedes cambiar el límite del juego sin tener que ir cambiando todo el programa. Suerte. :-X


9  Programación / Programación C/C++ / Re: Ayuda con programa en: 8 Diciembre 2018, 14:03 pm
Para eso tienes varias alternativas:
- Una sería usar ficheros de acceso aleatorio mediante funciones como <seekp()> y <seekg()>. Puedes buscar más información buscando "ficheros de acceso aleatorio c++" o buscando directamente las funciones que te he comentado y ver cómo funcionan.

Si no tienes ni idea de trabajar con ficheros de acceso aleatorio, yo te recomendaría usar la segunda opción que consistiría en aplicar lo que ya sabes para conseguir una lectura aleatoria:
- Yo generaría un número aleatorio pequeño para no irme al final del fichero y saltaría esos números. Así no coges siempre los n-primeros.
Código
  1. int cartasASaltar = generarAleatorio(0,5);
  2. int cartasSaltadas = 0;
  3. int carta;
  4. while(!fichero.eof() && cartasSaltadas <= cartasASaltar){
  5.    fichero >> carta;
  6.    cartasSaltadas++;
  7. }
  8. cout << "Tu carta es: " << carta << endl;

Ahí tienes un trozo de prueba para que veas a lo que me refiero. Con la función que te comenté hace un tiempo para generar números aleatorios le pasas el mínimo y el máximo (como coges como mucho 5 cartas, saltando un máximo de 5 cartas en cada vuelta es seguro que no te sales del fichero, podrías saltarte más eso ya te dejo que lo calcules tú si quieres) Para hacerlo más aleatorio puedes generar un número aleatorio distinto en cada vuelta para que no siga el mismo patrón. Suerte. :-X

Mientras escribía esto me he dado cuenta de que también puedes empezar con un fichero vacío y el propio programa genere el fichero (simulando que se está barajando). Creas números aleatorios entre [1,10] y los escribes en el archivo. Así la baraja no empezaría ordenada. En este caso tendrías que controlar que no se repitan más de 4 veces cada valor ya que en la baraja cada valor numérico se repite hasta 4 veces. Mi recomendación si lo haces así que la verdad me parece bastante interesante es que hagas un array y cada vez que generes un número, compruebes que no has generado ya 4 veces ese número y  le sumes 1 al (i-1)-elemento. Me explico por si no se entiende:
- Tienes un array <maximos[10] = {0,0,0,0,0,0,0,0,0,0}> que indica cuantas veces has generado cada valor.
- Generas x valor (imagina un 1).
- Compruebas que (maximos[x-1] < 4) Si no es menor que 4 generas otro número distinto.
- Si es menor que 4, lo agregas al fichero y haces <maximos[x-1] += 1>, es decir le sumas 1 en la posición correspondiente.

Suerte y espero que te animes a intentar el último método que te he comentado. O incluso puedes mezclarlos, eso ya depende de la imaginación del programador. Personalmente creo que es mejor que resuelvas un problema con las herramientas que conoces hasta que estudies otras y no que uses herramientas que no sabes como funcionan para salir del paso. La decisión final es tuya. Suerte. :-X :-X


Okey gracias, por ultimo, me gustaría hacer que al pasarse de 7.5 tanto la maquina como el humano, pierdan la partida automáticamente con un cout<<"Has perdido la partida", para ello habia creado esto, pero no me funciona.

Código
  1. int determinaGanador(double puntosHumano, double puntosMaquina)
  2. {
  3. int ganador;
  4.  
  5. while (puntosHumano || puntosMaquina < 7.5)
  6. {
  7. if (puntosHumano > puntosMaquina)
  8. {
  9. ganador = HUMANO;
  10. }
  11. else if (puntosHumano < puntosMaquina)
  12. {
  13. ganador = MAQUINA;
  14. }
  15.  
  16. else if (puntosHumano == puntosMaquina)
  17. {
  18. ganador = HUMANO + rand() % +(MAQUINA - HUMANO);
  19. }
  20. }
  21.  
  22. while (puntosHumano || puntosMaquina > 7.5)
  23. {
  24. if (puntosHumano > 7.5)
  25. {
  26. cout << "Has perdido ";
  27. }
  28. if (puntosMaquina > 7.5)
  29. {
  30. cout << "La maquina ha perdido ";
  31. }
  32. }
  33. return ganador;
  34. }

10  Programación / Programación C/C++ / Re: Ayuda con programa en: 7 Diciembre 2018, 13:05 pm
Según tu código la carta que robas la guardas en <aux> en cada una de las funciones <modoA()> y <modoB()>. Entonces para ver la carta sólo tendrías que hacer un <cout> de <aux>.

Un par de consejos:
- Si no recuerdo mal lo de generar el número aleatorio tenías que hacerlo con una función, no en el <main>.
- En vez de usar <if> anidados para cada opción del menú, es mejor usar el <switch>.
- En el <modoBHumano()> si la variable <continuar> le asignas <true> al empezar, luego no le asignes <true> otra vez cada vez que el usuario quiere otra carta. Sólo asígnale <false> cuando no quiera más cartas, hasta entonces ya vale <true>.
- La variable <continuar> de <modoBMaquina()> más de lo mismo.
- En la función <determinaGanador()> en caso de empate siempre gana el humano por lo que te he comentado antes de los números aleatorios. Estás haciendo <rand() % 1> y eso siempre es 0, por lo que HUMANO + 0 = HUMANO.

Aparte de esas cosillas, como el archivo se lee en orden, siempre van a salir los <numeroAleatorio>-primeros números del archivo.

Si esas cosillas las estuve corriegiendo gracias, pero como puedo hacer para que los numeros del archivo de texto se lean de forma aleatoria?
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines