/* Raffael Himmelreich */ /* gcc ambassador_of_pain.c -o aop -lcurses */ /* ./aop aop-level-1.txt ... aop-level-n.txt*/ #include #include #include #include #include #include #include #define PROCESS(y,x) field[posy][posx] = ' '; \ if( check(field[posy+y][posx+x]) > 0) { \ if(level+1 == argc) { endwin(); printf("Well done!\n"); return 0; } \ memset(field, ' ', 25*81); \ read_field(argv, ++level); \ dir = 0; \ } else if( check(field[posy+y][posx+x]) < 0) { \ if(field[posy+y][posx+x] == '.') { \ lifes++; \ field[posy=posy+y][posx=posx+x] = 'O'; \ } else { \ int tmp_y=posy; \ int tmp_x=posx; \ if(--lifes == 0) { endwin(); printf("Sucker.\n"); return 1; } \ field[tmp_y][tmp_x] = '.'; \ read_field(argv, level); \ dir = 0; \ } \ } \ else { field[posy=posy+y][posx=posx+x] = 'O'; } int posx, posy, dir, lifes; char field[25][81]; enum { HIGHT = 25, WIDTH = 80, UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4 }; int read_field(char *argv[], int nr) { int fd, i, j; char c; fd = open(argv[nr], O_RDONLY); for(i=0; i <= HIGHT; i++) { for(j=0; j <= WIDTH; j++) { if( !read(fd, &c, 1) ) return 0; if( field[i][j] == '.' && c == 'O') lifes++; else if( field[i][j] == '.') continue; if( c == 'O' ) { posx = j; posy = i; } field[i][j] = c; } } return 0; } int check(char c) { if (c == ' ') return 0; else if(c == '@') return 1; else return -1; } int main(int argc, char *argv[]) { int x,y,c,level=0; if(argc == 1) { fprintf(stderr, "Usage: %s aop-level-1.txt ... aop-level-n.txt\n", argv[0]); return 1; } memset(field, ' ', 25*81); initscr(); cbreak(); noecho(); curs_set(0); keypad(stdscr, TRUE); nodelay(stdscr, 1); read_field(argv, ++level); lifes = 5; while( (c=getch()) != 'q' ) { switch(c) { case KEY_UP: dir = UP; break; case KEY_DOWN: dir = DOWN; break; case KEY_LEFT: dir = LEFT; break; case KEY_RIGHT: dir = RIGHT; break; } switch(dir) { case UP: PROCESS(-1,0); break; case DOWN: PROCESS(1,0); break; case LEFT: PROCESS(0,-1); break; case RIGHT: PROCESS(0,1); break; } for(y=0; y < HIGHT; y++) for(x=0; x < WIDTH; x++) mvaddch(y, x, field[y][x]); mvprintw(0, 0, "Lifes: %d", lifes); refresh(); usleep(dir==LEFT || dir==RIGHT ? 50000: 100000); } endwin(); return 0; }