nTown/main.cpp

109 lines
2.7 KiB
C++

#include <ncurses.h>
#include <ctime>
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();
}