#include #include enum dir { N = 0, NE = 1, E = 2, SE = 3, S = 4, SW = 5, W = 6, NW = 7 }; dir rotate(dir initial_d, int rot_dir) { return (dir)(((int)initial_d + rot_dir + 8) % 8); } int main() { initscr(); start_color(); cbreak(); noecho(); keypad(stdscr, TRUE); curs_set(0); int pos_x = 1; int pos_y = 1; dir direction = dir::SE; mvaddch(pos_y, pos_x, 'O'); int ch; while ((ch = wgetch(stdscr)) != 'q') { int rotd = 0; int movval = 0; switch (ch) { case KEY_LEFT: rotd = -1; break; case KEY_RIGHT: rotd = 1; break; case KEY_DOWN: movval = -1; break; case KEY_UP: movval = 1; break; case 'c': pos_y = LINES / 2; pos_x = COLS / 2; default: break; }; direction = rotate(direction, rotd); switch (direction) { case dir::N: pos_y -= movval; break; case dir::S: pos_y += movval; break; case dir::W: pos_x -= movval; break; case dir::E: pos_x += movval; break; case dir::NE: pos_x += movval; pos_y -= movval; break; case dir::NW: pos_x -= movval; pos_y -= movval; break; case dir::SE: pos_x += movval; pos_y += movval; break; case dir::SW: pos_x -= movval; pos_y += movval; break; default: break; }; clear(); mvaddch(pos_y, pos_x, 'O'); switch(direction) { case dir::N: case dir::S: mvaddch(pos_y, pos_x-1, '-'); mvaddch(pos_y, pos_x+1, '-'); break; case dir::E: case dir::W: mvaddch(pos_y-1, pos_x, '|'); mvaddch(pos_y+1, pos_x, '|'); break; case dir::NE: case dir::SW: mvaddch(pos_y-1, pos_x-1, '\\'); mvaddch(pos_y+1, pos_x+1, '\\'); break; case dir::NW: case dir::SE: mvaddch(pos_y+1, pos_x-1, '/'); mvaddch(pos_y-1, pos_x+1, '/'); break; default: break; }; refresh(); } endwin(); }