From 11a4a19cc34646a1872f35ef81bf92a296e72989 Mon Sep 17 00:00:00 2001 From: Aaro Saila Date: Sat, 3 Aug 2024 13:33:03 +0300 Subject: [PATCH] progress --- main.c | 137 +++++++++++++++++++++++++++++--------------------- snake/snake.c | 73 +++++++++++++++++++++++++-- snake/snake.h | 11 ++++ utils/utils.c | 2 +- 4 files changed, 160 insertions(+), 63 deletions(-) diff --git a/main.c b/main.c index a0edd4b..4dc0499 100644 --- a/main.c +++ b/main.c @@ -48,14 +48,6 @@ int main() { board[0][BRD_SIZE_X - 1] = '+'; board[BRD_SIZE_Y - 1][BRD_SIZE_X - 1] = '+'; - char mvPoints[BRD_SIZE_Y][BRD_SIZE_X]; - - for (int i = 0; i < BRD_SIZE_Y; i++) { - for (int j = 0; j < BRD_SIZE_X; j++) { - mvPoints[i][j] = '0'; - } - } - int points = 0; // Snake head setup @@ -64,6 +56,10 @@ int main() { snakeHead->y = randomY(initClock); snakeHead->visChar = SNAKE_VIS; snakeHead->dir = 'w'; + snakeHead->order = (order*) malloc(sizeof(order)); + snakeHead->order->dir = snakeHead->dir; + snakeHead->order->delay = -1; + snakeHead->order->next = NULL; snakeHead->next = NULL; board[snakeHead->y][snakeHead->x] = snakeHead->visChar; @@ -87,46 +83,6 @@ int main() { while (1) { fflush(stdout); char buf[1] = {0}; - if (read(STDIN_FILENO, buf, 1) != 0 && isalpha(buf[0])) { - char input = buf[0]; - - input = tolower(input); - - if ( - input == 'w' - || input == 's' - || input == 'a' - || input == 'd' - ) { - if (points > 0) - mvPoints[snakeHead->y][snakeHead->x] = input; - snakeHead->dir = input; - } - } - - for (int i = 0; i < BRD_SIZE_Y; i++) { - for (int j = 0; j < BRD_SIZE_X; j++) { - if (mvPoints[i][j] == '0') - continue; - - snakePart* part = snakeHead; - while (part->next != NULL) { - part = part->next; - - if (part->y == i && part->x == j) { - part->dir = mvPoints[i][j]; - if (part->next == NULL) - mvPoints[i][j] = '0'; - break; - } - - if (part->next == NULL) - break; - } - } - } - - mvSnakeParts(snakeHead); if (snakeHead->x == food.x && snakeHead->y == food.y) { @@ -136,22 +92,68 @@ int main() { board[food.y][food.x] = food.visChar; addSnakePart(snakeHead); } - + + if (read(STDIN_FILENO, buf, 1) != 0 && isalpha(buf[0])) { + char input = buf[0]; + + input = tolower(input); + + if ( + (input == 'w' && snakeHead->dir != 's') + || (input == 's' && snakeHead->dir != 'w') + || (input == 'a' && snakeHead->dir != 'd') + || (input == 'd' && snakeHead->dir != 'a') + ) { + snakeHead->dir = input; + addOrders(snakeHead, input); + } + } + + mvSnakeParts(snakeHead); + system("clear"); printBoard(); printf("Points: %d\n", points); printf("x: %d\n", snakeHead->x); - printf("y: %d\n", snakeHead->y); + printf("y: %d\n\n", snakeHead->y); printf("food x: %d\n", food.x); printf("food y: %d\n", food.y); - printf("food: %c\n", board[food.y][food.x]); - for (int i = 0; i < BRD_SIZE_Y; i++) { - for (int j = 0; j < BRD_SIZE_X; j++) { - printf("%c ", mvPoints[i][j]); + /* + { + snakePart* current = snakeHead; + int i = 0; + while (1) { + printf("Part %d:\n", i); + printf("dir: %c\n", current->dir); + printf("orders: \n"); + order* order = current->order; + int order_i = 0; + while (1) { + printf("\t\nOrder %d:\n", order_i); + printf("\tdir: %c\n", order->dir); + printf("\tdelay: %d\n", order->delay); + printf("\tnext: "); + if (order->next == NULL) + printf("NULL\n"); + else + printf("exists\n"); + + if (order->next == NULL) + break; + + order = order->next; + + order_i++; + } + if (current->next == NULL) + break; + + current = current->next; + i++; } - printf("\n"); } + */ sleep_ms(200); } @@ -165,6 +167,27 @@ int main() { void mvSnakeParts(snakePart* head) { snakePart* part = head; while (1) { + + order* orderHead = part->order; + + if (orderHead->next != NULL) { + if (orderHead->next->delay == 0) { + part->dir = orderHead->next->dir; + removeOrder(orderHead); + } + } + + if (orderHead->next != NULL) { + order* current = orderHead->next; + while (1) { + if (current->delay > 0) + current->delay--; + if (current->next == NULL) + break; + current = current->next; + } + } + int x = part->x; int y = part->y; @@ -178,13 +201,13 @@ void mvSnakeParts(snakePart* head) { y = y + 1 > PL_BRD_YE ? PL_BRD_YS : y + 1; break; case 'a': - x = x - 2 < PL_BRD_XS ? PL_BRD_XE : x - 2; + x = x - 2 < PL_BRD_XS ? PL_BRD_XE - 1 : x - 2; break; case 'd': x = x + 2 > PL_BRD_XE ? PL_BRD_XS : x + 2; break; default: - printf("ERROR in func mvSymbol\n"); + printf("ERROR in func mvSnakeParts\n"); printf("dir: %c\n", part->dir); exit(1); } diff --git a/snake/snake.c b/snake/snake.c index 95b09fe..96f4fe0 100644 --- a/snake/snake.c +++ b/snake/snake.c @@ -13,6 +13,14 @@ void addSnakePart(snakePart* head) { snakePart* newTail = (snakePart*) malloc(sizeof(snakePart)); newTail->visChar = '#'; newTail->dir = tail->dir; + // Order head + newTail->order = (order*) malloc(sizeof(order)); + newTail->order->dir = newTail->dir; + newTail->order->delay = -1; + // First order if exists + if (tail->order->next != NULL) + copyOrders(tail->order, newTail->order); + switch (newTail->dir) { case 'w': @@ -20,16 +28,16 @@ void addSnakePart(snakePart* head) { newTail->y = tail->y + 1; break; case 's': - newTail->x = tail->x - 1; - newTail->y = tail->y; + newTail->x = tail->x; + newTail->y = tail->y - 1; break; case 'a': - newTail->x = tail->x - 1; + newTail->x = tail->x + 2; newTail->y = tail->y; break; case 'd': - newTail->x = tail->x; - newTail->y = tail->y - 1; + newTail->x = tail->x - 2; + newTail->y = tail->y; break; default: printf("Invalid direction in func addSnakePart\n"); @@ -42,3 +50,58 @@ void addSnakePart(snakePart* head) { board[newTail->y][newTail->x] = newTail->visChar; } + +void pushOrder(order* head, char dir, int delay) { + order* current = head; + while (current->next != NULL) + current = current->next; + + order* newOrder = (order*) malloc(sizeof(order)); + newOrder->dir = dir; + newOrder->delay = delay; + newOrder->next = NULL; + + current->next = newOrder; +} + +void removeOrder(order* head) { + order* newFirstOrder = head->next->next; + free(head->next); + head->next = newFirstOrder; +} + +void addOrders(snakePart* head, char dir) { + snakePart* current = head; + int i = 1; + while (1) { + if (current->next == NULL) + break; + + current = current->next; + + pushOrder(current->order, dir, i); + + i++; + } +} + +void copyOrders(order* srcHead, order* destHead) { + if (srcHead->next == NULL) { + printf("ERROR in copyOrders: no orders to copy\n"); + exit(1); + } + + order* srcCurrent = srcHead; + order* destCurrent = destHead; + order* destPrev = destHead; + + while (srcCurrent->next != NULL) { + srcCurrent = srcCurrent->next; + destPrev = destCurrent; + destCurrent = (order*) malloc(sizeof(order)); + destPrev->next = destCurrent; + destCurrent->dir = srcCurrent->dir; + destCurrent->delay = srcCurrent->delay + 1; + destCurrent->next = NULL; + } +} diff --git a/snake/snake.h b/snake/snake.h index a141a8a..db436a4 100644 --- a/snake/snake.h +++ b/snake/snake.h @@ -3,15 +3,26 @@ #include "../globals.h" +typedef struct orderNode { + char dir; + int delay; + struct orderNode* next; +} order; + typedef struct snakeNode { int x; int y; char visChar; char dir; + order* order; struct snakeNode* next; } snakePart; void addSnakePart(snakePart* head); +void pushOrder(order* head, char dir, int delay); +void removeOrder(order* head); +void addOrders(snakePart* head, char dir); +void copyOrders(order* srcHead, order* destHead); #endif // SNAKE_H_ diff --git a/utils/utils.c b/utils/utils.c index 64cd221..c20a6b5 100644 --- a/utils/utils.c +++ b/utils/utils.c @@ -23,7 +23,7 @@ int randomX(const clock_t initClock) { const unsigned int seed = clock() - initClock; for (int i = randomInt(0, 100, seed); ; i++) { x = randomInt(PL_BRD_XS, PL_BRD_XE, i); - if (x % 2 == 0) + if (x % 2 != 0) break; }