snake can eat, display score
This commit is contained in:
parent
9feeb4e2d5
commit
af579fb850
13 changed files with 55 additions and 7 deletions
4
config.h
4
config.h
|
@ -9,10 +9,10 @@
|
||||||
#define quit_key 'q'
|
#define quit_key 'q'
|
||||||
|
|
||||||
// Starting legnth of the snake
|
// 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
|
// 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)
|
// Speed of snake (milliseconds between moves)
|
||||||
static const int screen_speed = 150;
|
static const int screen_speed = 150;
|
||||||
|
|
BIN
nsnake
BIN
nsnake
Binary file not shown.
BIN
obj/apple.o
BIN
obj/apple.o
Binary file not shown.
BIN
obj/field.o
BIN
obj/field.o
Binary file not shown.
BIN
obj/main.o
BIN
obj/main.o
Binary file not shown.
BIN
obj/snake.o
BIN
obj/snake.o
Binary file not shown.
|
@ -19,7 +19,7 @@ void delete_apple(Apple *a) {
|
||||||
free_s(a);
|
free_s(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
void apple_relocate(Apple *a, int x, int y) {
|
void apple_move(Apple *a, int x, int y) {
|
||||||
if (!a)
|
if (!a)
|
||||||
die("apple.c: apple_relocate(): 'a' is null pointer");
|
die("apple.c: apple_relocate(): 'a' is null pointer");
|
||||||
|
|
||||||
|
|
19
src/field.c
19
src/field.c
|
@ -34,3 +34,22 @@ void field_print(Field *f) {
|
||||||
for (size_t i = 0; i < f->num; i++)
|
for (size_t i = 0; i < f->num; i++)
|
||||||
mvaddch(f->a[i]->y, f->a[i]->x, apple_ch);
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,6 @@ typedef struct apple_T {
|
||||||
Apple *new_apple(int, int);
|
Apple *new_apple(int, int);
|
||||||
void delete_apple(Apple *);
|
void delete_apple(Apple *);
|
||||||
|
|
||||||
void apple_relocate(Apple *, int, int);
|
void apple_move(Apple *, int, int);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,5 +14,7 @@ Field *new_field(size_t, int, int);
|
||||||
void delete_field(Field *);
|
void delete_field(Field *);
|
||||||
|
|
||||||
void field_print(Field *);
|
void field_print(Field *);
|
||||||
|
int field_xy_is_apple(Field *, int, int, size_t *);
|
||||||
|
int field_relocate_apple(Field *, size_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define SNAKE_H
|
#define SNAKE_H
|
||||||
|
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
|
#include "field.h"
|
||||||
|
|
||||||
enum dirn {
|
enum dirn {
|
||||||
UP = 0,
|
UP = 0,
|
||||||
|
@ -20,6 +21,6 @@ void delete_snake(Snake *);
|
||||||
|
|
||||||
void snake_forward(Snake *, int);
|
void snake_forward(Snake *, int);
|
||||||
void snake_print(Snake *);
|
void snake_print(Snake *);
|
||||||
int snake_eat(Snake *);
|
int snake_eat(Snake *, Field *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -56,7 +56,6 @@ int main(void) {
|
||||||
clear();
|
clear();
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
field_print(f);
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case up_key:
|
case up_key:
|
||||||
if (dirn != DOWN)
|
if (dirn != DOWN)
|
||||||
|
@ -78,8 +77,13 @@ int main(void) {
|
||||||
goto quit;
|
goto quit;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
snake_forward(s, dirn);
|
snake_forward(s, dirn);
|
||||||
|
score += snake_eat(s, f);
|
||||||
|
|
||||||
|
mvprintw(getmaxy(stdscr) - 1, 0, "score: %d", score);
|
||||||
snake_print(s);
|
snake_print(s);
|
||||||
|
field_print(f);
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
napms(screen_speed);
|
napms(screen_speed);
|
||||||
|
|
24
src/snake.c
24
src/snake.c
|
@ -4,6 +4,8 @@
|
||||||
#include "include/main.h"
|
#include "include/main.h"
|
||||||
#include "include/segment.h"
|
#include "include/segment.h"
|
||||||
#include "include/snake.h"
|
#include "include/snake.h"
|
||||||
|
#include "include/field.h"
|
||||||
|
#include "include/apple.h"
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
|
|
||||||
Snake *new_snake(size_t len, int x, int y) {
|
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);
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue