/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Scanf por un tiempo determinado

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Lano



Registrado: 21 Dic 2012
Mensajes: 3

MensajePublicado: 21/12/2012 1:00 pm
Título: Scanf por un tiempo determinado

Hola a todos, la verdad soy nuevo pero me pasé buscando información sobre como hacerlo y me he dado cuenta que aquí ayudan a los noobsters como yo =P espero no causar problemas y gracias por la ayuda de antemano.

Mi duda aqui es: Como podría dejar activo un scanf por un periodo de tiempo?
Amm como ejemplo que tengas 2 segundos para ingresar los datos, lo que pasa es que me gustaría para un mini-videojuego.

Ahorita lo estoy programando (en C -EDITADO PERDÓN D=) en windows pero si saben en ubuntu creo no tendría problema alguno =P

Gracias Wink


Ultima edición por Lano el 21/12/2012 1:21 pm; editado 1 vez
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 21/12/2012 1:16 pm
Título:

No sé si te refieras a esto, pero quizás te sea de ayuda Rolling Eyes

Código:
#include <iostream>
#include <conio.h>
using namespace std;
void hacerAlgo(char);

int main()
{
    char x;
    cout<<"Leyendo caracteres !"<<endl;
    // Mientras sea diferente de E (exit).
    while( (x=getche()) != 'E' ) hacerAlgo(x);
    cout<<"\nSe detuvo el proceso porque presionaste E (exit).";
    return 0;
}

void hacerAlgo(char c){
    cout<<"\tHas presionado "<<c<<" !"<<endl;
}


La función getche() de la librería conio.h lee un caracter inmediatamente (en cuanto se presiona una tecla por teclado), es decir, sin la necesidad de presionar <ENTER>.
Volver arriba
Lano



Registrado: 21 Dic 2012
Mensajes: 3

MensajePublicado: 21/12/2012 1:29 pm
Título:

Perdon D=, no me di cuenta que no puse en el lenguaje que lo estaba programando (lo estoy haciendo en C)
Gracias masakre por pasarte a leer mi pregunta ^^
Pues lo poco que entiendo de c++ y a tu explicación entiendo lo que respondiste lo que hace el código es leer el caracter, evaluar hasta que presionen la E para así salirse pero no, eso no es lo que necesito.

Estoy haciendo un juego del topo, en un tablero sale un asterisco -representando al topo- y el usuario debe ingresar la ubicación del topo -en el tablero- para pegarle pero pues a como lo tengo me fijé que el scanf se detiene hasta que el usuario ingrese la ubicación para golpear al topo, y lo que yo quiero es que el scanf se detenga tanto tiempo, o sea, si el usuario no ingresa las coordenadas en 1 segundo, se reinicie el ciclo y la ubicación del topo sea diferente.

PD.- Espero no haber cantinfleado
PD2.- Si es necesario, les puedo pasar el código, solo llego a mi casa y lo subo


Ultima edición por Lano el 21/12/2012 1:31 pm; editado 1 vez
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 21/12/2012 2:04 pm
Título:

Pues, no hay mucha diferencia entre C y C++, o por lo menos en este tipo de casos.

En base a la información expuesta en este enlace:
Cita:
http://foro.elhacker.net/programacion_general/mod_control_del_tiempo_en_c-t23753.0.html


He adecuado el código anterior:
Código:
#include <iostream>
#include <conio.h> // Para usar getche()
#include <time.h> // Para usar clock();
#include <cstdlib> // Para usar system();
using namespace std;
void hacerAlgo(char);

int main()
{
    char x;
    clock_t ini=0, fin=0;
    cout<<"Leyendo caracteres !"<<endl;
    do{
        ini = clock(); // Inicia conteo.
        x=getche();
        fin = clock(); // Finaliza conteo.
        if(fin-ini > 5*1000){ // Por ser MILISEGUNDOS.
            cout<<"\n\n\tPerdiste! Excediste el limite de tiempo!\n";
            system("pause>nul");
            return 0;
        }
        hacerAlgo(x);
    }while(x != 'E');
    cout<<"\nSe detuvo el proceso porque presionaste E (exit).";
    return 0;
}

