This commit is contained in:
Andrew Haynes
2026-03-03 15:53:21 -05:00
parent 3d6a6142bd
commit d7faaaeaeb
3 changed files with 44 additions and 52 deletions
+7 -13
View File
@@ -26,14 +26,12 @@ set(vec2* vec2, int _x, int _y);
typedef struct typedef struct
{ {
unsigned char view[ROW][COL]; char view[ROW][COL];
vec2 head; int m_score, tail_size;
vec2 fruit; vec2 head, fruit, prev_head;
vec2 prev_head; vec2 tail[(ROW * COL) - 1];
int m_score; // vec2* tail[(ROW * COL) - 1];
Direction dir; Direction dir;
vec2* tail[(ROW * COL) - 1];
int tail_size;
} Engine; } Engine;
@@ -50,13 +48,9 @@ int
is_open(char* status, size_t len, Engine* engine); is_open(char* status, size_t len, Engine* engine);
void void
determine_index_zero_pos(Engine* engine); eat(Engine* engine);
void void
add_tail_and_respawn_fruit(Engine* engine); move(Engine *engine);
void
move_tail_indicies(vec2** tail, int tail_size, vec2* prev_head,
unsigned char (*view)[COL]);
#endif #endif
+30 -33
View File
@@ -3,7 +3,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <termios.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
@@ -50,24 +49,30 @@ engine_display(Engine* engine)
{ {
for (char i = 0; i < engine->tail_size; i++) for (char i = 0; i < engine->tail_size; i++)
{ {
if (engine->tail[i]->x < COL && if (engine->tail[i].x < COL &&
engine->tail[i]->y < ROW) engine->tail[i].y < ROW)
{ {
engine->view[engine->tail[i]->y] engine->view[engine->tail[i].y]
[engine->tail[i]->x] = '~'; [engine->tail[i].x] = '~';
} }
} }
} }
write(1, "\033[H\033[J", sizeof("\033[H\033[J") - 1); 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); memcpy(ptr, " ", 1);
write(1, " ", 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 int
@@ -92,7 +97,7 @@ process_input(Direction* dir)
int int
is_open(char* status, size_t len, Engine* engine) 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, snprintf(status, len,
"You filled the whole board and won! " "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++) 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, snprintf(status, len,
"You collided with yourself and died! " "You collided with yourself and died! "
@@ -115,7 +120,7 @@ is_open(char* status, size_t len, Engine* engine)
} }
void void
determine_index_zero_pos(Engine* engine) move(Engine* engine)
{ {
set(&engine->prev_head, engine->head.x, engine->head.y); 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->head.y = (engine->head.y + 1) % ROW;
engine->view[engine->prev_head.y][engine->prev_head.x] = '.'; engine->view[engine->prev_head.y][engine->prev_head.x] = '.';
engine->view[engine->head.y][engine->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 void
move_tail_indicies(vec2** tail, int tail_size, vec2* prev_head, eat(Engine* engine)
unsigned char (*view)[COL])
{ {
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; vec2 new_pos;
set(&new_pos, 0, 0); set(&new_pos, 0, 0);
int collision = 0; int collision = 0;
@@ -159,22 +158,20 @@ add_tail_and_respawn_fruit(Engine* engine)
if (equals(&new_pos, &engine->head)) if (equals(&new_pos, &engine->head))
{ {
collision = 1; collision = 1;
break;
} }
if (engine->tail_size > 0) if (engine->tail_size > 0)
{ {
for (int i = 0; i < engine->tail_size; i++) 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; collision = 1;
break;
} }
} }
} }
} while (collision); } while (collision);
engine->fruit = new_pos; 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->tail_size++;
engine->m_score++; engine->m_score++;
} }
+7 -6
View File
@@ -25,16 +25,17 @@ main()
while (is_open(status, 64, &engine) && process_input(&engine.dir)) 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); engine_display(&engine);
nanosleep(&req, NULL); nanosleep(&req, NULL);
} }
for(int i = 0; i < engine.tail_size; i++) { // for(int i = 0; i < engine.tail_size; i++) {
free(engine.tail[i]); // free(engine.tail[i]);
} // }
write(1, status, sizeof(status)); write(1, status, sizeof(status));
write(1, "\033[?25h", 6); write(1, "\033[?25h", 6);
tcsetattr(0, TCSANOW, &oldt); tcsetattr(0, TCSANOW, &oldt);