diff --git a/config.h b/config.h index 67d677a..fc3d8c9 100644 --- a/config.h +++ b/config.h @@ -9,10 +9,10 @@ #define quit_key 'q' // Starting legnth of the snake -static const size_t starting_len = 15; +static const size_t starting_len = 3; // Number of apples on the field -static const size_t n_apples = 10; +static const size_t n_apples = 5; // Speed of snake (milliseconds between moves) static const int screen_speed = 150; diff --git a/nsnake b/nsnake index 6db3c59..3133435 100755 Binary files a/nsnake and b/nsnake differ diff --git a/obj/apple.o b/obj/apple.o index 62ef403..72d4f8d 100644 Binary files a/obj/apple.o and b/obj/apple.o differ diff --git a/obj/field.o b/obj/field.o index a7bf743..525dc2d 100644 Binary files a/obj/field.o and b/obj/field.o differ diff --git a/obj/main.o b/obj/main.o index 8be61bb..a23e5ff 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/snake.o b/obj/snake.o index 9e7108a..36c3503 100644 Binary files a/obj/snake.o and b/obj/snake.o differ diff --git a/src/apple.c b/src/apple.c index 61e880f..0022610 100644 --- a/src/apple.c +++ b/src/apple.c @@ -19,7 +19,7 @@ void delete_apple(Apple *a) { free_s(a); } -void apple_relocate(Apple *a, int x, int y) { +void apple_move(Apple *a, int x, int y) { if (!a) die("apple.c: apple_relocate(): 'a' is null pointer"); diff --git a/src/field.c b/src/field.c index acdd947..255934d 100644 --- a/src/field.c +++ b/src/field.c @@ -34,3 +34,22 @@ 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); } + +int field_xy_is_apple(Field *f, int x, int y, size_t *p) { + for (size_t i = 0; i < f->num; i++) { + if (f->a[i]->x == x) { + if (f->a[i]->y == y) { + *p = i; + return 1; + } + } + } + return 0; +} + +int field_relocate_apple(Field *f, size_t i) { + if (i > f->num) + return 0; + apple_move(f->a[i], irandom(5, f->x_max - 5), irandom(5, f->y_max - 5)); + return 1; +} diff --git a/src/include/apple.h b/src/include/apple.h index d985e0b..a4fd261 100644 --- a/src/include/apple.h +++ b/src/include/apple.h @@ -9,6 +9,6 @@ typedef struct apple_T { Apple *new_apple(int, int); void delete_apple(Apple *); -void apple_relocate(Apple *, int, int); +void apple_move(Apple *, int, int); #endif diff --git a/src/include/field.h b/src/include/field.h index 2b423cb..c4d2424 100644 --- a/src/include/field.h +++ b/src/include/field.h @@ -14,5 +14,7 @@ Field *new_field(size_t, int, int); void delete_field(Field *); void field_print(Field *); +int field_xy_is_apple(Field *, int, int, size_t *); +int field_relocate_apple(Field *, size_t); #endif diff --git a/src/include/snake.h b/src/include/snake.h index 0fee9d6..fa1b0ed 100644 --- a/src/include/snake.h +++ b/src/include/snake.h @@ -2,6 +2,7 @@ #define SNAKE_H #include "segment.h" +#include "field.h" enum dirn { UP = 0, @@ -20,6 +21,6 @@ void delete_snake(Snake *); void snake_forward(Snake *, int); void snake_print(Snake *); -int snake_eat(Snake *); +int snake_eat(Snake *, Field *); #endif diff --git a/src/main.c b/src/main.c index dbcdf33..4256fb9 100644 --- a/src/main.c +++ b/src/main.c @@ -56,7 +56,6 @@ int main(void) { clear(); refresh(); - field_print(f); switch (c) { case up_key: if (dirn != DOWN) @@ -78,8 +77,13 @@ int main(void) { goto quit; break; } + snake_forward(s, dirn); + score += snake_eat(s, f); + + mvprintw(getmaxy(stdscr) - 1, 0, "score: %d", score); snake_print(s); + field_print(f); refresh(); napms(screen_speed); diff --git a/src/snake.c b/src/snake.c index 8b2374c..84eb963 100644 --- a/src/snake.c +++ b/src/snake.c @@ -4,6 +4,8 @@ #include "include/main.h" #include "include/segment.h" #include "include/snake.h" +#include "include/field.h" +#include "include/apple.h" #include "../config.h" Snake *new_snake(size_t len, int x, int y) { @@ -60,4 +62,24 @@ void snake_print(Snake *s) { mvaddch(s->n[i]->y, s->n[i]->x, snake_ch); } -int snake_eat(Snake *); +int snake_eat(Snake *s, Field *f) { + size_t i; + Segment *c; + + if (field_xy_is_apple(f, s->n[0]->x, s->n[0]->y, &i)) { + if (!field_relocate_apple(f, i)) + return 0; + + c = new_segment(s->n[s->len - 1]->prev_x, s->n[s->len - 1]->prev_y); + + s->n = (Segment **)realloc(s->n, sizeof(Segment *) * ++(s->len)); + if (!s->n) + die("snake.c: snake_eat(): 's->n' is null pointer"); + + s->n[s->len - 1] = c; + + return 1; + } + + return 0; +}