void hacerAlgo(char c){
    cout<<"\tHas presionado "<<c<<" !"<<endl;
}


Bueno, según lo que se indica en el enlace:
Cita:
clock() retorna el tiempo transcurrido desde el encendido del ordenador.

Por eso se usa (fin - ini > 5 * 1000); es decir, si el tiempo que le tomó al usuario ingresar un caracter es mayor que 5 segundos, muestra el dichoso mensaje y finaliza el programa.

Creo que lo puedes adecuar a lo que buscas Smile
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 21/12/2012 2:18 pm
Título:

Por cierto, sería bueno que uses dibujos ASCII en tu programa. Así, a pesar de que aún no pasemos de consola, demostramos que pueden hacerse cosas graciosas:
Código:
              _____
            \"_   _"/
            |(>)-(<)|
         ../  " O "  \..
sjw----""(((:-.,_,.-:)))""--------

Cita:
http://ascii.co.uk/art/mole


Saludos.
Volver arriba
Lano



Registrado: 21 Dic 2012
Mensajes: 3

MensajePublicado: 21/12/2012 3:22 pm
Título:

Masakre escribió:
Por cierto, sería bueno que uses dibujos ASCII en tu programa. Así, a pesar de que aún no pasemos de consola, demostramos que pueden hacerse cosas graciosas:
Código:
              _____
            \"_   _"/
            |(>)-(<)|
         ../  " O "  \..
sjw----""(((:-.,_,.-:)))""--------

Cita:
http://ascii.co.uk/art/mole


Saludos.


Ohh intentaré implementar lo del tiempo al programa ya sería un comienzo
Aquí mi código:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int imptab(int x, int y);

int main(){
   int xpos, ypos,x,y,i, vic,j;
   char cont;
   do{
      vic = 0;
      for(i = 0; i < 5; i++){
         xpos = rand()%3;
         ypos = rand()%5;
         system("cls");
         if(ypos == 1 || ypos == 3)   ypos++;
         printf("Topos Golpeados: %d\n",vic );
         imptab(xpos,ypos);
         printf("Ingresa la ubicación [X | Y]: ");
         scanf("%d %d",&x,&y);
         x--;
         if (y < 3)   y--;
         if(y == 1 || y == 3)   y++;
         if(xpos == x && ypos == y){
            printf("Le diste al topo\n");
            Sleep(600);
            vic++;
         }   
         else{
            printf("No le diste al topo U_U\n");
            Sleep(600);
         }
      }
      printf("Has finalizado el juego\nDeseas continuar empezar otro juego? [S/N]: ");
      scanf("%*c%c",&cont);
   }while(cont == 'S' || cont =='s');
return 0;
}

int imptab(int x, int y){
   int i,j;   
   for(i = 0; i < 3; i++){
      printf("\t\t\t\t");
      for(j = 0; j < 5; j++){
         if(i == x && j == y)   printf("*");
         else{
            if(j == 1 || j == 3)      printf("|");
            else                  printf("_");
         }
      }
      printf("\n");
   }
   return 0;   
}



Igual te invito a que lo compiles para que así veas que no tiene dificultad por eso del tiempo T_T xD

Para poner los dibujitos de ASCII es buena idea, pero pues tengo que hacer la tabla más grande o como sería el código? D= todo lo pongo en un arreglo bidimensional =P
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7530
Ubicación: Mexico

MensajePublicado: 21/12/2012 6:42 pm
Título:

Lano escribió:
Mi duda aqui es: Como podría dejar activo un scanf por un periodo de tiempo?

No es posible.

Si apenas empiezas tu estudio del lenguaje C es mejor que dejes ese tipo de operaciones para después ya que requieren del uso de extensiones, por ejemplo el API del sistema operativo.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com