-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsnakeio.c
More file actions
68 lines (56 loc) · 1.44 KB
/
snakeio.c
File metadata and controls
68 lines (56 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <ncurses.h>
#include "snakeio.h"
#define SNAKE_CHAR "O"
#define SNAKE_HEAD "@"
#define FOOD_CHAR "X"
Screen* new_screen() {
Screen* screen = malloc(sizeof(Screen));
initscr();
noecho();
curs_set(0);
keypad(stdscr, 1); // Enables the arrow keys, among others
nodelay(stdscr, 1); // No blocking
cbreak(); // Do not require EOF or \n before providing input
int x, y;
getmaxyx(stdscr, y, x);
screen->max_x = x;
screen->max_y = y;
return screen;
}
void close_screen(Screen* screen) {
free(screen);
endwin(); // Close screen
}
Direction get_direction() {
int key = ERR, new_key;
while((new_key = getch()) != ERR) {
key = new_key;
}
switch(key) {
case KEY_UP:
return UP;
case KEY_DOWN:
return DOWN;
case KEY_LEFT:
return LEFT;
case KEY_RIGHT:
return RIGHT;
case ERR:
return NO_DIRECTION;
}
}
void draw_frame(Snake* snake, FoodList* food_list) {
clear(); // Clear screen
Segment* seg = snake->head;
while(seg != NULL) {
mvprintw(seg->y_pos, seg->x_pos,
seg == snake->head ? SNAKE_HEAD : SNAKE_CHAR);
seg = seg->next;
}
FoodItem* fi = food_list->first;
while(fi != NULL) {
mvprintw(fi->y_pos, fi->x_pos, FOOD_CHAR);
fi = fi->next;
}
refresh(); // Refresh screen
}