jag

snake_c

public

Small snake game in C

Star0
Watch0

Commit 7dc23a551ade

tarball

Jaglekon <58274093+Jaglekon@users.noreply.github.com>2026-03-24 14:06 UTC

1 file changed+58-52
made stuff easier
Modified file: snake.c+58 additions−52 deletions
@@ -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 }