diff --git a/Makefile b/Makefile index 34d9f88..4df41cb 100644 --- a/Makefile +++ b/Makefile @@ -11,10 +11,10 @@ INC = $(wildcard $(INCDIR)/*.h) _OBJ = $(SRC:.c=.o) OBJ = $(subst $(SRCDIR),$(OBJDIR),$(_OBJ)) -$(OUTFILE): $(OBJ) +$(OUTFILE): $(OBJ) config.h $(CC) $(CFLAGS) -o $(OUTFILE) $(OBJ) -$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INCDIR)/%.h +$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INCDIR)/%.h config.h @mkdir -p $(@D) $(CC) $(CFLAGS) -o $@ -c $< diff --git a/config.h b/config.h new file mode 100644 index 0000000..6b50bd0 --- /dev/null +++ b/config.h @@ -0,0 +1,20 @@ +#ifndef CONFIG_H +#define CONFIG_H + +// Keybinds +#define up_key 'k' +#define down_key 'j' +#define right_key 'l' +#define left_key 'h' +#define quit_key 'q' + +// The starting legnth of the snake +static const size_t starting_len = 15; + +// Speed of snake (milliseconds between moves) +static const int screen_speed = 150; + +// Character for each snake segment +static const char snake_ch = '#'; + +#endif diff --git a/nsnake b/nsnake new file mode 100755 index 0000000..a7ff1bf Binary files /dev/null and b/nsnake differ diff --git a/obj/apple.o b/obj/apple.o new file mode 100644 index 0000000..34e4548 Binary files /dev/null and b/obj/apple.o differ diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000..d9c7a06 Binary files /dev/null and b/obj/main.o differ diff --git a/obj/segment.o b/obj/segment.o new file mode 100644 index 0000000..c3f0a83 Binary files /dev/null and b/obj/segment.o differ diff --git a/obj/snake.o b/obj/snake.o new file mode 100644 index 0000000..0cb51d4 Binary files /dev/null and b/obj/snake.o differ diff --git a/src/apple.c b/src/apple.c index e69de29..ae5951e 100644 --- a/src/apple.c +++ b/src/apple.c @@ -0,0 +1,20 @@ +#include + +#include "include/main.h" +#include "include/apple.h" + +Apple *new_apple(int x, int y) { + Apple *a; + a = (Apple *)malloc(sizeof(Apple)); + if (!a) + die("apple.c: new_apple(): 'a' is null pointer"); + + a->x = x; + a->y = y; + + return a; +} + +void delete_apple(Apple *a) { + free_s(a); +} diff --git a/src/include/apple.h b/src/include/apple.h index e69de29..d1333a5 100644 --- a/src/include/apple.h +++ b/src/include/apple.h @@ -0,0 +1,12 @@ +#ifndef APPLE_H +#define APPLE_H + +typedef struct apple_T { + int x; + int y; +} Apple; + +Apple *new_apple(int, int); +void delete_apple(Apple *); + +#endif diff --git a/src/include/snake.h b/src/include/snake.h index 85100a6..0fee9d6 100644 --- a/src/include/snake.h +++ b/src/include/snake.h @@ -1,6 +1,8 @@ #ifndef SNAKE_H #define SNAKE_H +#include "segment.h" + enum dirn { UP = 0, DOWN, @@ -9,15 +11,15 @@ enum dirn { }; typedef struct snake_T { - Segments **n; + Segment **n; size_t len; - int head_dirn; } Snake; -Snake *new_snake(size_t, int, int, int); -void *delete_snake(Snake *); +Snake *new_snake(size_t, int, int); +void delete_snake(Snake *); void snake_forward(Snake *, int); +void snake_print(Snake *); int snake_eat(Snake *); #endif diff --git a/src/main.c b/src/main.c index 0fb6ee0..4473b48 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,11 @@ #include #include #include +#include #include "include/main.h" +#include "include/snake.h" +#include "../config.h" void die(char *fmt, ...) { va_list args; @@ -12,7 +15,7 @@ void die(char *fmt, ...) { vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); - va_end(args) + va_end(args); exit(1); } @@ -20,3 +23,39 @@ void free_s(void *p) { free(p); p = NULL; } + +int main(void) { + int c, dirn; + Snake *s; + + // init ncurses + initscr(); + keypad(stdscr, true); + noecho(); + cbreak(); + nodelay(stdscr, true); + curs_set(0); + + s = new_snake(starting_len, getmaxx(stdscr) / 2, getmaxy(stdscr) / 2); + dirn = UP; + + while ((c = getch())) { + switch (c) { + case up_key: dirn = UP; break; + case down_key: dirn = DOWN; break; + case right_key: dirn = RIGHT; break; + case left_key: dirn = LEFT; break; + case quit_key: goto quit; + } + snake_forward(s, dirn); + clear(); + refresh(); + snake_print(s); + refresh(); + napms(screen_speed); + } + +quit: + delete_snake(s); + endwin(); +} diff --git a/src/segment.c b/src/segment.c index 366bcc0..2b6b857 100644 --- a/src/segment.c +++ b/src/segment.c @@ -1,10 +1,11 @@ #include +#include #include "include/main.h" #include "include/segment.h" Segment *new_segment(int x, int y) { - Segment c; + Segment *c; c = (Segment *)malloc(sizeof(Segment)); if (!c) die("segment.c: new_segment(): 'c' is null pointer"); diff --git a/src/snake.c b/src/snake.c index 8084b61..ad7c5f5 100644 --- a/src/snake.c +++ b/src/snake.c @@ -1,23 +1,58 @@ #include +#include #include "include/main.h" #include "include/segment.h" #include "include/snake.h" +#include "../config.h" -Snake *new_snake(size_t len, int head_dirn, int x, int y) { +Snake *new_snake(size_t len, int x, int y) { Snake *s; - s = (Snake *)malloc(sizeof(Snake)); - if (!s) + s = (Snake *)malloc(sizeof(Snake)); if (!s) die("snake.c: new_snake(): 's' is null pointer"); - s->n = (Segment **)malloc(sizeof(Segment *) * len); + s->len = len; + s->n = (Segment **)malloc(sizeof(Segment *) * s->len); if (!s->n) die("snake.c: new_snake(): 's->n' is null pointer"); - for (size_t i = 0; i < len; i++) { - s->*n[i] = new_segment(x, y--); - } -} -void *delete_snake(Snake *); + for (size_t i = 0; i < s->len; i++) + s->n[i] = new_segment(x, y--); + + return s; +} + +void delete_snake(Snake *s) { + for (size_t i = 0; i < s->len; i++) + delete_segment(s->n[i]); + free_s(s); +} + +void snake_forward(Snake *s , int dirn) { + if (!s) + die("snake.c: snake_forward(): 's' is null pointer"); + switch (dirn) { + case UP: + segment_move(s->n[0], s->n[0]->x, s->n[0]->y - 1); + break; + case DOWN: + segment_move(s->n[0], s->n[0]->x, s->n[0]->y + 1); + break; + case RIGHT: + segment_move(s->n[0], s->n[0]->x + 1, s->n[0]->y); + break; + case LEFT: + segment_move(s->n[0], s->n[0]->x - 1, s->n[0]->y); + break; + } + for (size_t i = 1; i < s->len; i++) + segment_move(s->n[i], s->n[i - 1]->prev_x, + s->n[i - 1]->prev_y); + +} + +void snake_print(Snake *s) { + for (size_t i = 0; i < s->len; i++) + mvaddch(s->n[i]->y, s->n[i]->x, snake_ch); +} -void snake_forward(Snake *, int); int snake_eat(Snake *);