Hola, he hecho una mini-libreria con dos funciones para leer caracteres introducidos por el teclado sin tener que pulsar intro en linux, me ha costado encontrar la manera de hacerlo sin tener que usar ncurses ni cosas por el estilo asi que aqui lo dejo, igual a alguien le es tan util como a mi:
/* ---- DirectInputLib ---- */
#include <unistd.h>
#include <termios.h>
#define FARRIBA 21
#define FABAJO 22
#define FIZQ 23
#define FDER 24
int getch(){
struct termios oldt, newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
do{
ch = getchar();
}while(ch==10);
if(ch==27){
getchar();
ch = getchar();
switch(ch){
case 'A':
ch=21;
break;
case 'B':
ch=22;
break;
case 'C':
ch=23;
break;
case 'D':
ch=24;
break;
}
}
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
char leeDirecto(unsigned opc){
char ch;
ch=getch();
switch(opc){
case 1:
printf("%c", ch);
break;
case 2:
printf("%c\n", ch);
break;
case 3:
printf("\n", ch);
break;
}
return ch;
}
Y si, la he llamado DirectInputLib(dilib.h), que queda super chuli 🙂
Define 4 constantes para leer las flechas de direccion(FARRIBA,FABAJO,FIZQ e FDER), asi en vez de por ejemplo poner "case 21:", se pone "case FARRIBA:" y ya esta.
La funcion getch() devuelve un char con el caracter y la funcion leeDirecto() ha de recibir un unsigned; leeDirecto(1) muestra el caracter por pantalla, leeDirecto(2) ademas hace un salto de linea tras mostrar el caracter y leeDirecto(3) solo hace un salto de linea. De cualquier forma, leeDirecto(1, 2 o 3) devuelve un char con el caracter. Tambien se puede usar leeDirecto(0) que hace lo mismo que el getch().
Creo inneceario que se pueda leer un salto de linea con esas funciones asi que si lee uno, sigue leyendo caracteres hasta que no haya mas.
Con esto porfin puedo hacer un juego de "hundir la flota" decente, jejeje. Que colocar los barquitos con coordenadas en bastante molesto. Tambien haria un juego de matamarcionos si tubiera timepo.