Guest User

Untitled

a guest
Jun 24th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream.h>
  3. #include <conio.h>
  4. #include <graphics.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <time.h>
  8.  
  9. #define HEIGHT 480
  10. #define WIDTH 640
  11. #define ENTER 13
  12. #define RIGHT 77
  13. #define LEFT 75
  14. #define DOWN 80
  15. #define ESC 27
  16. #define UP 72
  17. #define PI 3.1415
  18.  
  19. class Basket {
  20. public:
  21. int x, width;
  22. Basket() {
  23. width = 20;
  24. x = WIDTH/2;
  25. }
  26. void draw()//пакмэн-корзинка
  27. {
  28. setfillstyle(SOLID_FILL, YELLOW);
  29. setcolor(YELLOW);
  30. sector(x - width/2, HEIGHT - width/2, 135, 360 , width, width);
  31. sector(x - width/2, HEIGHT - width/2, 45, 0 , width, width);
  32. }
  33. void move(int by)//движениe корзинки
  34. {
  35. x += by;
  36. if(x - width/2 < 0)
  37. x = width/2;
  38. if(x + width/2 > WIDTH)
  39. x = WIDTH - width/2;
  40. draw();
  41. }
  42. };
  43.  
  44. class Ball//шарики
  45. {
  46. public:
  47. int x, y, r, used, score, color;
  48. Ball() // обычные шарики
  49. {
  50. r = 10;
  51. y = 21 + r;
  52. x = rand() % (WIDTH - r * 2);
  53. color = rand() % (15) + 1;
  54. used = 1;
  55. score = 10;
  56. if(color == MAGENTA) {
  57. r = 15;
  58. score = 50;
  59. } if(color == RED) {
  60. r = 15;
  61. score = -50;// бонус и антибонус
  62. } if(color == YELLOW) {
  63. r = 12;
  64. score = 0;
  65. } if(color == WHITE) {
  66. r = 12;
  67. score = 0;// +время и -время
  68. }
  69.  
  70. }
  71. void draw() {
  72. setfillstyle(SOLID_FILL, color);
  73. setcolor(color);
  74. fillellipse(x, y, r, r);// генератор шариков
  75. if(color == WHITE || color == YELLOW) {
  76. setcolor(BLACK);
  77. line(x, y, x + r, y);
  78. line(x, y, x, y - r);// шарики-часики
  79. }
  80. }
  81. void drop(int by) {
  82. y += by;
  83. draw();
  84. }
  85. };
  86.  
  87.  
  88. class Game {
  89. Basket basket;
  90. Ball * balls;
  91. int scores_a[10];
  92. char * names[10];
  93. int num, score, level, maxTime;
  94. int passed, start, lastDrop;
  95.  
  96. public:
  97. Game();
  98. ~Game();
  99.  
  100. void init()// начальные данные
  101. {
  102. start = time(NULL);
  103. balls = new Ball[20];
  104. basket = Basket();
  105. num = 0;
  106. passed = score = 0;
  107. lastDrop = 0;
  108. level = 1;
  109. maxTime = 60;
  110. }
  111.  
  112. void dropBall()//при исчезновении шарика - новый
  113. {
  114. if(num >= 10)
  115. return;
  116. balls[num++] = Ball();
  117. lastDrop = passed;
  118. }
  119.  
  120. void moveBasket(int by) {
  121. basket.move(by);
  122. }
  123.  
  124. void showStatusBar()//счет,время,уровень
  125. {
  126. char buffer [10];
  127. setcolor(RED);
  128. outtextxy( 0,0,"SCORE:");
  129. outtextxy(70,0, itoa(score, buffer, 10));
  130.  
  131. outtextxy(WIDTH - 70, 0, "TIME:");
  132. outtextxy(WIDTH - 20, 0, itoa(maxTime - passed, buffer, 10));
  133.  
  134. setcolor(WHITE);
  135. outtextxy(WIDTH/2 - 30, 0, "LEVEL");
  136. outtextxy(WIDTH/2 + 25, 0, itoa(level, buffer, 10));
  137.  
  138. line(0, 25, WIDTH, 25);
  139. }
  140.  
  141. void repaint() {
  142. setfillstyle(SOLID_FILL,BLACK);
  143. setcolor(BLACK);
  144. bar(0, 0, WIDTH, 24);
  145. bar(0, 26, WIDTH, HEIGHT);
  146. showStatusBar();
  147. moveBalls();
  148. basket.move(0);
  149. }
  150. void PANIC() {
  151. cleardevice();
  152. outtextxy(WIDTH/2 - 40, HEIGHT/2 -10, "GAME OVER :(");
  153. outtextxy(WIDTH/2 - 100, HEIGHT/2 + 5, "<ANY KEY TO COMMIT SUICIDE>");
  154. wait();
  155. getch();
  156. }
  157.  
  158. void drawMenu(int selected) {
  159. cleardevice();setcolor(YELLOW);
  160. settextstyle(4, HORIZ_DIR, 5);
  161. outtextxy(200,10,"PAC-MAN");
  162. setcolor(RED);
  163. settextstyle(2, HORIZ_DIR, 6);
  164. outtextxy(WIDTH/2 - 24, HEIGHT/6, "START");
  165. outtextxy(WIDTH/2 - 22, 2*HEIGHT/6, "HELP");
  166. outtextxy(WIDTH/2 - 26, 3*HEIGHT/6, "ABOUT");
  167. outtextxy(WIDTH/2 - 50, 4*HEIGHT/6, "HIGHSCORES");
  168. outtextxy(WIDTH/2 - 22, 5*HEIGHT/6, "EXIT");
  169. setcolor(WHITE);
  170. rectangle(WIDTH/2 - 70, (selected + 1)*HEIGHT/6 -15, WIDTH/2 + 60,(selected + 1)*HEIGHT/6 + 30);
  171. }
  172.  
  173. void help() {
  174. cleardevice();
  175. int y=20;
  176. circle(50, 20, 10);
  177. setfillstyle(SOLID_FILL,MAGENTA);
  178. fillellipse(50, 120, 15, 15);
  179. setfillstyle(SOLID_FILL,RED);
  180. fillellipse(50, 220, 15, 15);
  181. setfillstyle(SOLID_FILL,WHITE);
  182. fillellipse(50, 320, 10, 10);
  183. setcolor(BLACK);
  184. line(50, 320, 50, 310);
  185. line(50, 320, 60, 320);
  186. setfillstyle(SOLID_FILL,YELLOW);
  187. fillellipse(50, 420, 10, 10);
  188. setcolor(BLACK);
  189. line(50, 420, 50, 410);
  190. line(50, 420, 60, 420);
  191. settextstyle(3, HORIZ_DIR, 2);
  192. setcolor(GREEN);
  193. outtextxy(100, y, "Usual ball(Many colors). Gives 10 points");
  194. y+=100;
  195. outtextxy(100, y, "Bonus ball. Gives 50 points");
  196. y+=100;
  197. outtextxy(100, y, "Bad-bad-baaaaad ball. Gives -50 points");
  198. y+=100;
  199. outtextxy(100, y, "Time Bonus ball. Adds 5 seconds");
  200. y+=100;
  201. outtextxy(100, y, "Time-stealing ball. Steals 5 seconds");
  202. settextstyle(1, HORIZ_DIR, 4);
  203. wait();
  204. getch();
  205. }
  206.  
  207. void about() {
  208. cleardevice();
  209. settextstyle(1, HORIZ_DIR, 1);
  210. outtextxy(20,20,"Aim of this game is to catch as much balls");
  211. outtextxy(20,60,"as you can in 1 minute.");
  212. outtextxy(20,100, "You controls PacMan (with arrows).");
  213. outtextxy(20,140, "There are some bonuses you should eat,");
  214. outtextxy(20,180, "also harmful objects you should avoid.");
  215. setfillstyle(SOLID_FILL, YELLOW);
  216. setcolor(YELLOW);
  217. sector(520,250, 135, 360 , 50, 50);
  218. sector(520,250, 45, 0 , 50, 50);
  219. setfillstyle(SOLID_FILL, GREEN);
  220. setcolor(GREEN);
  221. fillellipse(490, 120, 20, 20);
  222. setfillstyle(SOLID_FILL, WHITE);
  223. setcolor(WHITE);
  224. fillellipse(530, 90, 20, 20);
  225.  
  226. outtextxy(100, 400, "(c)Sokolov K. K-181 2009");
  227. wait();
  228. getch();
  229. }
  230.  
  231.  
  232.  
  233. void save();
  234. void menu();
  235. void wait();
  236. void play();
  237. void scores();
  238. void newScore();
  239. void perform(int);
  240. void moveBalls();
  241. };
  242.  
  243. void Game::save() {
  244. FILE * fp;
  245. fp = fopen("scores.txt", "w+t");
  246. for(int i=0; i<10; i++) {
  247. fprintf(fp, "%d\n", scores_a[i]);
  248. fprintf(fp, "%s\n", names[i]);
  249. }
  250. fclose(fp);
  251. }
  252.  
  253. void Game::wait() {
  254. clock_t endwait;
  255. endwait = clock () + (CLOCKS_PER_SEC / 10);
  256. while (clock() < endwait);
  257. }
  258. void Game::moveBalls() {
  259. for(int i = 0; i < num; i ++)
  260. if(balls[i].used) {
  261. balls[i].drop(level + 3);// движение шарика и увеличение скорости
  262. if(balls[i].y >= HEIGHT - balls[i].r/2) {
  263. if(abs(balls[i].x - basket.x) <= basket.width) // ловля корзинкой
  264. {
  265. score += balls[i].score;// увеличение очков
  266. if(balls[i].color == WHITE) {
  267. start += 5;// бонус времени
  268. }
  269. if(balls[i].color == YELLOW) {
  270. start -= 5;//антибонус времени
  271. }
  272. if(level < 5 && score / 50 + 1 > level) {
  273. level = score / 50 + 1;// увеличение уровня
  274. }
  275. }
  276. balls[i] = Ball();
  277. }
  278. }
  279. }
  280. void Game::play() {
  281. cleardevice();
  282. init();
  283. char key = -1;
  284. while(key != ESC) {
  285. passed = time(NULL) - start;
  286. if(passed >= maxTime) {
  287. if(score > scores_a[9])
  288. newScore();
  289. else
  290. PANIC();
  291. return;
  292. }
  293. if(passed - lastDrop >= level)
  294. dropBall();
  295. if(key == RIGHT)
  296. moveBasket( 8 + level);
  297. if(key == LEFT)
  298. moveBasket(-(8 + level));
  299. wait();
  300. if(kbhit()) {
  301. key = getch();
  302. }
  303. else
  304. key = -1;
  305. repaint();
  306. }
  307. }
  308.  
  309. void Game::perform(int action) {
  310. switch(action) {
  311. case 0: play(); break;
  312. case 1: help(); break;
  313. case 2: about(); break;
  314. case 3: scores(); break;
  315. case 4: save(); exit(0); break;
  316. }
  317. }
  318.  
  319. void Game::newScore() {
  320. //когда установлен новый рекорд
  321. int i;
  322. cleardevice();
  323. //новая позиция
  324. for(i = 9; i > 0 && scores_a[i - 1] < score; i --) {
  325. scores_a[i] = scores_a[i - 1];
  326. strcpy(names[i], names[i - 1]);
  327. }
  328. scores_a[i] = score;
  329. outtextxy(WIDTH/2 - 95, HEIGHT/2 -10, "YOU SET A NEW HIGHSCORE :)");
  330. outtextxy(WIDTH/2 - 120, HEIGHT/2 + 5, "Type your name and press ENTER");
  331. delete names[i];
  332. names[i] = new char[100];
  333. int j = 0;
  334. while((key = getch() != ENTER && j < 98) {
  335. if(key == '\b') {
  336. setfillstyle(SOLID_FILL,BLACK);
  337. setcolor(BLACK);
  338. bar((WIDTH/2 - 190) + (7*j), HEIGHT/2 + 15, (WIDTH/2 - 190) + (7*(j + 1)), HEIGHT/2 + 25);
  339. j --;
  340. } else {
  341. names[i][j] = key;
  342. outtextxy((WIDTH/2 - 190) + (7*j), HEIGHT/2 + 15, key);
  343. }
  344. }
  345. names[j] = '\0';
  346. }
  347. //меню
  348. void Game::menu() {
  349. int key = -1;
  350. int selected = 0;
  351. drawMenu(0);
  352. while(key != ESC) {
  353. if(kbhit()) {
  354. key = getch();
  355. if(key == UP)
  356. selected --;
  357. if(key == DOWN)
  358. selected ++;
  359. if(key == ENTER)
  360. perform(selected);
  361. //прокрутка меню(зацикленное меню)
  362. selected = (selected + 5) % 5;
  363. drawMenu(selected);
  364. }
  365. else
  366. key = -1;
  367. }
  368. //выход
  369. perform(4);
  370. }
  371.  
  372. void Game::scores() {
  373. cleardevice();
  374. //временная штука
  375. char buf[100];
  376. setcolor(WHITE);
  377. //вывод рекордов
  378. for(int i = 0; i < 10; i ++) {
  379. outtextxy(WIDTH/2 - 100, (i) * HEIGHT/11 + 10, names[i]);
  380. outtextxy(WIDTH/2 + 85, (i) * HEIGHT/11 + 10, itoa(scores_a[i], buf, 10));
  381. }
  382. outtextxy(WIDTH/2 - 100, HEIGHT - 25, "<ANY KEY TO GO BACK>");
  383. //ожидание
  384. wait();
  385. //до нажатия кнопки
  386. getch();
  387. }
  388. //конструктор
  389. void Game::Game() {
  390. //обнул.
  391. init();
  392. //рандом
  393. srand ( start );
  394. FILE * fp;
  395. //чтение рекордов из файла(scores)
  396. fp = fopen("scores.txt", "rt");
  397. for(int i=0; i<10; i++) {
  398. names[i] = new char[100];
  399. if(fp != NULL && !feof(fp)) {
  400. fscanf(fp, "%d", &scores_a[i]);
  401. fscanf(fp, "%s", names[i]);
  402. }
  403. else {
  404. scores_a[i] = 0;
  405. names[i] = "UNKNOWN";
  406. }
  407. }
  408. fclose(fp);
  409. }
  410. void Game::~Game() {
  411. //удаление лишнего,память освобождает
  412. delete[] balls;
  413. for(int i = 0; i < 10; i ++)
  414. delete[] names[i];
  415. }
  416.  
  417. void main() {
  418. int gd = DETECT, gm;
  419. initgraph(&gd, &gm, "E:\\BC\\BGI");
  420. cleardevice();
  421. //game class
  422. Game g;
  423. //попали в меню
  424. g.menu();
  425. closegraph();
  426. }
Add Comment
Please, Sign In to add comment