snake.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include "snake.h"
  5. extern char board[BRD_SIZE_Y][BRD_SIZE_X];
  6. extern char SNAKE_VIS;
  7. void mvSnakeParts(snakePart* head) {
  8. snakePart* part = head;
  9. while (1) {
  10. order* orderHead = part->order;
  11. if (orderHead->next != NULL) {
  12. if (orderHead->next->delay == 0) {
  13. part->dir = orderHead->next->dir;
  14. removeOrder(orderHead);
  15. }
  16. }
  17. if (orderHead->next != NULL) {
  18. order* current = orderHead->next;
  19. while (1) {
  20. if (current->delay > 0)
  21. current->delay--;
  22. if (current->next == NULL)
  23. break;
  24. current = current->next;
  25. }
  26. }
  27. int x = part->x;
  28. int y = part->y;
  29. board[y][x] = ' ';
  30. switch (part->dir) {
  31. case 'w':
  32. y = y - 1 < PL_BRD_YS ? PL_BRD_YE : y - 1;
  33. break;
  34. case 's':
  35. y = y + 1 > PL_BRD_YE ? PL_BRD_YS : y + 1;
  36. break;
  37. case 'a':
  38. x = x - 2 < PL_BRD_XS ? PL_BRD_XE - 1 : x - 2;
  39. break;
  40. case 'd':
  41. x = x + 2 > PL_BRD_XE ? PL_BRD_XS : x + 2;
  42. break;
  43. default:
  44. printf("ERROR in func mvSnakeParts\n");
  45. printf("dir: %c\n", part->dir);
  46. exit(1);
  47. }
  48. part->x = x;
  49. part->y = y;
  50. board[y][x] = part->visChar;
  51. if (part->next == NULL)
  52. return;
  53. part = part->next;
  54. }
  55. }
  56. void addSnakePart(snakePart* head) {
  57. snakePart* tail = head;
  58. while (tail->next != NULL)
  59. tail = tail->next;
  60. snakePart* newTail = (snakePart*) malloc(sizeof(snakePart));
  61. newTail->visChar = SNAKE_VIS;
  62. newTail->dir = tail->dir;
  63. // Order head
  64. newTail->order = (order*) malloc(sizeof(order));
  65. newTail->order->dir = newTail->dir;
  66. newTail->order->delay = -1;
  67. // First order if exists
  68. if (tail->order->next != NULL)
  69. copyOrders(tail->order, newTail->order);
  70. switch (newTail->dir) {
  71. case 'w':
  72. newTail->x = tail->x;
  73. newTail->y = tail->y + 1;
  74. break;
  75. case 's':
  76. newTail->x = tail->x;
  77. newTail->y = tail->y - 1;
  78. break;
  79. case 'a':
  80. newTail->x = tail->x + 2;
  81. newTail->y = tail->y;
  82. break;
  83. case 'd':
  84. newTail->x = tail->x - 2;
  85. newTail->y = tail->y;
  86. break;
  87. default:
  88. printf("Invalid direction in func addSnakePart\n");
  89. exit(1);
  90. }
  91. newTail->next = NULL;
  92. tail->next = newTail;
  93. board[newTail->y][newTail->x] = newTail->visChar;
  94. }
  95. void pushOrder(order* head, char dir, int delay) {
  96. order* current = head;
  97. while (current->next != NULL)
  98. current = current->next;
  99. order* newOrder = (order*) malloc(sizeof(order));
  100. newOrder->dir = dir;
  101. newOrder->delay = delay;
  102. newOrder->next = NULL;
  103. current->next = newOrder;
  104. }
  105. void removeOrder(order* head) {
  106. order* newFirstOrder = head->next->next;
  107. free(head->next);
  108. head->next = newFirstOrder;
  109. }
  110. void addOrders(snakePart* head, char dir) {
  111. snakePart* current = head;
  112. int i = 1;
  113. while (1) {
  114. if (current->next == NULL)
  115. break;
  116. current = current->next;
  117. pushOrder(current->order, dir, i);
  118. i++;
  119. }
  120. }
  121. void copyOrders(order* srcHead, order* destHead) {
  122. if (srcHead->next == NULL) {
  123. printf("ERROR in copyOrders: no orders to copy\n");
  124. exit(1);
  125. }
  126. order* srcCurrent = srcHead;
  127. order* destCurrent = destHead;
  128. order* destPrev = destHead;
  129. while (srcCurrent->next != NULL) {
  130. srcCurrent = srcCurrent->next;
  131. destPrev = destCurrent;
  132. destCurrent = (order*) malloc(sizeof(order));
  133. destPrev->next = destCurrent;
  134. destCurrent->dir = srcCurrent->dir;
  135. destCurrent->delay = srcCurrent->delay + 1;
  136. destCurrent->next = NULL;
  137. }
  138. }
  139. bool checkCollision(snakePart* head, int x, int y) {
  140. snakePart* current = head;
  141. while (1) {
  142. if (current->x == x && current->y == y)
  143. return true;
  144. if (current->next == NULL)
  145. break;
  146. current = current->next;
  147. }
  148. return false;
  149. }