Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <iostream.h>
- #include <conio.h>
- #include <graphics.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #define HEIGHT 480
- #define WIDTH 640
- #define ENTER 13
- #define RIGHT 77
- #define LEFT 75
- #define DOWN 80
- #define ESC 27
- #define UP 72
- #define PI 3.1415
- class Basket {
- public:
- int x, width;
- Basket() {
- width = 20;
- x = WIDTH/2;
- }
- void draw()//пакмэн-корзинка
- {
- setfillstyle(SOLID_FILL, YELLOW);
- setcolor(YELLOW);
- sector(x - width/2, HEIGHT - width/2, 135, 360 , width, width);
- sector(x - width/2, HEIGHT - width/2, 45, 0 , width, width);
- }
- void move(int by)//движениe корзинки
- {
- x += by;
- if(x - width/2 < 0)
- x = width/2;
- if(x + width/2 > WIDTH)
- x = WIDTH - width/2;
- draw();
- }
- };
- class Ball//шарики
- {
- public:
- int x, y, r, used, score, color;
- Ball() // обычные шарики
- {
- r = 10;
- y = 21 + r;
- x = rand() % (WIDTH - r * 2);
- color = rand() % (15) + 1;
- used = 1;
- score = 10;
- if(color == MAGENTA) {
- r = 15;
- score = 50;
- } if(color == RED) {
- r = 15;
- score = -50;// бонус и антибонус
- } if(color == YELLOW) {
- r = 12;
- score = 0;
- } if(color == WHITE) {
- r = 12;
- score = 0;// +время и -время
- }
- }
- void draw() {
- setfillstyle(SOLID_FILL, color);
- setcolor(color);
- fillellipse(x, y, r, r);// генератор шариков
- if(color == WHITE || color == YELLOW) {
- setcolor(BLACK);
- line(x, y, x + r, y);
- line(x, y, x, y - r);// шарики-часики
- }
- }
- void drop(int by) {
- y += by;
- draw();
- }
- };
- class Game {
- Basket basket;
- Ball * balls;
- int scores_a[10];
- char * names[10];
- int num, score, level, maxTime;
- int passed, start, lastDrop;
- public:
- Game();
- ~Game();
- void init()// начальные данные
- {
- start = time(NULL);
- balls = new Ball[20];
- basket = Basket();
- num = 0;
- passed = score = 0;
- lastDrop = 0;
- level = 1;
- maxTime = 60;
- }
- void dropBall()//при исчезновении шарика - новый
- {
- if(num >= 10)
- return;
- balls[num++] = Ball();
- lastDrop = passed;
- }
- void moveBasket(int by) {
- basket.move(by);
- }
- void showStatusBar()//счет,время,уровень
- {
- char buffer [10];
- setcolor(RED);
- outtextxy( 0,0,"SCORE:");
- outtextxy(70,0, itoa(score, buffer, 10));
- outtextxy(WIDTH - 70, 0, "TIME:");
- outtextxy(WIDTH - 20, 0, itoa(maxTime - passed, buffer, 10));
- setcolor(WHITE);
- outtextxy(WIDTH/2 - 30, 0, "LEVEL");
- outtextxy(WIDTH/2 + 25, 0, itoa(level, buffer, 10));
- line(0, 25, WIDTH, 25);
- }
- void repaint() {
- setfillstyle(SOLID_FILL,BLACK);
- setcolor(BLACK);
- bar(0, 0, WIDTH, 24);
- bar(0, 26, WIDTH, HEIGHT);
- showStatusBar();
- moveBalls();
- basket.move(0);
- }
- void PANIC() {
- cleardevice();
- outtextxy(WIDTH/2 - 40, HEIGHT/2 -10, "GAME OVER :(");
- outtextxy(WIDTH/2 - 100, HEIGHT/2 + 5, "<ANY KEY TO COMMIT SUICIDE>");
- wait();
- getch();
- }
- void drawMenu(int selected) {
- cleardevice();setcolor(YELLOW);
- settextstyle(4, HORIZ_DIR, 5);
- outtextxy(200,10,"PAC-MAN");
- setcolor(RED);
- settextstyle(2, HORIZ_DIR, 6);
- outtextxy(WIDTH/2 - 24, HEIGHT/6, "START");
- outtextxy(WIDTH/2 - 22, 2*HEIGHT/6, "HELP");
- outtextxy(WIDTH/2 - 26, 3*HEIGHT/6, "ABOUT");
- outtextxy(WIDTH/2 - 50, 4*HEIGHT/6, "HIGHSCORES");
- outtextxy(WIDTH/2 - 22, 5*HEIGHT/6, "EXIT");
- setcolor(WHITE);
- rectangle(WIDTH/2 - 70, (selected + 1)*HEIGHT/6 -15, WIDTH/2 + 60,(selected + 1)*HEIGHT/6 + 30);
- }
- void help() {
- cleardevice();
- int y=20;
- circle(50, 20, 10);
- setfillstyle(SOLID_FILL,MAGENTA);
- fillellipse(50, 120, 15, 15);
- setfillstyle(SOLID_FILL,RED);
- fillellipse(50, 220, 15, 15);
- setfillstyle(SOLID_FILL,WHITE);
- fillellipse(50, 320, 10, 10);
- setcolor(BLACK);
- line(50, 320, 50, 310);
- line(50, 320, 60, 320);
- setfillstyle(SOLID_FILL,YELLOW);
- fillellipse(50, 420, 10, 10);
- setcolor(BLACK);
- line(50, 420, 50, 410);
- line(50, 420, 60, 420);
- settextstyle(3, HORIZ_DIR, 2);
- setcolor(GREEN);
- outtextxy(100, y, "Usual ball(Many colors). Gives 10 points");
- y+=100;
- outtextxy(100, y, "Bonus ball. Gives 50 points");
- y+=100;
- outtextxy(100, y, "Bad-bad-baaaaad ball. Gives -50 points");
- y+=100;
- outtextxy(100, y, "Time Bonus ball. Adds 5 seconds");
- y+=100;
- outtextxy(100, y, "Time-stealing ball. Steals 5 seconds");
- settextstyle(1, HORIZ_DIR, 4);
- wait();
- getch();
- }
- void about() {
- cleardevice();
- settextstyle(1, HORIZ_DIR, 1);
- outtextxy(20,20,"Aim of this game is to catch as much balls");
- outtextxy(20,60,"as you can in 1 minute.");
- outtextxy(20,100, "You controls PacMan (with arrows).");
- outtextxy(20,140, "There are some bonuses you should eat,");
- outtextxy(20,180, "also harmful objects you should avoid.");
- setfillstyle(SOLID_FILL, YELLOW);
- setcolor(YELLOW);
- sector(520,250, 135, 360 , 50, 50);
- sector(520,250, 45, 0 , 50, 50);
- setfillstyle(SOLID_FILL, GREEN);
- setcolor(GREEN);
- fillellipse(490, 120, 20, 20);
- setfillstyle(SOLID_FILL, WHITE);
- setcolor(WHITE);
- fillellipse(530, 90, 20, 20);
- outtextxy(100, 400, "(c)Sokolov K. K-181 2009");
- wait();
- getch();
- }
- void save();
- void menu();
- void wait();
- void play();
- void scores();
- void newScore();
- void perform(int);
- void moveBalls();
- };
- void Game::save() {
- FILE * fp;
- fp = fopen("scores.txt", "w+t");
- for(int i=0; i<10; i++) {
- fprintf(fp, "%d\n", scores_a[i]);
- fprintf(fp, "%s\n", names[i]);
- }
- fclose(fp);
- }
- void Game::wait() {
- clock_t endwait;
- endwait = clock () + (CLOCKS_PER_SEC / 10);
- while (clock() < endwait);
- }
- void Game::moveBalls() {
- for(int i = 0; i < num; i ++)
- if(balls[i].used) {
- balls[i].drop(level + 3);// движение шарика и увеличение скорости
- if(balls[i].y >= HEIGHT - balls[i].r/2) {
- if(abs(balls[i].x - basket.x) <= basket.width) // ловля корзинкой
- {
- score += balls[i].score;// увеличение очков
- if(balls[i].color == WHITE) {
- start += 5;// бонус времени
- }
- if(balls[i].color == YELLOW) {
- start -= 5;//антибонус времени
- }
- if(level < 5 && score / 50 + 1 > level) {
- level = score / 50 + 1;// увеличение уровня
- }
- }
- balls[i] = Ball();
- }
- }
- }
- void Game::play() {
- cleardevice();
- init();
- char key = -1;
- while(key != ESC) {
- passed = time(NULL) - start;
- if(passed >= maxTime) {
- if(score > scores_a[9])
- newScore();
- else
- PANIC();
- return;
- }
- if(passed - lastDrop >= level)
- dropBall();
- if(key == RIGHT)
- moveBasket( 8 + level);
- if(key == LEFT)
- moveBasket(-(8 + level));
- wait();
- if(kbhit()) {
- key = getch();
- }
- else
- key = -1;
- repaint();
- }
- }
- void Game::perform(int action) {
- switch(action) {
- case 0: play(); break;
- case 1: help(); break;
- case 2: about(); break;
- case 3: scores(); break;
- case 4: save(); exit(0); break;
- }
- }
- void Game::newScore() {
- //когда установлен новый рекорд
- int i;
- cleardevice();
- //новая позиция
- for(i = 9; i > 0 && scores_a[i - 1] < score; i --) {
- scores_a[i] = scores_a[i - 1];
- strcpy(names[i], names[i - 1]);
- }
- scores_a[i] = score;
- outtextxy(WIDTH/2 - 95, HEIGHT/2 -10, "YOU SET A NEW HIGHSCORE :)");
- outtextxy(WIDTH/2 - 120, HEIGHT/2 + 5, "Type your name and press ENTER");
- delete names[i];
- names[i] = new char[100];
- int j = 0;
- while((key = getch() != ENTER && j < 98) {
- if(key == '\b') {
- setfillstyle(SOLID_FILL,BLACK);
- setcolor(BLACK);
- bar((WIDTH/2 - 190) + (7*j), HEIGHT/2 + 15, (WIDTH/2 - 190) + (7*(j + 1)), HEIGHT/2 + 25);
- j --;
- } else {
- names[i][j] = key;
- outtextxy((WIDTH/2 - 190) + (7*j), HEIGHT/2 + 15, key);
- }
- }
- names[j] = '\0';
- }
- //меню
- void Game::menu() {
- int key = -1;
- int selected = 0;
- drawMenu(0);
- while(key != ESC) {
- if(kbhit()) {
- key = getch();
- if(key == UP)
- selected --;
- if(key == DOWN)
- selected ++;
- if(key == ENTER)
- perform(selected);
- //прокрутка меню(зацикленное меню)
- selected = (selected + 5) % 5;
- drawMenu(selected);
- }
- else
- key = -1;
- }
- //выход
- perform(4);
- }
- void Game::scores() {
- cleardevice();
- //временная штука
- char buf[100];
- setcolor(WHITE);
- //вывод рекордов
- for(int i = 0; i < 10; i ++) {
- outtextxy(WIDTH/2 - 100, (i) * HEIGHT/11 + 10, names[i]);
- outtextxy(WIDTH/2 + 85, (i) * HEIGHT/11 + 10, itoa(scores_a[i], buf, 10));
- }
- outtextxy(WIDTH/2 - 100, HEIGHT - 25, "<ANY KEY TO GO BACK>");
- //ожидание
- wait();
- //до нажатия кнопки
- getch();
- }
- //конструктор
- void Game::Game() {
- //обнул.
- init();
- //рандом
- srand ( start );
- FILE * fp;
- //чтение рекордов из файла(scores)
- fp = fopen("scores.txt", "rt");
- for(int i=0; i<10; i++) {
- names[i] = new char[100];
- if(fp != NULL && !feof(fp)) {
- fscanf(fp, "%d", &scores_a[i]);
- fscanf(fp, "%s", names[i]);
- }
- else {
- scores_a[i] = 0;
- names[i] = "UNKNOWN";
- }
- }
- fclose(fp);
- }
- void Game::~Game() {
- //удаление лишнего,память освобождает
- delete[] balls;
- for(int i = 0; i < 10; i ++)
- delete[] names[i];
- }
- void main() {
- int gd = DETECT, gm;
- initgraph(&gd, &gm, "E:\\BC\\BGI");
- cleardevice();
- //game class
- Game g;
- //попали в меню
- g.menu();
- closegraph();
- }
Add Comment
Please, Sign In to add comment