From d7faaaeaeb3cd399c933166292df30cfb9326a88 Mon Sep 17 00:00:00 2001 From: Andrew Haynes Date: Tue, 3 Mar 2026 15:53:21 -0500 Subject: [PATCH] f --- include/engine.h | 20 ++++++--------- src/engine.c | 63 +++++++++++++++++++++++------------------------- src/main.c | 13 +++++----- 3 files changed, 44 insertions(+), 52 deletions(-) diff --git a/include/engine.h b/include/engine.h index ff54e74..f95c99b 100644 --- a/include/engine.h +++ b/include/engine.h @@ -26,14 +26,12 @@ set(vec2* vec2, int _x, int _y); typedef struct { - unsigned char view[ROW][COL]; - vec2 head; - vec2 fruit; - vec2 prev_head; - int m_score; + char view[ROW][COL]; + int m_score, tail_size; + vec2 head, fruit, prev_head; + vec2 tail[(ROW * COL) - 1]; + // vec2* tail[(ROW * COL) - 1]; Direction dir; - vec2* tail[(ROW * COL) - 1]; - int tail_size; } Engine; @@ -50,13 +48,9 @@ int is_open(char* status, size_t len, Engine* engine); void -determine_index_zero_pos(Engine* engine); +eat(Engine* engine); void -add_tail_and_respawn_fruit(Engine* engine); - -void -move_tail_indicies(vec2** tail, int tail_size, vec2* prev_head, - unsigned char (*view)[COL]); +move(Engine *engine); #endif diff --git a/src/engine.c b/src/engine.c index a42be51..6908b65 100644 --- a/src/engine.c +++ b/src/engine.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -50,24 +49,30 @@ engine_display(Engine* engine) { for (char i = 0; i < engine->tail_size; i++) { - if (engine->tail[i]->x < COL && - engine->tail[i]->y < ROW) + if (engine->tail[i].x < COL && + engine->tail[i].y < ROW) { - engine->view[engine->tail[i]->y] - [engine->tail[i]->x] = '~'; + engine->view[engine->tail[i].y] + [engine->tail[i].x] = '~'; } } } write(1, "\033[H\033[J", sizeof("\033[H\033[J") - 1); - for (unsigned char i = 0; i < ROW; i++) + char str[(COL * 2 + 2) * ROW] = { 0 }; + char* ptr = str; + for (char i = 0; i < ROW; i++) { - for (unsigned char j = 0; j < COL; j++) + for (char j = 0; j < COL; j++) { - write(1, &engine->view[i][j], 1); - write(1, " ", 1); + memcpy(ptr, " ", 1); + ptr++; + memcpy(ptr, &engine->view[i][j], 1); + ptr++; } - write(1, "\r\n", 2); + memcpy(ptr, "\r\n", 2); + ptr += 2; } + write(1, str, ptr - str); } int @@ -92,7 +97,7 @@ process_input(Direction* dir) int is_open(char* status, size_t len, Engine* engine) { - if ((sizeof(engine->tail) / sizeof(engine->tail[0])) >= ROW * COL) + if (engine->tail_size >= (ROW * COL) - 1) { snprintf(status, len, "You filled the whole board and won! " @@ -102,7 +107,7 @@ is_open(char* status, size_t len, Engine* engine) } for (int i = 0; i < engine->tail_size; i++) { - if (equals(engine->tail[i], &engine->head)) + if (equals(&engine->tail[i], &engine->head)) { snprintf(status, len, "You collided with yourself and died! " @@ -115,7 +120,7 @@ is_open(char* status, size_t len, Engine* engine) } void -determine_index_zero_pos(Engine* engine) +move(Engine* engine) { set(&engine->prev_head, engine->head.x, engine->head.y); @@ -129,26 +134,20 @@ determine_index_zero_pos(Engine* engine) engine->head.y = (engine->head.y + 1) % ROW; engine->view[engine->prev_head.y][engine->prev_head.x] = '.'; engine->view[engine->head.y][engine->head.x] = '*'; + + if (engine->tail_size == 0) return; + + vec2 old_tail = engine->tail[engine->tail_size -1]; + memmove(&engine->tail[1], &engine->tail[0], sizeof(vec2) * (engine->tail_size - 1)); + + engine->view[old_tail.y] + [old_tail.x] = '.'; + set(&engine->tail[0], engine->prev_head.x, engine->prev_head.y); } void -move_tail_indicies(vec2** tail, int tail_size, vec2* prev_head, - unsigned char (*view)[COL]) +eat(Engine* engine) { - if (tail_size == 0) return; - - view[tail[tail_size - 1]->y][tail[tail_size - 1]->x] = '.'; - for (int i = tail_size - 1; i > 0; i--) - { - set(tail[i], tail[i - 1]->x, tail[i - 1]->y); - } - set(tail[0], prev_head->x, prev_head->y); -} - -void -add_tail_and_respawn_fruit(Engine* engine) -{ - if (!equals(&engine->fruit, &engine->head)) return; vec2 new_pos; set(&new_pos, 0, 0); int collision = 0; @@ -159,22 +158,20 @@ add_tail_and_respawn_fruit(Engine* engine) if (equals(&new_pos, &engine->head)) { collision = 1; - break; } if (engine->tail_size > 0) { for (int i = 0; i < engine->tail_size; i++) { - if (equals(&new_pos, engine->tail[i])) + if (equals(&new_pos, &engine->tail[i])) { collision = 1; - break; } } } } while (collision); engine->fruit = new_pos; - engine->tail[engine->tail_size] = (vec2*)malloc(sizeof(vec2)); + set(&engine->tail[engine->tail_size], -1, -1); engine->tail_size++; engine->m_score++; } diff --git a/src/main.c b/src/main.c index e7c887f..43db27f 100644 --- a/src/main.c +++ b/src/main.c @@ -25,16 +25,17 @@ main() while (is_open(status, 64, &engine) && process_input(&engine.dir)) { - add_tail_and_respawn_fruit(&engine); - determine_index_zero_pos(&engine); - move_tail_indicies(engine.tail, engine.tail_size, &engine.prev_head, engine.view); + if(equals(&engine.fruit, &engine.head)) { + eat(&engine); + } + move(&engine); engine_display(&engine); nanosleep(&req, NULL); } - for(int i = 0; i < engine.tail_size; i++) { - free(engine.tail[i]); - } + // for(int i = 0; i < engine.tail_size; i++) { + // free(engine.tail[i]); + // } write(1, status, sizeof(status)); write(1, "\033[?25h", 6); tcsetattr(0, TCSANOW, &oldt);