Advertisement
YorKnEz

Untitled

Oct 20th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.65 KB | None | 0 0
  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <cstdlib>
  4. #include <time.h>
  5.  
  6. #define TITLE "Snake"
  7. #define SQUARE_SIZE 20
  8. #define BOARD_SIZE 20
  9.  
  10. typedef unsigned int uint;
  11.  
  12. bool quit = false;
  13.  
  14. uint16_t window_size = BOARD_SIZE * BOARD_SIZE;
  15.  
  16. typedef struct SnakePiece {
  17. int x;
  18. int y;
  19. SnakePiece *next;
  20. } SnakePiece;
  21.  
  22. SnakePiece *head = NULL;
  23.  
  24. int headx, heady,
  25. tailx, taily,
  26. len;
  27.  
  28. int x_increment = 0, y_increment = -1;
  29.  
  30. int fruitx, fruity;
  31.  
  32. uint fps = 15;
  33. uint minframetime = 1000 / fps;
  34.  
  35. SDL_Keycode keycode = SDLK_w;
  36.  
  37. void events(SDL_Window *window);
  38.  
  39. void draw(SDL_Renderer *renderer);
  40.  
  41. void add_piece (int x_data, int y_data) {
  42. SnakePiece *new_piece = (SnakePiece *) malloc (sizeof(SnakePiece));
  43.  
  44. new_piece->x = x_data;
  45. new_piece->y = y_data;
  46.  
  47. tailx = x_data;
  48. taily = y_data;
  49.  
  50. new_piece->next = head;
  51. head = new_piece;
  52.  
  53. len++;
  54. }
  55.  
  56. void initialize_snake () {
  57. headx = tailx = (BOARD_SIZE)/2-1;
  58. heady = taily = (BOARD_SIZE)/2-1;
  59.  
  60. add_piece (headx, heady);
  61.  
  62. for (int i = 0; i < 3; i++) {
  63. add_piece (tailx, taily+1);
  64. }
  65. }
  66.  
  67. void move_snake () {
  68.  
  69. SnakePiece *ptr;
  70.  
  71. ptr = head;
  72.  
  73. int old_x, old_y;
  74.  
  75. for (int i = 0; i < len; i++) {
  76. if (i == len-1) {
  77. old_x = ptr->x;
  78. old_y = ptr->y;
  79.  
  80. if (x_increment == -1 && (headx + x_increment) == -1) {
  81. ptr->x = BOARD_SIZE-1;
  82.  
  83. headx = ptr->x;
  84. } else if (x_increment == 1 && (headx + x_increment) == BOARD_SIZE) {
  85. ptr->x = 0;
  86.  
  87. headx = ptr->x;
  88. } else if (y_increment == -1 && (heady + y_increment) == -1) {
  89. ptr->y = BOARD_SIZE-1;
  90.  
  91. heady = ptr->y;
  92. } else if (y_increment == 1 && (heady + y_increment) == BOARD_SIZE) {
  93. ptr->y = 0;
  94.  
  95. heady = ptr->y;
  96. } else {
  97. ptr->x += x_increment;
  98. ptr->y += y_increment;
  99.  
  100. headx = ptr->x;
  101. heady = ptr->y;
  102.  
  103. break;
  104. }
  105. }
  106.  
  107. ptr = ptr->next;
  108. }
  109.  
  110. ptr = head;
  111.  
  112. int old_x2, old_y2;
  113.  
  114. for (int i = 0; i < len-1; i++) {
  115. for (int j = 0; j < (len-1)-i; j++) {
  116. if (j == (len-2)-i) {
  117. old_x2 = ptr->x;
  118. old_y2 = ptr->y;
  119.  
  120. ptr->x = old_x;
  121. ptr->y = old_y;
  122.  
  123. old_x = old_x2;
  124. old_y = old_y2;
  125. }
  126.  
  127. ptr = ptr->next;
  128. }
  129.  
  130. ptr = head;
  131. }
  132.  
  133. tailx = ptr->x;
  134. taily = ptr->y;
  135. }
  136.  
  137. void is_overlapping () {
  138. SnakePiece *ptr;
  139.  
  140. ptr = head;
  141.  
  142. for (int i = 0; i < len-1; i++) {
  143. if (headx == ptr->x && heady == ptr->y) {
  144. quit = true;
  145.  
  146. break;
  147. }
  148.  
  149. ptr = ptr->next;
  150. }
  151. }
  152.  
  153. bool can_gen_fruit () {
  154. SnakePiece *ptr;
  155.  
  156. ptr = head;
  157.  
  158. for (int i = 0; i < len ; i++) {
  159. if (fruitx == ptr->x && fruity == ptr->y) {
  160. return false;
  161. }
  162.  
  163. ptr = ptr->next;
  164. }
  165.  
  166. return true;
  167. }
  168.  
  169. void generate_fruit () {
  170. fruitx = rand() % (BOARD_SIZE-2) + 1;
  171. fruity = rand() % (BOARD_SIZE-2) + 1;
  172. }
  173.  
  174. int main(int argc, char **argv) {
  175. srand(time(NULL));
  176.  
  177. SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
  178.  
  179. SDL_Window *window =
  180. SDL_CreateWindow(
  181. TITLE,
  182. SDL_WINDOWPOS_CENTERED,
  183. SDL_WINDOWPOS_CENTERED,
  184. window_size,
  185. window_size,
  186. SDL_WINDOW_SHOWN);
  187.  
  188. SDL_Renderer *renderer =
  189. SDL_CreateRenderer(
  190. window,
  191. -1,
  192. SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  193.  
  194. initialize_snake();
  195.  
  196. generate_fruit();
  197.  
  198. while (!quit) {
  199. int start = SDL_GetTicks();
  200.  
  201. events(window);
  202.  
  203. is_overlapping();
  204.  
  205. move_snake();
  206.  
  207. if (headx == fruitx && heady == fruity) {
  208. add_piece(tailx, taily);
  209.  
  210. while (!can_gen_fruit()) {
  211. SDL_Rect rect = { (fruitx * 20), (fruity * 20), 20, 20 };
  212. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  213. SDL_RenderFillRect(renderer, &rect);
  214. generate_fruit();
  215. }
  216. }
  217.  
  218. draw(renderer);
  219.  
  220. SDL_RenderPresent(renderer);
  221.  
  222. int time = SDL_GetTicks() - start;
  223. int sleepTime = minframetime - time;
  224. if (sleepTime > 0) {
  225. SDL_Delay(sleepTime);
  226. }
  227. }
  228.  
  229. SDL_DestroyRenderer(renderer);
  230. SDL_DestroyWindow(window);
  231. SDL_Quit();
  232.  
  233. return 0;
  234. }
  235.  
  236. void events(SDL_Window *window) {
  237. SDL_Event event;
  238.  
  239. while (SDL_PollEvent(&event) != 0) {
  240. if (event.type == SDL_QUIT) {
  241. quit = true;
  242. }
  243. else if (event.type == SDL_KEYDOWN) {
  244. SDL_Keycode new_keycode = event.key.keysym.sym;
  245.  
  246. if (new_keycode == SDLK_d && keycode != SDLK_a) {
  247. x_increment = 1;
  248. y_increment = 0;
  249.  
  250. keycode = new_keycode;
  251.  
  252. break;
  253. } else if (new_keycode == SDLK_a && keycode != SDLK_d) {
  254. x_increment = -1;
  255. y_increment = 0;
  256.  
  257. keycode = new_keycode;
  258.  
  259. break;
  260. } else if (new_keycode == SDLK_w && keycode != SDLK_s) {
  261. x_increment = 0;
  262. y_increment = -1;
  263.  
  264. keycode = new_keycode;
  265.  
  266. break;
  267. } else if (new_keycode == SDLK_s && keycode != SDLK_w) {
  268. x_increment = 0;
  269. y_increment = 1;
  270.  
  271. keycode = new_keycode;
  272.  
  273. break;
  274. }
  275. }
  276. }
  277. }
  278.  
  279. void draw(SDL_Renderer *renderer) {
  280. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  281. SDL_RenderClear(renderer);
  282.  
  283. for (int i = 0; i < 20; i++) {
  284. for (int j = 0; j < 20; j++) {
  285. SDL_Rect rect = { (i * 20), (j * 20), 20, 20 };
  286. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  287. SDL_RenderFillRect(renderer, &rect);
  288. }
  289. }
  290.  
  291. SnakePiece *ptr;
  292.  
  293. ptr = head;
  294.  
  295. while (ptr) {
  296. SDL_Rect rect = { (ptr->x * 20), (ptr->y * 20), 20, 20 };
  297. SDL_SetRenderDrawColor(renderer, 100, 221, 23, 255);
  298. SDL_RenderFillRect(renderer, &rect);
  299.  
  300. ptr = ptr->next;
  301. }
  302.  
  303. SDL_Rect rect = { (fruitx * 20), (fruity * 20), 20, 20 };
  304. SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
  305. SDL_RenderFillRect(renderer, &rect);
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement