diff --git a/config.h b/config.h index 6b50bd0..67d677a 100644 --- a/config.h +++ b/config.h @@ -8,13 +8,18 @@ #define left_key 'h' #define quit_key 'q' -// The starting legnth of the snake +// Starting legnth of the snake static const size_t starting_len = 15; +// Number of apples on the field +static const size_t n_apples = 10; + // Speed of snake (milliseconds between moves) static const int screen_speed = 150; // Character for each snake segment static const char snake_ch = '#'; +// Character for apples +static const char apple_ch = '*'; #endif diff --git a/nsnake b/nsnake index a7ff1bf..fe9d052 100755 Binary files a/nsnake and b/nsnake differ diff --git a/obj/apple.o b/obj/apple.o index 34e4548..62ef403 100644 Binary files a/obj/apple.o and b/obj/apple.o differ diff --git a/obj/field.o b/obj/field.o new file mode 100644 index 0000000..a7bf743 Binary files /dev/null and b/obj/field.o differ diff --git a/obj/main.o b/obj/main.o index d9c7a06..712eeb3 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/snake.o b/obj/snake.o index 0cb51d4..9e7108a 100644 Binary files a/obj/snake.o and b/obj/snake.o differ diff --git a/src/apple.c b/src/apple.c index ae5951e..61e880f 100644 --- a/src/apple.c +++ b/src/apple.c @@ -18,3 +18,11 @@ Apple *new_apple(int x, int y) { void delete_apple(Apple *a) { free_s(a); } + +void apple_relocate(Apple *a, int x, int y) { + if (!a) + die("apple.c: apple_relocate(): 'a' is null pointer"); + + a->x = x; + a->y = y; +} diff --git a/src/field.c b/src/field.c new file mode 100644 index 0000000..acdd947 --- /dev/null +++ b/src/field.c @@ -0,0 +1,36 @@ +#include +#include + +#include "include/main.h" +#include "include/field.h" +#include "include/apple.h" +#include "../config.h" + +Field *new_field(size_t num, int x_max, int y_max) { + Field *f; + f = (Field *)malloc(sizeof(Field)); + if (!f) + die("field.c: new_field(): 'f' is null pointer"); + + f->num = num; + f->x_max = x_max; + f->y_max = y_max; + f->a = (Apple **)malloc(sizeof(Apple *) * f->num); + if (!f->a) + die("field.c: new_field(): 'f->a' is null pointer"); + for (size_t i = 0; i < f->num; i++) + f->a[i] = new_apple(irandom(5, f->x_max - 5), irandom(5, f->y_max - 5)); + + return f; +} + +void delete_field(Field *f) { + for (size_t i = 0; i < f->num; i++) + delete_apple(f->a[i]); + free_s(f); +} + +void field_print(Field *f) { + for (size_t i = 0; i < f->num; i++) + mvaddch(f->a[i]->y, f->a[i]->x, apple_ch); +} diff --git a/src/include/apple.h b/src/include/apple.h index d1333a5..d985e0b 100644 --- a/src/include/apple.h +++ b/src/include/apple.h @@ -9,4 +9,6 @@ typedef struct apple_T { Apple *new_apple(int, int); void delete_apple(Apple *); +void apple_relocate(Apple *, int, int); + #endif diff --git a/src/include/field.h b/src/include/field.h new file mode 100644 index 0000000..2b423cb --- /dev/null +++ b/src/include/field.h @@ -0,0 +1,18 @@ +#ifndef FIELD_H +#define FIELD_H + +#include "apple.h" + +typedef struct field_T { + Apple **a; + size_t num; + int x_max; + int y_max; +} Field; + +Field *new_field(size_t, int, int); +void delete_field(Field *); + +void field_print(Field *); + +#endif diff --git a/src/include/main.h b/src/include/main.h index 5d4df47..02b5028 100644 --- a/src/include/main.h +++ b/src/include/main.h @@ -3,5 +3,6 @@ void die(char *, ...); void free_s(void *); +int irandom(int, int); #endif diff --git a/src/main.c b/src/main.c index 4473b48..9b9a623 100644 --- a/src/main.c +++ b/src/main.c @@ -2,9 +2,11 @@ #include #include #include +#include #include "include/main.h" #include "include/snake.h" +#include "include/field.h" #include "../config.h" void die(char *fmt, ...) { @@ -24,9 +26,18 @@ void free_s(void *p) { p = NULL; } +int irandom(int lower, int upper) { + int i; + i = (rand() % (upper - lower + 1)) + lower; + return i; +} + int main(void) { - int c, dirn; + int c, dirn, score; Snake *s; + Field *f; + + srand(time(NULL)); // init ncurses initscr(); @@ -37,9 +48,15 @@ int main(void) { curs_set(0); s = new_snake(starting_len, getmaxx(stdscr) / 2, getmaxy(stdscr) / 2); + f = new_field(n_apples, getmaxx(stdscr), getmaxy(stdscr)); dirn = UP; + score = 0; while ((c = getch())) { + clear(); + refresh(); + + field_print(f); switch (c) { case up_key: dirn = UP; break; case down_key: dirn = DOWN; break; @@ -48,14 +65,14 @@ int main(void) { case quit_key: goto quit; } snake_forward(s, dirn); - clear(); - refresh(); snake_print(s); + refresh(); napms(screen_speed); } quit: delete_snake(s); + delete_field(f); endwin(); } diff --git a/src/snake.c b/src/snake.c index ad7c5f5..8b2374c 100644 --- a/src/snake.c +++ b/src/snake.c @@ -16,7 +16,7 @@ Snake *new_snake(size_t len, int x, int y) { if (!s->n) die("snake.c: new_snake(): 's->n' is null pointer"); for (size_t i = 0; i < s->len; i++) - s->n[i] = new_segment(x, y--); + s->n[i] = new_segment(x, y++); return s; } @@ -30,6 +30,7 @@ void delete_snake(Snake *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); @@ -44,6 +45,7 @@ void snake_forward(Snake *s , int dirn) { 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); @@ -51,6 +53,9 @@ void snake_forward(Snake *s , int dirn) { } void snake_print(Snake *s) { + if (!s) + die("snake.c: snake_print(): 's' is null pointer"); + for (size_t i = 0; i < s->len; i++) mvaddch(s->n[i]->y, s->n[i]->x, snake_ch); }