Advertisement
YorKnEz

Untitled

Oct 24th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.40 KB | None | 0 0
  1. /*
  2. Copyright 2019 YorKnEz
  3. */
  4.  
  5. #include <SDL2/SDL.h>
  6. #include <stdio.h>
  7. #include <cstdlib>
  8. #include <time.h>
  9.  
  10. #define TITLE "Snake"
  11. #define SQUARE_SIZE 20
  12. #define BOARD_SIZE 20
  13. #define main SDL_main
  14.  
  15. typedef unsigned int uint;
  16.  
  17. bool quit = false;
  18.  
  19. uint16_t window_size = BOARD_SIZE * BOARD_SIZE;
  20.  
  21. typedef struct SnakePiece {
  22. int x;
  23. int y;
  24. SnakePiece *next;
  25. } SnakePiece;
  26.  
  27. SnakePiece *head = NULL;
  28.  
  29. int headx, heady,
  30. tailx, taily,
  31. len;
  32.  
  33. int x_increment = 0, y_increment = -1;
  34.  
  35. int fruitx, fruity;
  36.  
  37. char zero[5][4] = {
  38. "111",
  39. "1 1",
  40. "1 1",
  41. "1 1",
  42. "111"
  43. },
  44. one[5][4] = {
  45. "11 ",
  46. " 1 ",
  47. " 1 ",
  48. " 1 ",
  49. "111"
  50. },
  51. two[5][4] = {
  52. "111",
  53. " 1",
  54. "111",
  55. "1 ",
  56. "111"
  57. },
  58. three[5][4] = {
  59. "111",
  60. " 1",
  61. "111",
  62. " 1",
  63. "111"
  64. },
  65. four[5][4] = {
  66. " 1",
  67. " 11",
  68. "1 1",
  69. "111",
  70. " 1"
  71. },
  72. five[5][4] = {
  73. "111",
  74. "1 ",
  75. "111",
  76. " 1",
  77. "111"
  78. },
  79. six[5][4] = {
  80. "111",
  81. "1 ",
  82. "111",
  83. "1 1",
  84. "111"
  85. },
  86. seven[5][4] = {
  87. "111",
  88. " 1",
  89. " 1 ",
  90. "1 ",
  91. "1 "
  92. },
  93. eight[5][4] = {
  94. "111",
  95. "1 1",
  96. "111",
  97. "1 1",
  98. "111"
  99. },
  100. nine[5][4] = {
  101. "111",
  102. "1 1",
  103. "111",
  104. " 1",
  105. "111"
  106. },
  107. digit1[5][4] = {
  108. " 1",
  109. " 11",
  110. "1 1",
  111. "111",
  112. " 1"
  113. },
  114. digit2[5][4] = {
  115. "111",
  116. "1 1",
  117. "1 1",
  118. "1 1",
  119. "111"
  120. },
  121. digit3[5][4] = {
  122. " 1",
  123. " 11",
  124. "1 1",
  125. "111",
  126. " 1"
  127. };
  128.  
  129. uint fps = 10;
  130. uint minframetime = 1000 / fps;
  131.  
  132. SDL_Keycode keycode = SDLK_w;
  133.  
  134. void events(SDL_Window *window);
  135.  
  136. void draw(SDL_Renderer *renderer);
  137.  
  138. void add_piece (int x_data, int y_data) {
  139. SnakePiece *new_piece = (SnakePiece *) malloc (sizeof(SnakePiece));
  140.  
  141. new_piece->x = x_data;
  142. new_piece->y = y_data;
  143.  
  144. tailx = x_data;
  145. taily = y_data;
  146.  
  147. new_piece->next = head;
  148. head = new_piece;
  149.  
  150. len++;
  151. }
  152.  
  153. void initialize_snake () {
  154. headx = tailx = (BOARD_SIZE)/2-1;
  155. heady = taily = (BOARD_SIZE)/2-1;
  156.  
  157. add_piece (headx, heady);
  158.  
  159. for (int i = 0; i < 3; i++) {
  160. add_piece (tailx, taily+1);
  161. }
  162. }
  163.  
  164. void move_snake () {
  165.  
  166. SnakePiece *ptr;
  167.  
  168. ptr = head;
  169.  
  170. int old_x, old_y;
  171.  
  172. for (int i = 0; i < len; i++) {
  173. if (i == len-1) {
  174. old_x = ptr->x;
  175. old_y = ptr->y;
  176.  
  177. if (x_increment == -1 && (headx + x_increment) == -1) {
  178. ptr->x = BOARD_SIZE-1;
  179.  
  180. headx = ptr->x;
  181. } else if (x_increment == 1 && (headx + x_increment) == BOARD_SIZE) {
  182. ptr->x = 0;
  183.  
  184. headx = ptr->x;
  185. } else if (y_increment == -1 && (heady + y_increment) == -1) {
  186. ptr->y = BOARD_SIZE-1;
  187.  
  188. heady = ptr->y;
  189. } else if (y_increment == 1 && (heady + y_increment) == BOARD_SIZE) {
  190. ptr->y = 0;
  191.  
  192. heady = ptr->y;
  193. } else {
  194. ptr->x += x_increment;
  195. ptr->y += y_increment;
  196.  
  197. headx = ptr->x;
  198. heady = ptr->y;
  199.  
  200. break;
  201. }
  202. }
  203.  
  204. ptr = ptr->next;
  205. }
  206.  
  207. ptr = head;
  208.  
  209. int old_x2, old_y2;
  210.  
  211. for (int i = 0; i < len-1; i++) {
  212. for (int j = 0; j < (len-1)-i; j++) {
  213. if (j == (len-2)-i) {
  214. old_x2 = ptr->x;
  215. old_y2 = ptr->y;
  216.  
  217. ptr->x = old_x;
  218. ptr->y = old_y;
  219.  
  220. old_x = old_x2;
  221. old_y = old_y2;
  222. }
  223.  
  224. ptr = ptr->next;
  225. }
  226.  
  227. ptr = head;
  228. }
  229.  
  230. tailx = ptr->x;
  231. taily = ptr->y;
  232. }
  233.  
  234. void is_overlapping () {
  235. SnakePiece *ptr;
  236.  
  237. ptr = head;
  238.  
  239. for (int i = 0; i < len-1; i++) {
  240. if (headx == ptr->x && heady == ptr->y) {
  241. quit = true;
  242.  
  243. break;
  244. }
  245.  
  246. ptr = ptr->next;
  247. }
  248. }
  249.  
  250. bool can_gen_fruit () {
  251. SnakePiece *ptr;
  252.  
  253. ptr = head;
  254.  
  255. for (int i = 0; i < len ; i++) {
  256. if (fruitx == ptr->x && fruity == ptr->y) {
  257. return false;
  258. }
  259.  
  260. ptr = ptr->next;
  261. }
  262.  
  263. return true;
  264. }
  265.  
  266. void generate_fruit () {
  267. fruitx = rand() % (BOARD_SIZE-2) + 1;
  268. fruity = rand() % (BOARD_SIZE-2) + 1;
  269. }
  270.  
  271. void digit_update (char digit[5][4], char new_digit[5][4]) {
  272. for (int i = 0; i < 5; i++) {
  273. for (int j = 0; j < 3; j++) {
  274. digit[i][j] = new_digit[i][j];
  275. }
  276. }
  277. }
  278.  
  279. void update_digits () {
  280. int len_cpy = len;
  281. int digit_cnt = 0;
  282.  
  283. digit_update(digit1, zero);
  284. digit_update(digit2, zero);
  285. digit_update(digit3, zero);
  286.  
  287. while (len_cpy != 0) {
  288. if (len_cpy % 10 == 0) {
  289. if (digit_cnt == 0) {
  290. digit_update(digit1, zero);
  291. } else if (digit_cnt == 1) {
  292. digit_update(digit2, zero);
  293. } else if (digit_cnt == 2) {
  294. digit_update(digit3, zero);
  295. }
  296. } else if (len_cpy % 10 == 1) {
  297. if (digit_cnt == 0) {
  298. digit_update(digit1, one);
  299. } else if (digit_cnt == 1) {
  300. digit_update(digit2, one);
  301. } else if (digit_cnt == 2) {
  302. digit_update(digit3, one);
  303. }
  304. } else if (len_cpy % 10 == 2) {
  305. if (digit_cnt == 0) {
  306. digit_update(digit1, two);
  307. } else if (digit_cnt == 1) {
  308. digit_update(digit2, two);
  309. } else if (digit_cnt == 2) {
  310. digit_update(digit3, two);
  311. }
  312. } else if (len_cpy % 10 == 3) {
  313. if (digit_cnt == 0) {
  314. digit_update(digit1, three);
  315. } else if (digit_cnt == 1) {
  316. digit_update(digit2, three);
  317. } else if (digit_cnt == 2) {
  318. digit_update(digit3, three);
  319. }
  320. } else if (len_cpy % 10 == 4) {
  321. if (digit_cnt == 0) {
  322. digit_update(digit1, four);
  323. } else if (digit_cnt == 1) {
  324. digit_update(digit2, four);
  325. } else if (digit_cnt == 2) {
  326. digit_update(digit3, four);
  327. }
  328. } else if (len_cpy % 10 == 5) {
  329. if (digit_cnt == 0) {
  330. digit_update(digit1, five);
  331. } else if (digit_cnt == 1) {
  332. digit_update(digit2, five);
  333. } else if (digit_cnt == 2) {
  334. digit_update(digit3, five);
  335. }
  336. } else if (len_cpy % 10 == 6) {
  337. if (digit_cnt == 0) {
  338. digit_update(digit1, six);
  339. } else if (digit_cnt == 1) {
  340. digit_update(digit2, six);
  341. } else if (digit_cnt == 2) {
  342. digit_update(digit3, six);
  343. }
  344. } else if (len_cpy % 10 == 7) {
  345. if (digit_cnt == 0) {
  346. digit_update(digit1, seven);
  347. } else if (digit_cnt == 1) {
  348. digit_update(digit2, seven);
  349. } else if (digit_cnt == 2) {
  350. digit_update(digit3, seven);
  351. }
  352. } else if (len_cpy % 10 == 8) {
  353. if (digit_cnt == 0) {
  354. digit_update(digit1, eight);
  355. } else if (digit_cnt == 1) {
  356. digit_update(digit2, eight);
  357. } else if (digit_cnt == 2) {
  358. digit_update(digit3, eight);
  359. }
  360. } else if (len_cpy % 10 == 9) {
  361. if (digit_cnt == 0) {
  362. digit_update(digit1, nine);
  363. } else if (digit_cnt == 1) {
  364. digit_update(digit2, nine);
  365. } else if (digit_cnt == 2) {
  366. digit_update(digit3, nine);
  367. }
  368. }
  369.  
  370. digit_cnt++;
  371.  
  372. len_cpy /= 10;
  373. }
  374. }
  375.  
  376. int main(int argc, char** argv) {
  377. srand(time(NULL));
  378.  
  379. SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
  380.  
  381. SDL_Window *window =
  382. SDL_CreateWindow(
  383. TITLE,
  384. SDL_WINDOWPOS_CENTERED,
  385. SDL_WINDOWPOS_CENTERED,
  386. window_size,
  387. window_size,
  388. SDL_WINDOW_SHOWN);
  389.  
  390. SDL_Renderer *renderer =
  391. SDL_CreateRenderer(
  392. window,
  393. -1,
  394. SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  395.  
  396. initialize_snake();
  397.  
  398. generate_fruit();
  399.  
  400. while (!quit) {
  401. int start = SDL_GetTicks();
  402.  
  403. events(window);
  404.  
  405. move_snake();
  406.  
  407. is_overlapping();
  408. if (headx == fruitx && heady == fruity) {
  409. add_piece(tailx, taily);
  410.  
  411. update_digits();
  412.  
  413. while (!can_gen_fruit()) {
  414. SDL_Rect rect = { (fruitx * 20), (fruity * 20), 20, 20 };
  415. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  416. SDL_RenderFillRect(renderer, &rect);
  417. generate_fruit();
  418. }
  419. }
  420.  
  421. draw(renderer);
  422.  
  423. SDL_RenderPresent(renderer);
  424.  
  425. int time = SDL_GetTicks() - start;
  426. int sleepTime = minframetime - time;
  427. if (sleepTime > 0) {
  428. SDL_Delay(sleepTime);
  429. }
  430. }
  431.  
  432. SDL_DestroyRenderer(renderer);
  433. SDL_DestroyWindow(window);
  434. SDL_Quit();
  435.  
  436. return 0;
  437. }
  438.  
  439. void events(SDL_Window *window) {
  440. SDL_Event event;
  441.  
  442. while (SDL_PollEvent(&event) != 0) {
  443. if (event.type == SDL_QUIT) {
  444. quit = true;
  445. }
  446. else if (event.type == SDL_KEYDOWN) {
  447. SDL_Keycode new_keycode = event.key.keysym.sym;
  448.  
  449. if (new_keycode == SDLK_d && keycode != SDLK_a) {
  450. x_increment = 1;
  451. y_increment = 0;
  452.  
  453. keycode = new_keycode;
  454.  
  455. break;
  456. } else if (new_keycode == SDLK_a && keycode != SDLK_d) {
  457. x_increment = -1;
  458. y_increment = 0;
  459.  
  460. keycode = new_keycode;
  461.  
  462. break;
  463. } else if (new_keycode == SDLK_w && keycode != SDLK_s) {
  464. x_increment = 0;
  465. y_increment = -1;
  466.  
  467. keycode = new_keycode;
  468.  
  469. break;
  470. } else if (new_keycode == SDLK_s && keycode != SDLK_w) {
  471. x_increment = 0;
  472. y_increment = 1;
  473.  
  474. keycode = new_keycode;
  475.  
  476. break;
  477. }
  478. }
  479. }
  480. }
  481.  
  482. void draw(SDL_Renderer *renderer) {
  483. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  484. SDL_RenderClear(renderer);
  485.  
  486. for (int i = 0; i < 20; i++) {
  487. for (int j = 0; j < 20; j++) {
  488. SDL_Rect rect = { (i * 20), (j * 20), 20, 20 };
  489. SDL_SetRenderDrawColor(renderer, 255, 236, 179, 255);
  490. SDL_RenderFillRect(renderer, &rect);
  491. }
  492. }
  493.  
  494. //176, 158, 106
  495.  
  496. for (int k = 0; k < 3; k++) {
  497. for (int i = 0; i < 5; i++) {
  498. for (int j = 0; j < 3; j++) {
  499. if (k == 0) {
  500. if (digit3[i][j] == '1') {
  501. SDL_Rect rect = { ((j+(k*3)) * 10), (i * 10), 10, 10 };
  502. SDL_SetRenderDrawColor(renderer, 176, 158, 106, 255);
  503. SDL_RenderFillRect(renderer, &rect);
  504. }
  505. } else if (k == 1) {
  506. if (digit2[i][j] == '1') {
  507. SDL_Rect rect = { ((j+(k*3)+1) * 10), (i * 10), 10, 10 };
  508. SDL_SetRenderDrawColor(renderer, 176, 158, 106, 255);
  509. SDL_RenderFillRect(renderer, &rect);
  510. }
  511. } else if (k == 2) {
  512. if (digit1[i][j] == '1') {
  513. SDL_Rect rect = { ((j+(k*3)+2) * 10), (i * 10), 10, 10 };
  514. SDL_SetRenderDrawColor(renderer, 176, 158, 106, 255);
  515. SDL_RenderFillRect(renderer, &rect);
  516. }
  517. }
  518. }
  519. }
  520. }
  521.  
  522. SnakePiece *ptr;
  523.  
  524. ptr = head;
  525.  
  526. while (ptr) {
  527. SDL_Rect rect = { (ptr->x * 20), (ptr->y * 20), 20, 20 };
  528. SDL_SetRenderDrawColor(renderer, 100, 221, 23, 255);
  529. SDL_RenderFillRect(renderer, &rect);
  530.  
  531. ptr = ptr->next;
  532. }
  533.  
  534. SDL_Rect rect = { (fruitx * 20), (fruity * 20), 20, 20 };
  535. SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
  536. SDL_RenderFillRect(renderer, &rect);
  537. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement