Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: gortes en 18 Octubre 2012, 01:38 am



Título: Programa para la adivinación de un numero.
Publicado por: gortes en 18 Octubre 2012, 01:38 am
Como asignatura del colegio tuve que hacer un juego, en el que la computadora eligiera un numero aleatorio entre un rango de limites que el usuario introduzca; y solo deja al usuario intentar adivinar el numero de veces que el diga...
Cada vez que introduces el valor para ver si acertaste, te debe decir si es correcto o incorrecto, y te debe decir el numero de intento en el que estás y cuantos intentos te quedan.
Al final te debe decir todos los intentos que escribiste, y el numero que la computadora eligió aleatoriamente...

En fín... tengo problemas, debido a que el programa no imprime bien el numero de intentos que quedan, y no aparecen todos los intentos hasta el final, y no se porque... ¿Alguien me podría auxiliar?
El programa compila y corre bien, solo es ese el problema... los intentos.... que los hice a través de un arreglo...

El código completo es el siguiente:

#include<stdio.h>

void MuestraDatos();
void MuestraObjetivos();
void PideDatos(int*NumIntentos, int*NumLimMaximo, int*NumLimMinimo);
void NumAzar(int NumLimMaximo, int NumLimMinimo, int*NumRand);
void Juego(int NumRand, int*NumPuesto, int NumIntentos, int NumLimiteMaximo, int NumLimiteMinimo, int Arreglo[200], int*a, int*i);
void Imprime(int NumRand, int NumIntentos, int NumPuesto, int Arreglo[200], int a, int i);


/*-------------------------------------------------------------------------------------*/
void main(void)
{

int Rand, Puesto, Intentos, LimMaximo, LimMinimo, Lista[200], a, i;

MuestraDatos();
MuestraObjetivos();
PideDatos(&Intentos, &LimMaximo, &LimMinimo);
NumAzar(LimMaximo, LimMinimo, &Rand);
Juego(Rand, &Puesto, Intentos, LimMaximo, LimMinimo, Lista, &a, &i);
Imprime(Rand, Intentos, Puesto, Lista, a, i);
}



/*-------------------------------------------------------------------------------------*/
void MuestraDatos()
{
printf("El Juego que está a punto de disfrutar, fue diseñado por Gortes Tarets,\n");
printf("estudiante de Ingeniería Industrial en la UNAM.\n");
printf("Press Enter to Continue\n");
while(getchar()!='\n');
}



/*-------------------------------------------------------------------------------------*/
void MuestraObjetivos()
{
printf("\n\n");
printf("----------------ADIVINA EL NUMERO------------------\n");
printf("Los Objetivos del juego son los siguientes:\n\n");
printf("1. Introducirás los limites dentro de los cuales estará el numero a adivinar\n");
printf("2. Introducirás el numero de intentos en el que crees descubrirlo\n");
printf("3. Yo generaré el número, y tu lo intentarás descubrir en tu numero de intentos\n");
printf("4. El objetivo principal del juego es que ENCUENTRES EL NÚMERO!\n");
printf("Press Enter to Continue\n");
while(getchar()!='\n');
}



/*-------------------------------------------------------------------------------------*/
void PideDatos(int*NumIntentos, int*NumLimMaximo, int*NumLimMinimo)
{

printf("\n\n");
printf("Introduce el Limite máximo para los valores\n");
scanf("%d", NumLimMaximo);
if(*NumLimMaximo==0)
{
do
{
printf("Obviamente este valor no puede ser 0. Introduce un nuevo valor:\n");
scanf("%d", NumLimMaximo);
}
while(*NumLimMaximo==0);
}



printf("Introduce el Limite mínimo para los valores\n");
scanf("%d", NumLimMinimo);
if(*NumLimMinimo>=*NumLimMaximo)
{
do
{
printf("Obviamente este valor no puede ser mayor al limite maximo. Introduce un nuevo valor:\n");
scanf("%d", NumLimMinimo);
}
while(*NumLimMinimo==0);
}


printf("En cuantos intentos crees encontrar el número\n");
scanf("%d", NumIntentos);
if(*NumIntentos==0)
{
do
{
printf("Obviamente este valor no puede ser 0. Introduce un nuevo valor:\n");
scanf("%d", NumIntentos);
}
while(*NumIntentos==0);
}
}


