Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <locale.h>
- #include <windows.h>
- #include <gl/glut.h>
- #include <ctype.h>
- #include <new>
- #define Block 1
- #define Pacman 2
- #define Resource 4
- using namespace std;
- void changeLevel (const char*);
- void drawElement (int, int, int, int, int, int);
- void display ();
- void keyboard (unsigned char, int, int);
- void move_packman_up ();
- void move_packman_down ();
- void move_packman_left ();
- void move_packman_right ();
- bool level_over ();
- int **board, width, heigth;
- int FinishX, FinishY, PacmanX, PacmanY, level = 0, count = 0;
- FILE *f;
- int main (void)
- {
- setlocale (2, "");
- changeLevel ("level0.txt");
- glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
- glutInitWindowSize (400, 400);
- glutInitWindowPosition (200, 200);
- glutCreateWindow ("Pacman");
- glClearColor (1.0, 1.0, 1.0, 1.0);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- glOrtho (0, 400, 400, 0, -1, 1);
- glutKeyboardFunc (keyboard);
- glutDisplayFunc (display);
- glutMainLoop ();
- return 0;
- }
- void changeLevel(const char *str)
- {
- if (f != NULL)
- fclose (f);
- if ((f = fopen (str, "r+")) == NULL)
- {
- printf ("Ошибка открытия уровня!");
- exit (1);
- }
- fscanf (f, "%d %d", &width, &heigth);
- try
- {
- board = new int *[width];
- for (int i = 0; i < width; i++)
- board[i] = new int[heigth];
- }
- catch (bad_alloc xa)
- {
- printf ("Исключительная ситуация\n");
- return;
- }
- for (int i = 0; i < width; i++)
- {
- for (int j = 0; j < heigth; j++)
- {
- fscanf (f, "%d", &board[i][j]);
- if (board[i][j] == 3)
- {
- FinishX = j;
- FinishY = i;
- }
- if (board[i][j] == Pacman)
- {
- PacmanX = j;
- PacmanY = i;
- }
- if (board[i][j] == Resource)
- count++;
- }
- }
- }
- void drawElement (int x, int y, int rad, int r, int g, int b)
- {
- glColor3f (r, g, b);
- int centerX = x*10 + (x+1)*10;
- int centerY = y*10 + (y+1)*10;
- glBegin (GL_POLYGON);
- glVertex2f (centerX - rad, centerY - rad);
- glVertex2f (centerX + rad, centerY - rad);
- glVertex2f (centerX + rad, centerY + rad);
- glVertex2f (centerX - rad, centerY + rad);
- glEnd ();
- }
- void move_pacman_up ()
- {
- if (board[PacmanY-1][PacmanX] != Block)
- {
- if (board[PacmanY-1][PacmanX] == Resource)
- {
- board[PacmanY-1][PacmanX] = 0;
- count--;
- printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
- }
- board[PacmanY][PacmanX] = 0;
- board[PacmanY-1][PacmanX] = 2;
- PacmanY--;
- }
- }
- void move_pacman_down ()
- {
- if (board[PacmanY+1][PacmanX] != Block)
- {
- if (board[PacmanY+1][PacmanX] == Resource)
- {
- board[PacmanY+1][PacmanX] = 0;
- count--;
- printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
- }
- board[PacmanY][PacmanX] = 0;
- board[PacmanY+1][PacmanX] = 2;
- PacmanY++;
- }
- }
- void move_pacman_left ()
- {
- if (board[PacmanY][PacmanX-1] != Block)
- {
- if (board[PacmanY][PacmanX-1] == Resource)
- {
- board[PacmanY][PacmanX-1] = 0;
- count--;
- printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
- }
- board[PacmanY][PacmanX] = 0;
- board[PacmanY][PacmanX-1] = 2;
- PacmanX--;
- }
- }
- void move_pacman_right ()
- {
- if (board[PacmanY][PacmanX+1] != Block)
- {
- if (board[PacmanY][PacmanX+1] == Resource)
- {
- board[PacmanY][PacmanX+1] = 0;
- count--;
- printf (count == 0 ? "Вы все собрали, идите на финиш!" : "Осталось собрать %d манны небесной\n", count);
- }
- board[PacmanY][PacmanX] = 0;
- board[PacmanY][PacmanX+1] = 2;
- PacmanX++;
- }
- }
- bool level_over ()
- {
- return PacmanX == FinishX && PacmanY == FinishY;
- }
- void display ()
- {
- glClear (GL_COLOR_BUFFER_BIT);
- drawElement (FinishX, FinishY, 10, 0, 1, 0);
- for (int i = 0; i < width; i++)
- {
- for (int j = 0; j < heigth; j++)
- {
- if (board[i][j] == Block)
- drawElement (j, i, 10, 0, 0, 1);
- if (board[i][j] == Pacman)
- drawElement (j, i, 10, 1, 0, 1);
- if (board[i][j] == Resource)
- drawElement (j, i, 5, 1, 1, 0);
- }
- }
- glFlush ();
- }
- void keyboard (unsigned char key, int x, int y)
- {
- switch (key)
- {
- case 'w':
- case 'W':
- move_pacman_up ();
- break;
- case 's':
- case 'S':
- move_pacman_down ();
- break;
- case 'a':
- case 'A':
- move_pacman_left ();
- break;
- case 'd':
- case 'D':
- move_pacman_right ();
- break;
- case 27:
- case 'q':
- printf ("GAME OVER!!!");
- exit(0);
- default:
- break;
- }
- if (level_over())
- {
- if (count == 0)
- {
- level++;
- switch (level)
- {
- case 1:
- printf ("\nУровень %d пройден!\n", level);
- changeLevel ("level1.txt");
- break;
- case 2:
- printf ("\nУровень %d пройден!\n", level);
- changeLevel ("level2.txt");
- break;
- case 3:
- printf ("\nУровень %d пройден!\n", level);
- printf("GAME OVER!!!");
- exit (0);
- default:
- break;
- }
- }
- else
- printf ("Вы собрали не всю манну небесную, еще осталось собрать %d\n", count);
- }
- display();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement