Advertisement
Guest User

Untitled

a guest
Dec 24th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <allegro.h>
  5. #include <allegro_primitives.h>
  6.  
  7. const int W = 500;
  8. const int H = 500;
  9. const float FPS = 15.0;
  10. int gameOver = 1;
  11. int draw = 1;
  12. const int recSize = 10;
  13. struct Node *pom;
  14.  
  15. enum Direction { DOWN, UP, LEFT, RIGHT };
  16.  
  17. struct Node
  18. {
  19.     int x, y;
  20. };
  21.  
  22. struct Snake
  23. {
  24.     int length;
  25.     struct Node *head;
  26.     struct Node *nodes;
  27. };
  28.  
  29. void logic        (struct Snake *snake, struct Node *fruit, struct Node *prev);
  30. void updatePrevPos(const struct Snake *snake, struct Node *previous);
  31. void updatePos    (struct Snake *snake, const struct Node *previous);
  32. void drawNodes    (const struct Snake *snake);
  33.  
  34. void addNode      (struct Snake *snake, struct Node *prev);
  35.  
  36. int main()
  37. {
  38.    if(!al_init())
  39.    {
  40.       fprintf(stderr, "failed to initialize allegro!\n");
  41.       return -1;
  42.    }
  43.  
  44.    //SETUP
  45.    ALLEGRO_DISPLAY *display = al_create_display(W, H);
  46.    al_set_window_position(display, 700, 200);
  47.    al_set_window_title(display, "SNAKE");
  48.  
  49.    al_init_primitives_addon();
  50.    al_install_keyboard();
  51.  
  52.    ALLEGRO_TIMER *timer = al_create_timer(1.0 / FPS);
  53.    ALLEGRO_EVENT_QUEUE *event_q = al_create_event_queue();
  54.    al_register_event_source(event_q, al_get_keyboard_event_source());
  55.    al_register_event_source(event_q, al_get_timer_event_source(timer));
  56.    al_register_event_source(event_q, al_get_display_event_source(display));
  57.  
  58.    al_start_timer(timer);
  59.  
  60.    if(!display)
  61.    {
  62.       fprintf(stderr, "failed to create display!\n");
  63.       return -1;
  64.    }
  65.  
  66.    ALLEGRO_COLOR black = al_map_rgb(0, 0, 0);
  67.    ALLEGRO_COLOR white = al_map_rgb(255,255,255);
  68.    int moveSpeed = 10;
  69.    enum Direction dir;
  70.  
  71.    struct Snake *snake = malloc(sizeof(struct Snake));
  72.    snake->length   = 1;
  73.    snake->head     = (struct Node *)malloc(sizeof(struct Node));
  74.    snake->nodes    = (struct Node *)malloc(snake->length * sizeof(struct Node));
  75.    snake->head->x  = W / 2;
  76.    snake->head->y  = H / 2;
  77.  
  78.    struct Node *prev_positions = (struct Node *)malloc(snake->length * sizeof(struct Node));
  79.  
  80.    struct Node *fruit = (struct Node *)malloc(sizeof(struct Node));
  81.    srand(time(NULL));
  82.    fruit->x = (int)(rand() % ((W - recSize) / recSize) + 1) * recSize;
  83.    fruit->y = (int)(rand() % ((W - recSize) / recSize) + 1) * recSize;
  84.    printf("%d %d\n", fruit->x, fruit->y);
  85.  
  86.    while(gameOver)
  87.    {
  88.         ALLEGRO_EVENT events;
  89.         al_wait_for_event(event_q, &events);
  90.  
  91.         updatePrevPos(snake, prev_positions);
  92.  
  93.         //OBSLUGA KLAWIATURY I OKNA
  94.         if (events.type == ALLEGRO_EVENT_KEY_DOWN)
  95.         {
  96.             switch(events.keyboard.keycode)
  97.             {
  98.                 case ALLEGRO_KEY_UP:
  99.                     dir = UP;
  100.                     break;
  101.  
  102.                 case ALLEGRO_KEY_DOWN:
  103.                     dir = DOWN;
  104.                     break;
  105.  
  106.                 case ALLEGRO_KEY_LEFT:
  107.                     dir = LEFT;
  108.                     break;
  109.  
  110.                 case ALLEGRO_KEY_RIGHT:
  111.                     dir = RIGHT;
  112.                     break;
  113.  
  114.                 case ALLEGRO_KEY_ESCAPE:
  115.                     gameOver = 0;
  116.                     break;
  117.             }
  118.         }
  119.         else if (events.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
  120.             gameOver = 0;
  121.  
  122.         if (events.type == ALLEGRO_EVENT_TIMER)
  123.         {
  124.             switch(dir)
  125.             {
  126.                 case UP:
  127.                 {
  128.                     snake->head->y -= moveSpeed;
  129.                     break;
  130.                 }
  131.  
  132.                 case DOWN:
  133.                 {
  134.                     snake->head->y += moveSpeed;
  135.                     break;
  136.                 }
  137.  
  138.                 case LEFT:
  139.                 {
  140.                     snake->head->x -= moveSpeed;
  141.                     break;
  142.                 }
  143.  
  144.                 case RIGHT:
  145.                 {
  146.                     snake->head->x += moveSpeed;
  147.                     break;
  148.                 }
  149.             }
  150.             draw = 1;
  151.         }
  152.  
  153.         logic(snake, fruit, prev_positions);
  154.  
  155.         if (draw && gameOver != 0)
  156.         {
  157.             draw = 0;
  158.  
  159.             al_draw_filled_rectangle(fruit->x, fruit->y, fruit->x + recSize, fruit->y + recSize, al_map_rgb(255,255,255));
  160.  
  161.             updatePos(snake, prev_positions);
  162.             drawNodes(snake);
  163.             updatePrevPos(snake, prev_positions);
  164.  
  165.             al_flip_display();
  166.             al_clear_to_color(black);
  167.         }
  168.    }
  169.  
  170.    free(snake);
  171.    free(prev_positions);
  172.    free(fruit);
  173.    free(pom);
  174.  
  175.    al_destroy_event_queue(event_q);
  176.    al_destroy_timer(timer);
  177.    al_destroy_display(display);
  178.  
  179.    return 0;
  180. }
  181.  
  182. void logic(struct Snake *snake, struct Node *fruit, struct Node *prev)
  183. {
  184.     //ZDERZENIE Z KONCEM PLANSZY
  185.     if (snake->head->y < 0)
  186.         gameOver = 0;
  187.     else if (snake->head->y > H - recSize)
  188.         gameOver = 0;
  189.     else if (snake->head->x < 0)
  190.         gameOver = 0;
  191.     else if (snake->head->x > W - recSize)
  192.         gameOver = 0;
  193.  
  194.     //ZJEDZENIE OWOCU
  195.     if (snake->head->x == fruit->x && snake->head->y == fruit->y)
  196.     {
  197.         addNode(snake, prev);
  198.         fruit->x = (rand() % (W / recSize - 1) + 1) * recSize;
  199.         fruit->y = (rand() % (H / recSize - 1) + 1) * recSize;
  200.     }
  201.  
  202.     //ZDERZENIE Z OGONEM
  203.     /*for (int i = 0; i < l; i++)
  204.         if (head->x == nodes[i].x && head->y == nodes[i].y)
  205.         {
  206.             printf("%d %d\n", head->y, nodes[i].y);
  207.             gameOver = 0;
  208.         }*/
  209. }
  210.  
  211. void updatePrevPos(const struct Snake *snake, struct Node *previous)
  212. {
  213.      previous[0].x = snake->head->x;
  214.      previous[0].y = snake->head->y;
  215.  
  216.      for (int i = 1; i < snake->length; i++)
  217.      {
  218.         previous[i].x = snake->nodes[i - 1].x;
  219.         previous[i].y = snake->nodes[i - 1].y;
  220.      }
  221. }
  222.  
  223. void updatePos(struct Snake *snake, const struct Node *previous)
  224. {
  225.     for (int i = 0; i < snake->length; i++)
  226.     {
  227.         snake->nodes[i].x = previous[i].x;
  228.         snake->nodes[i].y = previous[i].y;
  229.     }
  230. }
  231.  
  232. void drawNodes(const struct Snake *snake)
  233. {
  234.     al_draw_rectangle(snake->head->x + 1, snake->head->y + 1, snake->head->x + recSize, snake->head->y + recSize, al_map_rgb(255,255,255), 1.0);
  235.  
  236.     for (int i = 0; i < snake->length; i++)
  237.         al_draw_rectangle(snake->nodes[i].x + 1, snake->nodes[i].y + 1, snake->nodes[i].x + recSize, snake->nodes[i].y + recSize, al_map_rgb(255,255,255), 1.0);
  238. }
  239.  
  240. void addNode(struct Snake *snake, struct Node *prev)
  241. {
  242.     snake->length++;
  243.  
  244.     snake->nodes = (struct Node *)realloc(snake->nodes, snake->length * sizeof(struct Node));
  245.     prev = (struct Node *)realloc(prev, snake->length * sizeof(struct Node));
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement