LINUX.ORG.RU

С — стандартный хейдер в линуксе для обработки событий клавиатуры

 


0

1

Есть игра Laby (игра в которой управляешь роботом посредством написания кода в спец-окне), код в которой пишу на С. Так вот, нужен хейдер который есть везде в линуксах, с помощью которого можно обработать собтия клавиатуры, например по нажатию клавиши Space вызвать специфически метод этой игры.


хейдер

Штоэта? "хэдер"? "шейдер"? "хейтер"?

И что тебе надо? Научись сначала вопросы задавать!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от gbiont

как спросил, так ответил

stdio.h

d ★★★★
()

в смысле ты хочешь вместо программы(содержащий шаги и т.п) пускать своего прокси и с клавы рулить мурашкой?

qulinxao ★★☆
()
Ответ на: комментарий от gbiont

Научись вопросы задавать!

Консольное приложение? Или графическое? Если первое, то тебе d уже подсказал. Если второе, то зависит от того, что ты используешь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

sudo apt-get install laby

python gtk игруха - контролируемое окружение в котором в кач. входного скрипта может быть си-код с

#include "robot.h"

void ant(){

...

}

тсу: как вариант найди robot.h и сделай открытие файла/консоли и через getchar по эксперементируй со вселенной.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

сделай открытие файла/консоли

А по другому не отловить? У меня сейчас на рандоме зацикленно, вместо этого хочу на клавиши перевести:

#include "robot.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

void ant()
{
srand(time(NULL));
int next = 0;

while (1) {
next = rand()%2 + 1;
if (look()==Void) {
forward();
}
else if (look()==Exit) {
escape();
break;
}
switch (next)
{
    case 1:
        left();
        break;
    case 2:
        right();
        break;
}
}

}//end

gbiont
() автор топика
Ответ на: комментарий от gbiont
void quit(int sig){
        //...
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // return terminal to previous state
        //...
}
*/
// initial setup:
void setup_con(){
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        if(tcsetattr(STDIN_FILENO, TCSANOW, &newt) < 0){
                tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
                exit(-2); //quit?
        }
}

/**
 * Read character from console without echo
 * @return char readed
 */
int read_console(){
        int rb;
        struct timeval tv;
        int retval;
        fd_set rfds;
        FD_ZERO(&rfds);
        FD_SET(STDIN_FILENO, &rfds);
        tv.tv_sec = 0; tv.tv_usec = 10000;
        retval = select(1, &rfds, NULL, NULL, &tv);
        if(!retval) rb = 0;
        else {
                if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar();
                else rb = 0;
        }
        return rb;
}

И в main:

int main(int argc, char **argv){
  int ch;
  ...
  if((ch = read_console())){
    switch(ch){
      case 'R':
        right();
      break;
      ...
    }
  }
  ...
}
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А, еще надо глобальные сделать

struct termios *newt, *oldt;
Eddy_Em ☆☆☆☆☆
()
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
 
int kbhit(){
  struct termios oldt, newt;
  int ch;
  int oldf;
 
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
 
  ch = getchar();
 
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
 
  if(ch != EOF){
    ungetc(ch, stdin);
    return 1;
  }
 
  return 0;
}

char kbread() {
  char buf = 0;
  
  struct termios oldt, newt;
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~( ICANON | ECHO );
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  
  while (kbhit()) {
    buf = getchar();
  }
  
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  return buf;
}

main() {
  while(1) {
    printf("%i\n",kbread());
    sleep(1);
  }
}
TheAnonymous ★★★★★
()
Ответ на: комментарий от gbiont

можно твой рэндом точить до ai

у мартина гарднера есть про автомат крестки_нолики с конфетами двух видов и их поеданием как обучением.

т.е не голимый рэндом а дрейф весов по мере обучения.

однако тут возникает вопрос сохранения обученисти между разными заданиями.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.