Advertisement
Guest User

Untitled

a guest
Jun 30th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <windows.h>
  4. #include <gl/glut.h>
  5. #include <ctype.h>
  6. #include <new>
  7. #define Block 1
  8. #define Pacman 2
  9. #define Resource 4
  10.  
  11. using namespace std;
  12.  
  13. void changeLevel (const char*);
  14. void drawElement (int, int, int, int, int, int);
  15. void display ();
  16. void keyboard (unsigned char, int, int);
  17. void move_packman_up ();
  18. void move_packman_down ();
  19. void move_packman_left ();
  20. void move_packman_right ();
  21. bool level_over ();
  22.  
  23. int **board, width, heigth;
  24. int FinishX, FinishY, PacmanX, PacmanY, level = 0, count = 0;
  25. FILE *f;
  26.  
  27. int main (void)
  28. {
  29.     setlocale (2, "");
  30.     changeLevel ("level0.txt");
  31.     glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  32.     glutInitWindowSize (400, 400);
  33.     glutInitWindowPosition (200, 200);
  34.     glutCreateWindow ("Pacman");
  35.     glClearColor (1.0, 1.0, 1.0, 1.0);
  36.     glMatrixMode (GL_PROJECTION);
  37.     glLoadIdentity ();
  38.     glOrtho (0, 400, 400, 0, -1, 1);
  39.     glutKeyboardFunc (keyboard);
  40.     glutDisplayFunc (display);
  41.     glutMainLoop ();
  42.     return 0;
  43. }
  44.  
  45. void changeLevel(const char *str)
  46. {
  47.     if (f != NULL)
  48.         fclose (f);
  49.     if ((f = fopen (str, "r+")) == NULL)
  50.     {
  51.         printf ("Ошибка открытия уровня!");
  52.         exit (1);
  53.     }
  54.  
  55.     fscanf (f, "%d %d", &width, &heigth);
  56.     try
  57.     {
  58.         board = new int *[width];
  59.         for (int i = 0; i < width; i++)
  60.             board[i] = new int[heigth];
  61.     }
  62.     catch (bad_alloc xa)
  63.     {
  64.         printf ("Исключительная ситуация\n");
  65.         return;
  66.     }
  67.     for (int i = 0; i < width; i++)
  68.     {
  69.         for (int j = 0; j < heigth; j++)
  70.         {
  71.             fscanf (f, "%d", &board[i][j]);
  72.             if (board[i][j] == 3)
  73.             {
  74.                 FinishX = j;
  75.                 FinishY = i;
  76.             }
  77.             if (board[i][j] == Pacman)
  78.             {
  79.                 PacmanX = j;
  80.                 PacmanY = i;
  81.             }
  82.             if (board[i][j] == Resource)
  83.                 count++;
  84.         }
  85.     }
  86. }
  87.  
  88. void drawElement (int x, int y, int rad, int r, int g, int b)
  89. {
  90.     glColor3f (r, g, b);
  91.     int centerX = x*10 + (x+1)*10;
  92.     int centerY = y*10 + (y+1)*10;
  93.     glBegin (GL_POLYGON);
  94.         glVertex2f (centerX - rad, centerY - rad);
  95.         glVertex2f (centerX + rad, centerY - rad);
  96.         glVertex2f (centerX + rad, centerY + rad);
  97.         glVertex2f (centerX - rad, centerY + rad);
  98.     glEnd ();
  99. }
  100.  
  101. void move_pacman_up ()
  102. {
  103.     if (board[PacmanY-1][PacmanX] != Block)
  104.     {
  105.         if (board[PacmanY-1][PacmanX] == Resource)
  106.         {
  107.             board[PacmanY-1][PacmanX] = 0;
  108.             count--;
  109.             printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
  110.         }
  111.         board[PacmanY][PacmanX] = 0;
  112.         board[PacmanY-1][PacmanX] = 2;
  113.         PacmanY--;
  114.     }
  115. }
  116.  
  117. void move_pacman_down ()
  118. {
  119.     if (board[PacmanY+1][PacmanX] != Block)
  120.     {
  121.         if (board[PacmanY+1][PacmanX] == Resource)
  122.         {
  123.             board[PacmanY+1][PacmanX] = 0;
  124.             count--;
  125.             printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
  126.         }
  127.         board[PacmanY][PacmanX] = 0;
  128.         board[PacmanY+1][PacmanX] = 2;
  129.         PacmanY++;
  130.     }
  131. }
  132.  
  133. void move_pacman_left ()
  134. {
  135.     if (board[PacmanY][PacmanX-1] != Block)
  136.     {
  137.         if (board[PacmanY][PacmanX-1] == Resource)
  138.         {
  139.             board[PacmanY][PacmanX-1] = 0;
  140.             count--;
  141.             printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
  142.         }
  143.         board[PacmanY][PacmanX] = 0;
  144.         board[PacmanY][PacmanX-1] = 2;
  145.         PacmanX--;
  146.     }
  147. }
  148.  
  149. void move_pacman_right ()
  150. {
  151.     if (board[PacmanY][PacmanX+1] != Block)
  152.     {
  153.         if (board[PacmanY][PacmanX+1] == Resource)
  154.         {
  155.             board[PacmanY][PacmanX+1] = 0;
  156.             count--;
  157.             printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
  158.         }
  159.         board[PacmanY][PacmanX] = 0;
  160.         board[PacmanY][PacmanX+1] = 2;
  161.         PacmanX++;
  162.     }
  163. }
  164.  
  165. bool level_over ()
  166. {
  167.     return PacmanX == FinishX && PacmanY == FinishY;
  168. }
  169.  
  170. void display ()
  171. {
  172.     glClear (GL_COLOR_BUFFER_BIT);
  173.     drawElement (FinishX, FinishY, 10, 0, 1, 0);
  174.     for (int i = 0; i < width; i++)
  175.     {
  176.         for (int j = 0; j < heigth; j++)
  177.         {
  178.             if (board[i][j] == Block)
  179.                 drawElement (j, i, 10, 0, 0, 1);
  180.             if (board[i][j] == Pacman)
  181.                 drawElement (j, i, 10, 1, 0, 1);
  182.             if (board[i][j] == Resource)
  183.                 drawElement (j, i, 5, 1, 1, 0);
  184.         }
  185.     }
  186.     glFlush ();
  187. }
  188.  
  189. void keyboard (unsigned char key, int x, int y)
  190. {
  191.     switch (key)
  192.     {
  193.         case 'w':
  194.         case 'W':
  195.             move_pacman_up ();
  196.             break;
  197.         case 's':
  198.         case 'S':
  199.             move_pacman_down ();
  200.             break;
  201.         case 'a':
  202.         case 'A':
  203.             move_pacman_left ();
  204.             break;
  205.         case 'd':
  206.         case 'D':
  207.             move_pacman_right ();
  208.             break;
  209.         case 27:
  210.         case 'q':
  211.             printf ("GAME OVER!!!");
  212.             exit(0);
  213.         default:
  214.             break;
  215.     }
  216.     if (level_over())
  217.     {
  218.         if (count == 0)
  219.         {
  220.             level++;
  221.             switch (level)
  222.             {
  223.                 case 1:
  224.                     printf ("\nУровень %d пройден!\n", level);
  225.                     changeLevel ("level1.txt");
  226.                     break;
  227.                 case 2:
  228.                     printf ("\nУровень %d пройден!\n", level);
  229.                     changeLevel ("level2.txt");
  230.                     break;
  231.                 case 3:
  232.                     printf ("\nУровень %d пройден!\n", level);
  233.                     printf("GAME OVER!!!");
  234.                     exit (0);
  235.                 default:
  236.                     break;
  237.             }
  238.         }
  239.         else
  240.             printf ("Вы собрали не всю манну небесную, еще осталось собрать %d\n", count);
  241.     }
  242.     display();
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement