Hola a todos, despues de mucho buscar en google y no entender ni jota (soy nuevo en esto de C), queria que me explicaran por favor si hay algun modo de emular kbhit() en linux.
estoy haciendo un pequeño juego y quiero que se repita un bucle hasta que el usuario apriete una tecla, pero soy totalmente incapaz.
gracias a todos por adelanatdo
Hola,
alomejor esto te ayuda:
http://linux-sxs.org/programming/kbhit.html
define una function khbit que emula la de msdos, hay codigo para implementarlo en c y en c++
Gracias por tu aporte, entonces debo hacer una libreria con KBHIT.H y KBHIT.C, o tengo que meterlo en mi codigo de algun modo?¿?
pdt: se me olvido ponerlo pero mi codigo es para C , no para C++ aunque no se si hay diferencia en lo que busco.
lo mas simple seria copiar kbhit.h y kbhit.c a la carpeta donde tienes los demas ficheros y simplemente
#include "khbit.h"
las dos hacen lo mismo solo que la version en c++ esta implementada en una clase, aunque si estas usando c no te preocupes por eso
y no hay que compilar de manera extaña ni nada?¡
lo estas incluyendo directamente en tu proyecto a traves del #include, asi que se compilara con el resto de tu codigo
Me salta undefined referente to `kbhit'
eso significa que seguramente hayas escrito el numbre de alguna funcion o variable mal. Puedes enseñar el codigo?
El codigo no esta acabado y quedan muchas cosas por hacer, el problema salta en la linea 61, si quito el kbhit compila bien
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ncurses.h>
#include <unistd.h> /*sleep*/
#include "kbhit.h"
#define F 20
#define C 20
char fondo [F][C];
char serpiente[F*C][F*C];
int contador = 0;
int a,b;/*comida*/
int x=2,y=2;/*movimiento*/
void imprime (char matriz[F][C]);
void iniciar_matriz (char matriz[F][C]);
void movimiento ();
void comida();
int main()
{
initscr();
nodelay(stdscr,TRUE);
erase();
iniciar_matriz(fondo);
comida();
movimiento();
getch();
endwin();
return 0;
}
void movimiento ()
{
char c='q',d;/*por ejemplo q*/
while (c!='x')
{
if((x==a)&&(y==b)){ contador++; comida();} /*para comer*/
fondo
- [y]='*';
imprime(fondo);
fondo - [y]=' ';
d=c;
if(kbhit()){c=getch();}
if(c=='x'){break;}
if(c=='w'){x=x-1;}
if(c=='a'){y=y-1;}
if(c=='s'){x=x+1;}
if(c=='d'){y=y+1;}
if(x<0){x=F-1;} /*si pongo F va a /0*/
if(y<0){y=C-1;}
if(x>(F-1)){x=0;}
if(y>(C-1)){y=0;}
sleep(1);
c=d;
}
}
void iniciar_matriz (char matriz[F][C])
{
int i, j;
for (i=0;i<F;i++)
{
for (j=0;j<C;j++)
{
fondo[j]=' ';
}
}
}
void imprime (char matriz[F][C])
{
erase();
int i,j;
for(i=0;i<(C+2);i++){printw("_ ");}/*arriba*/
printw("\n");
for (i=0;i<F;i++)
{
printw("|");/*izquierda*/
for (j=0;j<C;j++)
{
printw("%c ",matriz[j]);
}
printw(" |\n");/*derecha*/
}
for(i=0;i<(C+2);i++){printw("_ ");}/*abajo*/
printw("\n");
printw("%d \n",contador);
}
void comida()
{
a=(rand() % F); /*parentesis para ver si para de salirse*/
b=(rand() % C);
fondo[a]='@';
imprime(fondo);
}
De linux yo se bien poco, pero por lo que tengo entendido getch() no existe ya que esta definido en conio.h, esto explicaria el error. Asi que tienes que definir tu propia funcion getch(), por lo que he leido seria algo asi
int mygetch( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
(http://cboard.cprogramming.com/faq-board/27714-faq-there-getch-conio-equivalent-linux-unix.html)
no si el getch no es poblema con la libreria ncurses, pero gracias tambien con el aporte, voy a ver si me funciona