snake.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "snake.h"
  4. extern char board[BRD_SIZE_Y][BRD_SIZE_X];
  5. void addSnakePart(snakePart* head) {
  6. snakePart* tail = head;
  7. while (tail->next != NULL)
  8. tail = tail->next;
  9. snakePart* newTail = (snakePart*) malloc(sizeof(snakePart));
  10. newTail->visChar = '#';
  11. newTail->dir = tail->dir;
  12. // Order head
  13. newTail->order = (order*) malloc(sizeof(order));
  14. newTail->order->dir = newTail->dir;
  15. newTail->order->delay = -1;
  16. // First order if exists
  17. if (tail->order->next != NULL)
  18. copyOrders(tail->order, newTail->order);
  19. switch (newTail->dir) {
  20. case 'w':
  21. newTail->x = tail->x;
  22. newTail->y = tail->y + 1;
  23. break;
  24. case 's':
  25. newTail->x = tail->x;
  26. newTail->y = tail->y - 1;
  27. break;
  28. case 'a':
  29. newTail->x = tail->x + 2;
  30. newTail->y = tail->y;
  31. break;
  32. case 'd':
  33. newTail->x = tail->x - 2;
  34. newTail->y = tail->y;
  35. break;
  36. default:
  37. printf("Invalid direction in func addSnakePart\n");
  38. exit(1);
  39. }
  40. newTail->next = NULL;
  41. tail->next = newTail;
  42. board[newTail->y][newTail->x] = newTail->visChar;
  43. }
  44. void pushOrder(order* head, char dir, int delay) {
  45. order* current = head;
  46. while (current->next != NULL)
  47. current = current->next;
  48. order* newOrder = (order*) malloc(sizeof(order));
  49. newOrder->dir = dir;
  50. newOrder->delay = delay;
  51. newOrder->next = NULL;
  52. current->next = newOrder;
  53. }
  54. void removeOrder(order* head) {
  55. order* newFirstOrder = head->next->next;
  56. free(head->next);
  57. head->next = newFirstOrder;
  58. }
  59. void addOrders(snakePart* head, char dir) {
  60. snakePart* current = head;
  61. int i = 1;
  62. while (1) {
  63. if (current->next == NULL)
  64. break;
  65. current = current->next;
  66. pushOrder(current->order, dir, i);
  67. i++;
  68. }
  69. }
  70. void copyOrders(order* srcHead, order* destHead) {
  71. if (srcHead->next == NULL) {
  72. printf("ERROR in copyOrders: no orders to copy\n");
  73. exit(1);
  74. }
  75. order* srcCurrent = srcHead;
  76. order* destCurrent = destHead;
  77. order* destPrev = destHead;
  78. while (srcCurrent->next != NULL) {
  79. srcCurrent = srcCurrent->next;
  80. destPrev = destCurrent;
  81. destCurrent = (order*) malloc(sizeof(order));
  82. destPrev->next = destCurrent;
  83. destCurrent->dir = srcCurrent->dir;
  84. destCurrent->delay = srcCurrent->delay + 1;
  85. destCurrent->next = NULL;
  86. }
  87. }