/*-------------------------------------------------------------------------------------*/
void NumAzar(int NumLimMaximo, int NumLimMinimo, int*NumRand)
{
int NumLimiteTotal, rand();

NumLimiteTotal=(NumLimMaximo-NumLimMinimo);
*NumRand=rand()%(NumLimiteTotal)+(NumLimMinimo);
}



/*-------------------------------------------------------------------------------------*/
void Juego(int NumRand, int*NumPuesto, int NumIntentos, int NumLimiteMaximo, int NumLimiteMinimo, int Arreglo[200], int*a, int*i)
{
*a=0;
*i=NumIntentos;

printf("Estoy listo para jugar...\n\n");

do
{
printf("Introduce tu adivinación:\n");
scanf("%d", NumPuesto);
Arreglo[*a]=*NumPuesto;
*a++;

if((*NumPuesto<NumLimiteMinimo)||(*NumPuesto>NumLimiteMaximo))
{
printf("Los valores están fuera de Rango... intenta de nuevo");
i--;
printf("Quedan %d intentos\n", *i);
}

else if(*NumPuesto==NumRand)
{
printf("Felicidades, Le has ganado a una computadora... Respekt+\n");
i=i;
printf("Lo lograste en %d intentos\n\n\n", *a);
}

else if(*NumPuesto!=NumRand)
{
printf("Uy, no!, ese no era el número, intentalo de nuevo... Respect-\n");
i--;
printf("Quedan %d intentos\n", *i);
}
}
while(*i!=NumIntentos);
}



/*-------------------------------------------------------------------------------------*/
void Imprime(int NumRand, int NumIntentos, int NumPuesto, int Arreglo[200], int a, int i)
{
int contador=0;

if((NumPuesto)==(NumRand))
{
printf("-------------------RESULTADOS-------------------\n");
printf("Lo lograste resolver en %d intentos\n", a);
printf("El número correcto era: %d\n", NumRand);
printf("Tus intentos fueron:\n");
for(contador=0; contador=a; contador+1)
{
printf("Intento #%d: %d\n\n", contador++, Arreglo[contador]);
}
printf("Muchas Gracias por jugar mi juego");
}

else if(NumPuesto!=NumRand)
{
printf("-------------------RESULTADOS-------------------\n");
printf("No lograste encontrar el número en %d intentos, sos un looser!\n", a);
printf("El número correcto era: %d\n", NumRand);
printf("Tus intentos fueron:\n");
for(contador=0; contador=a; contador++)
{
printf("Intento #%d: %d\n\n", contador++, Arreglo[contador]);
}
printf("Muchas Gracias por jugar mi juego");
}
}


Título: Re: Programa para la adivinación de un numero.
Publicado por: 0xDani en 18 Octubre 2012, 12:22 pm
Usa etiquetas GeSHi para el codigo, asi es ilegible.


Título: Re: Programa para la adivinación de un numero.
Publicado por: za.asi en 19 Octubre 2012, 20:06 pm
Justo antes del while deberias poner *i-=; y hacer que el bucle sea cuando los intentos restantes no sean 0.

Te quedaría así:
Código:
printf("Quedan %d intentos\n", *i); 
i-=;
}
}
while(*i!=0);


Título: Re: Programa para la adivinación de un numero.
Publicado por: SokarTefnut en 20 Octubre 2012, 17:21 pm
Creo que estas mezclando aritmética de punteros con arimética de variables.

El la funcion Juego:

*i=NumIntentos;  // i es un puntero a la variable
si haces i--, no estás decrementando la variable,sino la direccion apuntada
por eso aparecen esos valores al imprimir los intentos, son direcciones de memoria ajenas a la variable i.

Se podría usar una variable temporal en la funcion juego, de la siguiente manera:

Juego(.........)
{
int temp;
temp=NumIntentos;

.......

ahora podremos decrementar temp,
temp--;
al salir del bucle podemos asignar el valor de temp a la variable i
*i=temp;



Título: Re: Programa para la adivinación de un numero.
Publicado por: za.asi en 21 Octubre 2012, 13:56 pm
No me habia dado cuenta, tienes razón. Es que solo hace un mes que he empezado con la programación y lo hago todo de manera autodidacta, de manera que aún cometo muchos fallos graves, pero así se aprende, buscado nuevas salidas y aprendiendo de los errores  ;D