[Ayuda!] Como detener un ciclo (C)

Iniciado por Snako, 11 Abril 2011, 04:32 AM

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

Snako

Buenas, soy estudiante de programación, apenas comenzando. En la facultad llevamos una materia donde vemos solo ejercicios, y esta última sesión se nos asignó un ejercicio algo complicado. No por todo el ejercicio en sí, sino por la funcionalidad que especificó el profesor.

Solo para mostrar de que trata:

CitarEl juego consiste en jugar con el CPU a realizar operaciones de sumar, restar, multiplicar o dividir en base a un mismo numero dentro de limites de tiempo.
La primera pantalla de dicho juego mostrara el siguiente menú:

1.- Sumas.
2.- Restas
3.- Multiplicaciones
4.- Divisiones
5.- Configuracion del juego.

Dentro de la configuracion del juego:

1.- Ajuste de nivel de dificultad (del 1 al 12)
2.- Asignar valor inicial.
3.- Asignar el valor de modificador.

-El nivel de dificultad, incrementa despues de 5 inferencias, teniendo más exitos que fracasos (3 de 5 para aumentar)
-En el nivel 1, el tiempo para responder es de 12 segundos, en el nivel 12 es de 0.1 segundos, (esto incluye el tiempo en teclear hasta que presiona "enter" el usuario).
-El juego termina al obtener mas fallos que exitos.
-Al final el programa debe de mostrar una pantalla con promedios y estadisticas por nivel y generales.

Mi duda surge de lo que está resaltado en negritas... Se supone que el juego, debe preguntar una operacion con datos especificados por el usuario -incluyendo el nivel de dificultad-.

(Supongamos 1+2... valor inicial=1, valor modificador=2), en cuanto el juego comienze y esta operación aparezca en pantalla, debe iniciarse un contador (supongamos de nivel 1, 12 segundos), y este contador debe continuar aun MIENTRAS el usuario introduce la respuesta y detenerse al presionar ENTER, para luego comparar la respuesta. En caso de que el tiempo se termine sin datos introducidos, debe pasar a la sig. operación.

¡Bueno! Ese es mi dilema, no tengo ni la menor idea de como detener este ciclo unicamente con la tecla ENTER, y que mientras este siga corriendo, me acepte los datos numericos del teclado.

Me han hablado de kbhit pero no he encontrado una forma de implementarla de la forma que deseo (ya que almacena caracteres segun entendí).

Esta es solo una muestra de la parte del codigo donde se realizaria la operacion/pregunta en caso de ser una suma, no incluyo todo lo demas para no confundir (y porque aun está en proceso jeje, pero mi única duda es ahí) :


                     
Citarrespuesta=valorinicial+valormod;

                     printf("%d + %d = ",valorinicial,valormod);
do{
    Sleep( (clock_t)1 * CLOCKS_PER_SEC );
    tiempo=tiempo-1;
    printf(" %d ",tiempo);

}while (tiempo>0); //*Ciclo que necesito detener con Enter y recibir datos*//
                            //*Recibir respuesta2*//

                     if (respuesta==respuesta2)
                     acierto=acierto+1;
                     else
                     fallo=fallo+1;


Sé que el incluir el tiempo restante cada segundo sería problematico (tal vez no solo visualmente) pero así se especificó, a menos de que pueda demostrarle al profesor porque no es conveniente..

Agradecería mucho su ayuda, criticas, apoyos, rosas, chocolates, mentadas de mami y demas.  :-*

Belial & Grimoire

hola

jaja me dio risa lo de la ayuda

mmm, no se si entendi bien, talvez te den mejores sugerencias, pero espero haber entendido el problema... lo que tu quieres es que cuando el usuario oprima "enter" se detenga el ciclo?

si es asi, podrias hookear las teclas y poner en while que se termine cuando de cero ó "||" que cuando presionen enter tambien lo haga, por el foro hay un ejemplo de un keylogger, no recuerdo cual es la funcion que se usa para detectar las teclas, pero como te menciono por el foro se encuentra un ejemplo, podrias implementar esa funcion y detener el while cando presionen enter, creo es keycode o algo asip.

bueno, espero eso te sirva

salu2
.                                 

Akai

#2
En realidad, vuestro profesor sólo os ha mareado la perdiz de una forma tremenda.

Omite la parte de "(esto incluye el tiempo en teclear hasta que presiona "enter" el usuario)". Imagino que quería simplificar el asunto diciendo que consideréis el tiempo hasta que hayáis leído el número.

Simplemente haz un bucle que no se rompa mientras no haya pasado un tiempo o leído el número (usar una variable centinela para esto puede ser una idea).


int segons=5, centinela =1;
clock_t espera;
espera = clock () + segons * CLOCKS_PER_SEC ;
while (clock() < espera && centinela) {}
}


Este pequeño bloque de código se espera 5 segundos, si pones algo dentro del while, repetirá algo durante 5 segundos, y si lo modificas, hará lo que tu le hayas hecho que haga.