Publicado: 21:25 04/07/2007 · Etiquetas: tutorial, teclas, programacion, c, c++, getch, kbhit, cosa facil · Categorías: Informática
Dado que me lo pidieron hace tiempo en la entrada sobre mi particular versión del juego de Snake (no confundir con Metal Gear
![]() El punto de partida es: estamos haciendo un programa o juego sencillo con C/C++, y queremos capturar teclas que el usuario pulse. En principio uno pensaría en scanf o cin>>, que sirven para entrada de datos, pero no sirven, dado que éstos, esperan que se escriba algún dato para luego pulsar Enter. Aquí lo que nos interesa es que el programa sepa de inmediato que se ha pulsado una tecla (como puede ser una tecla de dirección), e identificar cuál. Para casos como este, hay que tener el código ASCII a mano: Pincha sobre la imagen para verla más grande Recordad que el código ASCII tiene algunas variantes, por lo que no todos los códigos ASCII que encontréis serán iguales. Pero para usar unos pocos caracteres no suele dar problemas. Los 32 primeros caracteres son no imprimibles... en según qué casos. Se usan como caracteres de control (por ejemplo, salto de línea), aunque también tienen dibujitos asociados y dependiendo del lugar donde se usen, se pintará el dibujo o se realizará la acción asociada. 30 comentarios :: Enlace permanente
Comentarios: (del primero al último) Anónimo 19:37 10/07/2007
muchas gracias por ofrecer esta informacion tan valiosa. 23:36 10/07/2007
Muy buena guía para manejar teclas en "tiempo real", google te lo recompensa con hoygan y todo. Anónimo 20:47 03/08/2007
no se entiende 12:14 04/08/2007
taty: especifica lo que no entiendes y tal vez te pueda ayudar ;). Anónimo 19:46 04/08/2007
gracias, andaba buscando algo asi desde hace mucho , una duda solo , a mi las teclas de direccion me salen con el mismo codigo: 27 xq? 01:15 05/08/2007
polly: así de pronto, no sé a qué puede deberse que te lea las teclas de dirección como ESC (27). Si puedes, ponme el código con el que lees las teclas (que me imagino que no será idéntico a lo que hay aquí) y le echamos un vistazo ;) Anónimo 04:01 21/08/2007
gracias por esta informacion!!--yo estoy utilizando pascal aun, tengo que hacer un ultimo proyecto para terminar de verlo y en realidad me ayudo un moonnton!!-tambien tengo que hacer un juego pero vamos a ver como me va-muchisimas gracias---Que Dios te bendiga!!-- Anónimo 23:15 31/08/2007
hola!!! apenas estoy aprendiendo a programar en c:pero no le entiendo nada al profesor, y me deja una tarea espero me puedas ayudar para que sirve gets(), en un programa por fa necesito la ayuda de alguien espero me la puedas brindar!!!! te lo agradeceria !!! 12:14 01/09/2007
gets() sirve para pedir al usuario una cadena de texto. Captura todo lo que el usuario escriba hasta que pulse Enter. Ejemplo: char cadena[50]; printf("Escriba lo que le dé la gana: "); gets(cadena); Un problema de gets, bastante importante, es que no tienen ningún cuidado con el tamaño de la cadena. Es decir, aquí, que he creado una cadena de caracteres de tamaño 50, si el usuario escribe más de 50 caracteres, sobrepasará su tamaño y se "pisará" memoria no reservada, lo cual puede dar lugar a un error como una violación de segmento. De modo, que si usas gets, le tienes que pasar vectores de caracteres con un tamaño tal que estés seguro/a de que el usuario no va a escribir tanto (pero sin pasarse, hay que ahorrar memoria ^^). Espero haberte ayudado. Te lo escribo también al correo. Saludos. Anónimo 19:34 21/09/2007
gracias por tu informacion es esebcial Anónimo 14:09 07/10/2007
oye pero como definimos la variable tecla? 15:36 07/10/2007
jokep: supongo que te refieres a la declaración de la variable. En el ejemplo lo he puesto: char tecla; //Declaración de la variable tecla ... tecla = getch(); En realidad, como un char es un byte (un número como otro cualquiera, pero de ese tamaño), se podría declarar como un short o int/long, que siguen siendo números pero con mayor capacidad, por lo que pueden albergar al carácter devuelto por getch(). Pero sería un tanto absurdo utilizar más espacio ;). Anónimo 22:58 07/11/2007
BUENA INFORMACION HE ME INTERESARIA SABER MAS SOBRE PROGRAMACION 01:38 08/11/2007
CIOM: lo ideal sería distinguir entre "aprender un lenguaje" y "aprender programación", ya que con lo segundo aprendes a desenvolverte en el aprendizaje de nuevos lenguajes fácilmente. La distinción está en que con "aprender programación" me refiero a aprender metodología, paradigmas, etc., y acostumbrarse a aprender nuevos lenguajes con facilidad. Lo que ocurre es que este proceso suele ir ligado al aprendizaje de un lenguaje en particular, con el que uno va cogiendo soltura. Si quieres aprender C/C++, esta página: http://c.conclase.net/ tiene un curso muy completo. Pero, se centra en el lenguaje. Para aprender metodología y paradigmas, hay que trabajar más porque es algo más difuso... te podría recomendar algún libro, aunque ya dependerá de tus preferencias y conocimientos, y lo que estés haciendo. Si quieres aprender programación en serio, lo ideal es una ingeniería informática y la vocación correspondiente. Si no, ingeniería técnica en informática, y si no, existen ciclos formativos... al menos en España, no sé si eres de España. En cualquier caso, aprender a programar bien, requiere ganas y tiempo, leer libros y practicar mucho. Si tienes interés en que te aclare algo más o te recomiende algo, coméntamelo. Algún día tal vez ponga otro tutorial, pero los tutoriales que haga serán de cosas muy concretas, más que sobre programación en C por ejemplo. Saludos. Anónimo 03:49 10/11/2007
Hola colegas muy buen curso yo necesito otra forma de detectar teclas algo parecido al KBHIT para poder designarle una tecla en ves de que salga contodas solo con una porfabor se los agradeceria 17:55 10/11/2007
Charly: si lo que quieres es que tu programa únicamente reaccione a una tecla en concreto, y estás haciendo un programa con kbhit() y getch(), se puede solucionar fácilmente: char tecla; ... while((tecla = getch()) != TECLA_ESPERADA); En este caso, el programa se queda completamente quieto, bloqueado, y no reacciona mientras no se pulse una tecla en particular. Si lo que quieres es que el programa continúe trabajando pero reaccione a la pulsación de una tecla determinada, no es más que un caso particular de lo que puse en la entrada: char tecla = '\0'; ... while(condicion){ if(kbhit()) tecla = getch(); ... if(tecla == TECLA_ESPERADA) hacerAlgo; ... } En este caso, el programa itera mientras se cumpla "condicion", y en cada iteración comprueba si se ha pulsado alguna tecla. Si la tecla pulsada es la esperada, entonces realiza la acción que sea. Aquí ha sido necesario inicializar la variable tecla, para evitar que tenga cualquier valor mientras el usuario no pulse ninguna tecla. La inicializo al carácter nulo '\0', que es igual que poner 0, el primer carácter ASCII. Espero que esto te sirva. Anónimo 04:06 12/11/2007
Muchisimas gracias... me has salvado..stoy iniciando la carrera y me pusieron a hacer un juego parecido a snake, de verdad ke me ayudo mucho!!!!!!!!!!!!!!!!!!! Anónimo 09:34 05/01/2008
muy buen aporte, gracias!!! Anónimo 20:17 10/01/2008
me ha servido mucho este tutorial me gustaria que me pudieran enseñár un poco mas de como crear juegos en c++ muchas grasias ahi les dejo mi correo Anónimo 01:49 06/02/2008
hola esta muy buena tu explicacion, me podrias explicar o dar un link para aprender a detectar 2 o tres teclas pulsadas al mismo tiempo, es para un proyecto de control de un auto via radio control manejado por lpt1,necesito oprimir KEY_UP y KEY_LEFT al mismo tiempo y que si oprimo esas teclas sacar por lpt1 un codigo de 8 bits desde ya muchas gracias 13:24 06/02/2008
fabian Juarez: para eso lo ideal sería que usases un "framework" o librería de gestión de ventanas y eventos que te facilite la labor, como puede ser Qt (multiplataforma), MFC (para Windows), FOX (multiplataforma), etc. También se puede hacer con lenguaje ensamblador, pero ahí no te puedo ayudar. Anónimo 15:14 27/03/2008
HOLA, QUE FUNCION TIENE EL GETS EN "C"? 21:33 27/03/2008
Permitir al usuario introducir una cadena de texto desde teclado, en un terminal en pantalla. Es una función que no se aconseja usar pues no comprueba el límite de la cadena pasada como argumento, por lo que si el usuario escribe demasiado, pisaría memoria no reservada y se puede liar la gorda. Anónimo 06:50 03/04/2008
Hola. Quiero saber que puedo hacer para realizar un determinado proceso hasta que una tecla en especifico sea pulsada. Esto no se puede con while(!kbhit()) debido a que dicha función no regresa el valor de la tecla presionada. Lo ocupo para hacer un juego de la viborita =). Esto sería para que la viborita camine hasta que una tecla sea pulsada, entonces la viborita cambiara de dirección. También quiero saber si es posible conocer el tiempo que es presionada una tecla y que función puedo usar. Saludos! 12:58 03/04/2008
MasterCode: precisamente eso hice en mi versión del juego de la serpiente. kbhit() no te dice el valor de la tecla presionada, pero te avisa de cuando se ha presionado una tecla, que es lo importante, y entonces capturas la tecla con getch(). Es decir, en el juego de la serpiente, esta tiene que estar andando continuamente y reaccionar a las pulsaciones de teclas. Para ello tendrías algo así como: char tecla; while(!<condicion_de_fin>){ <hacer_algo> if(kbhit()){ tecla = getch(); <comprobar_valor_tecla_y_procesar> } <hacer_algo_mas> } Para lo del tiempo que una tecla es presionada, lo que necesitas es saber, además de cuándo es presionada, cuándo es soltada. Desconozco si hay alguna función para ello en las librerías básicas de C, ya sean estándar o para alguna plataforma específica como es el caso de kbhit(). Tal vez conio.h tenga alguna, investiga por ahí. En realidad, para tener verdadero control de este tipo de cosas, lo ideal es una aplicación dirigida por eventos. Pero para ello necesitas usar una librería o entorno de gestión de ventanas y eventos (como MFC, Qt, wxWidgets...), y la cosa se complica bastante si no sabes usar ninguna y quieres hacer el juego rápidamente, aunque los resultados siempre podrán ser mejores. Anónimo 00:47 28/05/2008
HOYGAN, VUEM HAPORTE Anónimo 19:40 02/06/2008
Hola, quiero hacerlo pero linux no reconoce la funcion getch(). ¿Saben alguna solución? 15:32 03/06/2008
En Linux debe haber una función equivalente, pero la desconozco. En realidad, como ya dije en el tutorial, esto es solamente para entretenerse o aprender cosas básicas, porque para programas más o menos en serio, hay que usar otro tipo de herramientas, como Qt. 09:31 02/06/2014
HOLA NO SE SI PODRIAN AYUDARME! NECESITO LA AYUDA... UN PROGRAMA QUE AL HACERLE CUALQUIER PREGUNTA ESCRITA.. AL TECLEAR "ENTER" RESPONDA 1 DE LAS 8 RESPUESTAS QUE TIENE GUARDADAS (CON RANDOM TOMARA ALEATORIAMENTE UNA DE ESAS 8) EJEMPLO: QUIEN DESCUBRIO AMERICA? LA RESPUESTA ES: yo que se, solo soy una maquina. 09:31 02/06/2014
algo asi como el juego de preguntale a pedro... o el de la bola magica 8 que le preguntas... bates la pelota... y flota una respuesta... LO RECUERDAN??... AYUDA!!! Participa con tu Comentario:
Este blog no permite comentarios. |
Blogs en Vandal · Contacto · Denunciar Contenido