135 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdlib.h>
 | |
| #include <ncurses.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| void quit();
 | |
| void draw_borders(WINDOW *screen);
 | |
| int move_player(int keypress, int* player_y, int* player_x);
 | |
| 
 | |
| void refresh_window(WINDOW *screen);
 | |
| 
 | |
| 
 | |
| int main(int argc, char *argv[]){
 | |
| 	int max_y, max_x, new_y, new_x, field_max_x, field_max_y, player_x, player_y;
 | |
| 	int next_x = 0;
 | |
| 	int keypress;
 | |
|   int control_size = 5;
 | |
| 
 | |
| 	initscr(); // Initialize window
 | |
| 	noecho(); // Don't echo keypresses
 | |
| 	curs_set(FALSE); // No cursor
 | |
| 	nodelay(stdscr,1); // Stop getch from waiting. 
 | |
| 	
 | |
| 	getmaxyx(stdscr, max_y, max_x); //Get the max x/y of the screen
 | |
| 
 | |
| 
 | |
| 	WINDOW *field = newwin(max_y - control_size, max_x, 0, 0);
 | |
| 	WINDOW *controls = newwin(control_size, max_x, max_y - control_size, 0);
 | |
| 	
 | |
| 	draw_borders(field);
 | |
| 	draw_borders(controls);
 | |
|   
 | |
| 
 | |
| 	//center player on field
 | |
| 	getmaxyx(field, field_max_y, field_max_x);
 | |
| 	
 | |
| 	player_x = field_max_x/2;
 | |
| 	player_y = field_max_y/2;
 | |
| 	
 | |
| 	while(1){ 
 | |
| 		getmaxyx(stdscr, new_y, new_x);
 | |
| 
 | |
| 		keypress = getch(); // Listen for commands; must be before window refresh
 | |
| 		
 | |
| 
 | |
| 		if (new_y != max_y || new_x != max_x) {
 | |
| 			max_x = new_x;
 | |
| 			max_y = new_y;
 | |
| 
 | |
| 			wresize(field, new_y - control_size, new_x);
 | |
| 			wresize(controls, control_size, new_x);
 | |
| 			mvwin(controls, new_y - control_size, 0);
 | |
| 			wclear(stdscr);
 | |
| 			wclear(field);
 | |
| 			wclear(controls);
 | |
| 
 | |
| 			draw_borders(field);
 | |
| 			draw_borders(controls);
 | |
| 			wrefresh(stdscr);
 | |
| 		}
 | |
| 
 | |
| 		mvwprintw(field, 1, 1, "Field");
 | |
| 		mvwprintw(field, player_y, player_x, "o");
 | |
| 		
 | |
| 		mvwprintw(controls, 1, 1, "Commands");
 | |
| 		mvwprintw(controls, 3, 1, "^Q to quit");
 | |
| 
 | |
| 		wrefresh(field);
 | |
| 		wrefresh(controls);
 | |
| 
 | |
| 		if (keypress != -1) {
 | |
| 			move_player(keypress, &player_y, &player_x);
 | |
| 			refresh_window(field);
 | |
| 		}
 | |
| 	}
 | |
| 	endwin();
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int move_player(int keypress, int* player_y, int* player_x){
 | |
| 		if (keypress == 'w'){
 | |
| 			*player_y = *player_y - 1;
 | |
| 		}
 | |
| 		
 | |
| 		else if (keypress == 'a'){
 | |
| 			*player_x = *player_x - 1;
 | |
| 		}
 | |
| 		else if (keypress == 's'){
 | |
| 			*player_y = *player_y + 1;
 | |
| 		}
 | |
| 		else if (keypress == 'd'){
 | |
| 			*player_x = *player_x + 1;
 | |
| 		}
 | |
| 		
 | |
| 		else if (keypress == 17) {
 | |
| 			quit();
 | |
| 		}
 | |
| 
 | |
| }
 | |
| 
 | |
| void refresh_window(WINDOW *screen) {
 | |
| 	wclear(screen);
 | |
| 	draw_borders(screen);
 | |
| 	wrefresh(screen);
 | |
| }
 | |
| 
 | |
| void draw_borders(WINDOW *screen) {
 | |
|   int x, y, i;
 | |
| 
 | |
|   getmaxyx(screen, y, x);
 | |
| 
 | |
|   // 4 corners
 | |
|   mvwprintw(screen, 0, 0, "+");
 | |
|   mvwprintw(screen, y - 1, 0, "+");
 | |
|   mvwprintw(screen, 0, x - 1, "+");
 | |
|   mvwprintw(screen, y - 1, x - 1, "+");
 | |
| 
 | |
|   // sides
 | |
|   for (i = 1; i < (y - 1); i++) {
 | |
|     mvwprintw(screen, i, 0, "|");
 | |
|     mvwprintw(screen, i, x - 1, "|");
 | |
|   }
 | |
| 
 | |
|   // top and bottom
 | |
|   for (i = 1; i < (x - 1); i++) {
 | |
|     mvwprintw(screen, 0, i, "-");
 | |
|     mvwprintw(screen, y - 1, i, "-");
 | |
|   }
 | |
| }
 | |
| 
 | |
| void quit(){
 | |
| 	endwin();
 | |
| 	exit(0);
 | |
| }
 |