Advertisement
Guest User

Untitled

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