AYUDA!! kbhit() en linux

Iniciado por godofredo, 4 Abril 2011, 16:26 PM

0 Miembros y 3 Visitantes están viendo este tema.

godofredo

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

ssaammuu

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++

godofredo

#2
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.

ssaammuu

#3
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

godofredo

y no hay que compilar de manera extaña ni nada?¡

ssaammuu

lo estas incluyendo directamente en tu proyecto a traves del #include, asi que se compilara con el resto de tu codigo

godofredo

Me salta undefined referente to `kbhit'

ssaammuu

eso significa que seguramente hayas escrito el numbre de alguna funcion o variable mal. Puedes enseñar el codigo?

godofredo

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);
    }

ssaammuu

#9
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)