Small snake game in C
Commit 7dc23a551ade
tarball1 file changed+58-52
@@ -46,8 +46,13 @@ typedef struct selected {
4646
int16_t y;4747
} selected;4848
49
+typedef struct snake_part {50
+ selected coords;51
+ direction directions[2];52
+} snake_part;53
+4954
typedef struct snake {50
- selected position[MAX_LENGTH];55
+ snake_part position[MAX_LENGTH];5156
uint16_t length;5257
} snake;5358
@@ -198,14 +203,19 @@ int main(int argc, char *args[]) {
198203
snake my_snake = {};199204
my_snake.length = STARTING_LENGTH;200205
206
+ direction shift = RIGHT;207
+ direction tmp_direction = shift;208
+201209
{202210
uint16_t i;203211
204
- my_snake.position[0].y = HEIGHT >> 1;205
- my_snake.position[0].x = WIDTH >> 1;212
+ my_snake.position[0].coords.y = HEIGHT >> 1;213
+ my_snake.position[0].coords.x = WIDTH >> 1;214
+ my_snake.position[0].directions[0] = shift;215
+ my_snake.position[0].directions[1] = NO_DIRECTION;206216
for (i = 1; i < my_snake.length; i++) {207
- my_snake.position[i].y = -1;208
- my_snake.position[i].x = -1;217
+ my_snake.position[i].coords.y = -1;218
+ my_snake.position[i].coords.x = -1;209219
}210220
}211221
@@ -222,8 +232,6 @@ int main(int argc, char *args[]) {
222232
if ((too_small = draw_board(board, current_size, true, false)))223233
paused = true;224234
225
- direction shift = RIGHT;226
- direction tmp_direction = shift;227235
228236
bool run = true;229237
@@ -279,38 +287,39 @@ int main(int argc, char *args[]) {
279287
shift = tmp_direction;280288
}281289
290
+ my_snake.position[0].directions[1] = my_snake.position[0].directions[0];291
+ my_snake.position[0].directions[0] = shift;292
+282293
uint16_t i;283
- for (i = my_snake.length; i > 0; i--) {284
- my_snake.position[i].y = my_snake.position[i - 1].y;285
- my_snake.position[i].x = my_snake.position[i - 1].x;286
- }294
+ for (i = my_snake.length; i > 0; i--)295
+ my_snake.position[i] = my_snake.position[i - 1];287296
288297
switch (shift) {289298
case UP:290
- my_snake.position[0].y =291
- ((my_snake.position[0].y + HEIGHT - 1) % HEIGHT);299
+ my_snake.position[0].coords.y =300
+ ((my_snake.position[0].coords.y + HEIGHT - 1) % HEIGHT);292301
break;293302
case DOWN:294
- my_snake.position[0].y = ((my_snake.position[0].y + 1) % HEIGHT);303
+ my_snake.position[0].coords.y = ((my_snake.position[0].coords.y + 1) % HEIGHT);295304
break;296305
case LEFT:297
- my_snake.position[0].x =298
- ((my_snake.position[0].x + WIDTH - 1) % WIDTH);306
+ my_snake.position[0].coords.x =307
+ ((my_snake.position[0].coords.x + WIDTH - 1) % WIDTH);299308
break;300309
case RIGHT:301
- my_snake.position[0].x = ((my_snake.position[0].x + 1) % WIDTH);310
+ my_snake.position[0].coords.x = ((my_snake.position[0].coords.x + 1) % WIDTH);302311
break;303312
default:304313
goto end_of_program;305314
break;306315
}307316
308
- uint8_t head_y = my_snake.position[0].y;309
- uint8_t head_x = my_snake.position[0].x;317
+ uint8_t head_y = my_snake.position[0].coords.y;318
+ uint8_t head_x = my_snake.position[0].coords.x;310319
311320
for (i = 1; i < my_snake.length; i++) {312
- int16_t x = my_snake.position[i].x;313
- int16_t y = my_snake.position[i].y;321
+ int16_t x = my_snake.position[i].coords.x;322
+ int16_t y = my_snake.position[i].coords.y;314323
315324
if (x == head_x && y == head_y) {316325
printf("\n\nHAHA LOST!!!\n\n");@@ -352,49 +361,46 @@ void update_field(snake my_snake, char board[HEIGHT][WIDTH][STRING_LEN],
352361
}353362
354363
for (i = 0; i < my_snake.length; i++) {355
- int16_t x = my_snake.position[i].x;356
- int16_t y = my_snake.position[i].y;364
+ int16_t x = my_snake.position[i].coords.x;365
+ int16_t y = my_snake.position[i].coords.y;357366
if (x >= 0 && y >= 0) {358367
if (!i) {359
- if (x == (my_snake.position[i + 1].x + 1) % WIDTH) {368
+ if (my_snake.position[i].directions[0] == RIGHT) {360369
strcpy(board[y][x], "\033[33m═\033[31mX\033[0m");361370
} else {362371
strcpy(board[y][x], "\033[31m X\033[0m");363372
}364
- } else if (i == my_snake.length - 1) {365
- if (x != my_snake.position[i - 1].x) {366
- strcpy(board[y][x], "\033[33m══\033[0m");367
- } else {368
- strcpy(board[y][x], "\033[33m ║\033[0m");369
- }370373
} else {371
- if (x != my_snake.position[i - 1].x &&372
- x != my_snake.position[i + 1].x) {374
+ 375
+ direction smaller = my_snake.position[i].directions[0];376
+ direction bigger = my_snake.position[i].directions[1];377
+378
+ direction first = my_snake.position[i].directions[0];379
+ direction second = my_snake.position[i].directions[1];380
+381
+ if (bigger < smaller) {382
+ direction tmp = smaller;383
+ smaller = bigger;384
+ bigger = tmp;385
+ }386
+387
+388
+ if (smaller % 2 != 0 && bigger % 2 == 1) {373389
strcpy(board[y][x], "\033[33m══\033[0m");374
- } else if (y != my_snake.position[i - 1].y &&375
- y != my_snake.position[i + 1].y) {390
+ } else if ((!(smaller % 2) || smaller % 2 == -1) && !(bigger % 2)) {376391
strcpy(board[y][x], "\033[33m ║\033[0m");377
- } else if ((y == (my_snake.position[i - 1].y + 1) % HEIGHT &&378
- x == (my_snake.position[i + 1].x + 1) % WIDTH) ||379
- (y == (my_snake.position[i + 1].y + 1) % HEIGHT &&380
- x == (my_snake.position[i - 1].x + 1) % WIDTH)) {381
- strcpy(board[y][x], "\033[33m═╝\033[0m");382
- } else if ((y == (my_snake.position[i - 1].y + (HEIGHT - 1)) % HEIGHT &&383
- x == (my_snake.position[i + 1].x + 1) % WIDTH) ||384
- (y == (my_snake.position[i + 1].y + HEIGHT - 1) % HEIGHT &&385
- x == (my_snake.position[i - 1].x + 1) % WIDTH)) {392
+ } else if ((first == DOWN && second == RIGHT) || (first == LEFT && second == UP)) {386393
strcpy(board[y][x], "\033[33m═╗\033[0m");387
- } else if ((y == (my_snake.position[i - 1].y + 1) % HEIGHT &&388
- x == (my_snake.position[i + 1].x + (WIDTH - 1)) % WIDTH) ||389
- (y == (my_snake.position[i + 1].y + 1) % HEIGHT &&390
- x == (my_snake.position[i - 1].x + (WIDTH - 1)) % WIDTH)) {391
- strcpy(board[y][x], "\033[33m ╚\033[0m");392
- } else if ((y == (my_snake.position[i - 1].y + (HEIGHT - 1)) % HEIGHT &&393
- x == (my_snake.position[i + 1].x + (WIDTH - 1)) % WIDTH) ||394
- (y == (my_snake.position[i + 1].y + (HEIGHT - 1)) % HEIGHT &&395
- x == (my_snake.position[i - 1].x + (WIDTH - 1)) % WIDTH)) {394
+ } else if ((first == UP && second == RIGHT) || (first == LEFT && second == DOWN)) {395
+ strcpy(board[y][x], "\033[33m═╝\033[0m");396
+ } else if ((first == DOWN && second == LEFT) || (first == RIGHT && second == UP)) {396397
strcpy(board[y][x], "\033[33m ╔\033[0m");398
+ } else if ((first == UP && second == LEFT) || (first == RIGHT && second == DOWN)) {399
+ strcpy(board[y][x], "\033[33m ╚\033[0m");400
+ } else {401
+ strcpy(board[y][x], "\033[33m x\033[0m");397402
}403
+398404
}399405
}400406
}