f
This commit is contained in:
+7
-13
@@ -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
|
||||
|
||||
+30
-33
@@ -3,7 +3,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
|
||||
+7
-6
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user