Programa para la adivinación de un numero.

Iniciado por gortes, 18 Octubre 2012, 01:38 AM

0 Miembros y 1 Visitante están viendo este tema.

gortes

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");
}
}

0xDani

Usa etiquetas GeSHi para el codigo, asi es ilegible.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

za.asi

Justo antes del while deberias poner *i-=; y hacer que el bucle sea cuando los intentos restantes no sean 0.

Te quedaría así:

printf("Quedan %d intentos\n", *i);
i-=;
}
}
while(*i!=0);

SokarTefnut

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;

"Saber romper medidas de seguridad no hace que seas hacker, al igual que saber hacer un puente en un coche no te convierte en un ingeniero de automoción"
-- Eric Raymond -- http://en.wikipedia.org/wiki/Eric_S._Raymond

za.asi

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