Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <string>
  5. #include <vector>
  6. #include <ctime>
  7. #include <cstdlib>
  8. #include <conio.h>
  9.  
  10. using namespace std;
  11.  
  12. const int ROW = 18;
  13. const int COL = 32;
  14. const int ENEMIES = 3; //liczba wrogow
  15.  
  16.  
  17. char map[ROW][COL]; //mapa glowna do ktorej trzeba skopiowac wzorzec
  18.  
  19. char map_easy[ROW][COL] = { //wzorzec mapy o łatwym poziomie trudności
  20. "+#############################+",
  21. "| |",
  22. "| |##### ### ## | | |",
  23. "| ###### ########## |",
  24. "| |",
  25. "|# ### #### ### #######|",
  26. "| |",
  27. "| ###### ########## |",
  28. "| |",
  29. "| |##### ### ## | | |",
  30. "| ###### ########## |",
  31. "| |",
  32. "|# ### #### ### #######|",
  33. "| |",
  34. "| |##### ### ## | | |",
  35. "| ###### ########## |",
  36. "| |",
  37. "+#############################+"
  38. };
  39.  
  40. char map_normal[ROW][COL] = { //wzorzec mapy o średnim poziomie trudności
  41. "+#############################+",
  42. "| || | ##### || | |",
  43. "| |",
  44. "|### ## #### # | | |",
  45. "| |",
  46. "| || | ##### || | |",
  47. "| ### # || # ## ##|",
  48. "|### ## #### # | | |",
  49. "| |",
  50. "| |##### ### ## | | |",
  51. "| | ###### ##########|",
  52. "| || ## |",
  53. "|# ### #### | ### ######|",
  54. "| || | ##### || | |",
  55. "| |",
  56. "|### ## #### # | | |",
  57. "| | || | # # |",
  58. "+#############################+"
  59. };
  60.  
  61. char map_hard[ROW][COL] = { //wzorzec mapy o trudnym poziomie trudności
  62. "+#############################+",
  63. "| || | ##### || | |",
  64. "| ### # |# || # ## ##|",
  65. "|### ## #### # || | |",
  66. "| || | ##### || | |",
  67. "| ### # || # ## ##|",
  68. "|### ## #### # | # | |",
  69. "| || | ##### || | |",
  70. "| ### # || # ## ##|",
  71. "|### ## #### # | # | |",
  72. "| || | ##### || | |",
  73. "| ### # || # ## ##|",
  74. "|### ## #### # | | |",
  75. "| || | ##### || | ||",
  76. "| ### # || # ## ##|",
  77. "|### ## #### # | | |",
  78. "| || # | |## |",
  79. "+#############################+"
  80. };
  81.  
  82. void ShowMap() //funckja do wyswietlania mapy
  83. {
  84. for (int i = 0; i < 18; i++) //petla
  85. {
  86. cout << (string(map[i]) + "\n"); //wyswietlenie jednego wiersza
  87. }
  88. }
  89.  
  90. void setMap(char mapToSet[ROW][COL]) //funckja do skopiowania wzorca do mapy
  91. {
  92. for (int i = 0; i < 18; i++)//petla
  93. for (int j = 0; j < 32; j++)
  94. {
  95. map[i][j] = mapToSet[i][j]; //kopiowanie
  96. }
  97. }
  98.  
  99. void gotoxy(short x, short y) //ustawienie kursora przy postaci //w danych kordyantach
  100. {
  101. HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  102. COORD position = { x, y };
  103.  
  104. SetConsoleCursorPosition(hStdout, position);
  105. }
  106.  
  107. void setDots() //ulozenie kropek na planszy
  108. {
  109. // % to reszta z dzielenia. np. 4%3 = 1
  110.  
  111. for (int i = 0; i < ROW; i++)
  112. for (int j = 0; j < COL; j++) //w podwojnej petlni przechodzimy cala mape
  113. if (map[i][j] == ' ' && (rand() % 15) == 0) // jesli jest pole na mapie puste i wylosuje nam liczbe podzielna prrzez 15 -> pokrycie 1/15 planszy
  114. {
  115. map[i][j] = '.'; // jesli warunek spelniony to wpisujemy w mape punkt
  116. }
  117.  
  118.  
  119. }
  120.  
  121. void setEnemiesCords(int *ex, int *ey, int numOfEnemies) //funkcja ktora wyznaczy kordynaty poczatkowe przeciwnikow
  122. {
  123. for (int i = 0; i < numOfEnemies; i++) //dla kazdego przeciwnika:
  124. {
  125. do { //losujemy tak dlugo kordynaty az pole pod kordynatami bedzie puste -> do skutku
  126. ex[i] = rand() % COL;
  127. ey[i] = rand() % ROW;
  128.  
  129. } while (map[ey[i]][ex[i]] != ' ');
  130.  
  131. }
  132.  
  133. }
  134.  
  135.  
  136. bool isEndOfGame() //funkcja do sprawdzania czy gra sie zakonczyla. gra sie konczy gdy nie ma kropek
  137. {
  138. bool result = true; //zakladamy ze to koniec gry
  139. for (int i = 0; i < ROW; i++)
  140. for (int j = 0; j < COL; j++) //przechodizmy cala mape
  141. if (map[i][j] == '.') // jesli sie pojawi kropka gdziekolwiek to nie koniec czyli zmienimy wynik na false
  142. {
  143. result = false;
  144. }
  145.  
  146.  
  147. return result;
  148. }
  149.  
  150.  
  151.  
  152.  
  153. struct Point { //struktura sluzaca do tego by zwrocic kordynaty przy sztucznej inteligencjjii
  154. int x;
  155. int y;
  156. };
  157.  
  158.  
  159. void fill(int binaryMap[ROW][COL], int distanceArray[ROW][COL], int x, int y, int currentDistance) //wypelnia tablice tymczasowa, zaczyna w punkcie (x,y) i wywoluje samą siebie dla sąsiadów //drugi etap sztucznej inteligencji
  160. {
  161.  
  162.  
  163. distanceArray[x][y] = currentDistance;
  164.  
  165. if (x + 1 < ROW && binaryMap[x + 1][y] == 1 && (distanceArray[x + 1][y] == 0 || distanceArray[x + 1][y] > currentDistance + 1))
  166. fill(binaryMap, distanceArray, x + 1, y, currentDistance + 1);
  167. if (x - 1 >= 0 && binaryMap[x - 1][y] == 1 && (distanceArray[x - 1][y] == 0 || distanceArray[x - 1][y] > currentDistance + 1))
  168. fill(binaryMap, distanceArray, x - 1, y, currentDistance + 1);
  169. if (y + 1 < COL && binaryMap[x][y + 1] == 1 && (distanceArray[x][y + 1] == 0 || distanceArray[x][y + 1] > currentDistance + 1))
  170. fill(binaryMap, distanceArray, x, y + 1, currentDistance + 1);
  171. if (y - 1 >= 0 && binaryMap[x][y - 1] == 1 && (distanceArray[x][y - 1] == 0 || distanceArray[x][y - 1] > currentDistance + 1))
  172. fill(binaryMap, distanceArray, x, y - 1, currentDistance + 1);
  173.  
  174. }
  175.  
  176.  
  177. Point findNextStep(int tmp[ROW][COL], int startX, int startY, int x, int y) //funckaj zwracajaca jaki kolejny krok musi wykonac przeciwnik by dojsc do gracza ////trzeci etap sztucznej inteligencji
  178. {
  179. int currentDist = tmp[x][y];
  180. if (x + 1 < ROW && tmp[x + 1][y] == currentDist - 1)
  181. if (x + 1 == startX && y == startY)
  182. return Point{ x, y };
  183. else
  184. return findNextStep(tmp, startX, startY, x + 1, y);
  185.  
  186. else if (x - 1 >= 0 && tmp[x - 1][y] == currentDist - 1)
  187. if (x - 1 == startX && y == startY)
  188. return Point{ x, y };
  189. else
  190. return findNextStep(tmp, startX, startY, x - 1, y);
  191.  
  192. else if (y + 1 < COL && tmp[x][y + 1] == currentDist - 1)
  193. if (x == startX && y + 1 == startY)
  194. return Point{ x, y };
  195. else
  196. return findNextStep(tmp, startX, startY, x, y + 1);
  197. else if (y - 1 >= 0 && tmp[x][y - 1] == currentDist - 1)
  198. if (x == startX && y - 1 == startY)
  199. return Point{ x, y };
  200. else
  201. return findNextStep(tmp, startX, startY, x, y - 1);
  202.  
  203.  
  204. }
  205.  
  206. void mapToBinary(int array[ROW][COL]) //funkcja do konwertowania mapy na binarny labirynt //pierwszy etap sztucznej inteligencji, tylko na poczatku gry poniewaz mapa sie nie zmienia pod wzgedem przeszkod
  207. {
  208. for (int i = 0; i < ROW; i++)
  209. for (int j = 0; j < COL; j++)
  210. if (map[i][j] == ' ' || map[i][j] == '.')
  211. array[i][j] = 1;
  212. else
  213. array[i][j] = 0;
  214.  
  215. }
  216.  
  217. Point getNextStep(int binaryMap[ROW][COL], int ex, int ey, int x, int y) //funckja ktora wywola etap 2 i 3 sztucznej intelgiencji i zwroci nastepmny krok
  218. {
  219. int distanceArray[ROW][COL]; //tablica tymczasowa o takiej samej wielkosci wypelniona tylko zerami
  220. for (int i = 0; i < ROW; i++)
  221. for (int j = 0; j < COL; j++)
  222. distanceArray[i][j] = 0;
  223.  
  224. fill(binaryMap, distanceArray, ex, ey, 1); //wypelnia tablice dystansami
  225.  
  226. Point nextStep = findNextStep(distanceArray, ex, ey, x, y); //pobieramy jaki trzeba wykonac nastepny krok
  227.  
  228. return nextStep; //zwracamy nastepny krok
  229.  
  230. }
  231.  
  232.  
  233.  
  234. int main()
  235. {
  236.  
  237.  
  238. srand(time(0));
  239.  
  240. int x = 15; //poczatkowae wspolrzedne x bohatera
  241. int y = 16; //poczatkowae wspolrzedne y bohatera
  242.  
  243.  
  244.  
  245.  
  246.  
  247. cout << "Pacman by Sliwa\n";
  248. cout << "H -> Hard\nN -> Normal\nE -> Easy\n\nInput : ";
  249.  
  250.  
  251. char level; //wczytujemy od uzytkownika poziom na jakim chce grac E/N/H
  252. cin >> level;
  253.  
  254. int speedmod; //szybkosc gry
  255.  
  256.  
  257. if (level == 'E')
  258. {
  259. speedmod = 3;
  260. setMap(map_easy);
  261. }
  262. else if (level == 'N')
  263. {
  264. speedmod = 2;
  265. setMap(map_normal);
  266.  
  267. }
  268. else {
  269. speedmod = 1;
  270. setMap(map_hard);
  271.  
  272. }
  273.  
  274. setDots();
  275.  
  276.  
  277. //kazdy wrog potrzebuje kordynaty //np. jesli 3 wrogow to tablica z kordynatami x musi byc wielkosci 3
  278. int enemiesX[ENEMIES]; //tworzenie tablic w ktorej beda wspolrzedne wrogow
  279. int enemiesY[ENEMIES];
  280. int enemiesSpeeds[ENEMIES]; //tablica z predkscia dla kazdego wroga
  281.  
  282.  
  283. setEnemiesCords(enemiesX, enemiesY, ENEMIES);
  284.  
  285. for (int i = 0; i < ENEMIES; i++) //wylosowanie predkosci dla wrogow
  286. {
  287. enemiesSpeeds[i] = speedmod + rand() % 5; // (rand() % 5) moze dac wartosc 0,1,2,3,4
  288. }
  289.  
  290.  
  291. system("cls"); //czysczenie ekranu
  292. ShowMap();//wyswieltenie mapy
  293.  
  294. int binaryMap[ROW][COL]; //binarny labirynt
  295. mapToBinary(binaryMap);
  296.  
  297. gotoxy(x, y);
  298. cout << "H"; //ustawienie bohateraa w pocztakowej pozycji
  299.  
  300. int frame = 0; //licznik petli gry //sluzy tylko do tego jak czesto maja sie poruszac wrogowie
  301.  
  302. int score = 0; //punkty
  303.  
  304. _getch(); //pobierz jeden znak przed gra by nie uruchomilo sie od razu
  305.  
  306. bool running = true; //zeby dzialala petla
  307.  
  308. while (isEndOfGame() == false && running == true) { //glowna petla gry // ona trwa dopoki sa kropki oraz dopoki running jest true
  309. gotoxy(x, y); //na poczatku petli usuwamy poprzednia pozycje bohatera
  310. cout << " ";
  311.  
  312.  
  313.  
  314. if (GetAsyncKeyState(VK_UP)) { //jesli nacisnieto w gore
  315. if (map[y - 1][x] == '.') {
  316. y--; score++; map[y][x] = ' '; //jesli nad graczem jest kropka to dodaj punkt i zamien na spacje i zrob ruch
  317. }
  318. else
  319. if (map[y - 1][x] == ' ') y--; //jesli nad graczem pusta przestrzen to zrob ruch
  320. }
  321. if (GetAsyncKeyState(VK_DOWN)) {
  322. if (map[y + 1][x] == '.') {
  323. y++; score++; map[y][x] = ' ';
  324. }
  325. else
  326. if (map[y + 1][x] == ' ') y++;
  327. }
  328. if (GetAsyncKeyState(VK_LEFT)) {
  329. if (map[y][x - 1] == '.') { x--; score++; map[y][x] = ' '; }
  330. else
  331. if (map[y][x - 1] == ' ') x--;
  332. }
  333. if (GetAsyncKeyState(VK_RIGHT)) {
  334. if (map[y][x + 1] == '.') {
  335. x++; score++; map[y][x] = ' ';
  336. }
  337. else
  338. if (map[y][x + 1] == ' ') x++;
  339. }
  340.  
  341. //w tym momencie wiemy jaka bedzie pozycja bohatera w kolejnej petli
  342.  
  343. gotoxy(x, y);
  344. cout << "H";//wyswietlenie bohatera w nowej pozycji
  345.  
  346. for (int i = 0; i < ENEMIES; i++) //usun kazdego przeciwnika ze starej pozycji
  347. {
  348. gotoxy(enemiesX[i], enemiesY[i]);
  349. cout << " ";
  350. }
  351.  
  352. //sztuczna inteligencja
  353. //1. uzyskujemy binarna mape/labirynt
  354. //2. tworzymy tablice z dystansami
  355. //3. znajdujemy kolejny krok dla przeciwnika
  356. //algorytm inspirowany BFS - przeszukiwanie grafu wszerz
  357.  
  358. for (int i = 0; i < ENEMIES; i++) //sztuczna inteligencja - znajdz nastepne pole dla przeciwnikow
  359. if (frame%enemiesSpeeds[i] == 0) //przeciwnik moze sie ruszyc tylko co iles iteracji //im trudniej tym czesciej moze sie ruszac
  360. {
  361. Point p = getNextStep(binaryMap, enemiesY[i], enemiesX[i], y, x);
  362.  
  363. enemiesX[i] = p.y;
  364. enemiesY[i] = p.x;
  365.  
  366. if (map[enemiesY[i]][enemiesX[i]] == '.') //przeciwnik moze zjesc punkt/kropke
  367. map[enemiesY[i]][enemiesX[i]] = ' ';
  368. }
  369. //w tym momencie wiemy jaka beda pozycje przeciwnikow w kolejnej petli/iteracji
  370.  
  371.  
  372. for (int i = 0; i < ENEMIES; i++) //zrob ruch kazdym przeciwnikiem
  373. {
  374. gotoxy(enemiesX[i], enemiesY[i]);
  375. cout << "E";
  376.  
  377. if (enemiesX[i] == x && enemiesY[i] == y) //sprawdzanie czy przegrasmy (przegralismy jest nowe kordynaty przeciwnika beda takie same jak boahtera)
  378. {
  379. running = false;
  380. }
  381. }
  382.  
  383. gotoxy(32, 18);//wyrzuc kursor poza plansze
  384. gotoxy(32, 1); cout << score;//wyswietl punkty
  385. Sleep(100); //czekaj 100ms
  386. frame++; //licznik iteracji + 1
  387. }
  388.  
  389. system("cls");
  390.  
  391. if (isEndOfGame() == true)
  392. {
  393. cout << "Wygrales!\nLiczba punktow:" << score;
  394. }
  395.  
  396. if (running == false)
  397. {
  398. cout << "Przegrales!";
  399. }
  400.  
  401. Sleep(5000);
  402.  
  403.  
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement