// Учебная программа под ОС Linux "Управление" // Автор Мальшаков Григорий Викторович 2007 г. // www.malshakov.ru #include #include #include // Прототип программной задержки void delay (long); bool MoveExists = true; // Самостоятельное движение X int MoveType = 0, Kx = 4, Ky = 10; // Начальное движение X // Прототип функции движения void Movement(void); int main() { if (!(initscr())){ // инициализация ncurses (установка структур данных, выделение памяти) printf("init error\n"); } else { noecho(); // задаем режим чтобы введенные пользователем символы на экранне не выводились // отключает эхо curs_set(false); // убираем с экрана мигающий курсор // Оформляем экран (рисуем на экране границы) addstr(" <<< Vichislitelnaya praktika 2007 *** MAI *** >>>"); move(0,2); vline('|',24); move(0,75); vline('|',24); move(1,3); hline('-',72); move(19,3); hline('-',72); move(23,3); hline('-',72); move(23,57); addstr("www.malshakov.ru"); move(21,5); addstr ("[I] - UP [M] - DOUN [J] - LEFT [L] - RIGHT [Q] - QUIT"); // устанавливаем параметры для управления функцией getch keypad(stdscr,1); // getch теперь будет возвращать коды клавиш KEY_UP, KEY_DOWN, KEY_LEFT и т.д. timeout(0); // getch теперь будет возвращать управление через 0 сек. даже если нет нажатых клавиш int myc; bool loop=true; while (loop == true){ Movement(); myc = getch(); switch(myc){ case 'Q': case 'q': // выходим из программы loop = false; break; case KEY_UP: case 'i': case 'I': mvaddch(Ky,Kx,' '); // стираем старый символ mvaddch(--Ky,Kx,'X'); // рисуем новый символ со смещением вверх refresh(); // обновляем экран MoveExists = false; // отключаем автоматическое движение break; case KEY_DOWN: case 'm': case 'M': mvaddch(Ky,Kx,' '); // стираем старый символ mvaddch(++Ky,Kx,'X'); // рисуем новый символ со смещением вниз refresh(); // обновляем экран MoveExists = false; // отключаем автоматическое движение break; case KEY_LEFT: case 'j': case 'J': mvaddch(Ky,Kx,' '); // стираем старый символ mvaddch(Ky,--Kx,'X'); // рисуем новый символ со смещением влево refresh(); // обновляем экран MoveExists = false; // отключаем автоматическое движение break; case KEY_RIGHT: case 'l': case 'L': mvaddch(Ky,Kx,' '); // стираем старый символ mvaddch(Ky,++Kx,'X'); // рисуем новый символ со смещением вправо refresh(); // обновляем экран MoveExists = false; // отключаем автоматическое движение break; default: break; } } endwin(); } return 0; } // автоматическое перемещение X-а по экрану void Movement(){ if (MoveExists==true) { delay(2); mvaddch(Ky, Kx, ' '); // стираем старый символ switch(MoveType){ case 0: // движение вправо ++Kx; if (Kx==73) MoveType=1; break; case 1: // движение вверх --Ky; if (Ky==2) MoveType=2; break; case 2: // движение влево --Kx; if (Kx==3) MoveType=3; break; case 3: // движение вниз ++Ky; if (Ky==18) MoveType=0; break; default: break; } mvaddch(Ky,Kx,'X'); // рисуем новый символ (в новом месте) refresh(); // обновляем экран } } // программная задержка void delay (long duration){ // В цикле вызываем обновления экрана №-е количество раз для задержки for (long ii=0;ii<1000*duration;++ii) refresh(); }