Advertisement
MeehoweCK

Untitled

Dec 28th, 2020
793
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <vector>
  5. #include <conio.h>
  6.  
  7. using namespace std;
  8.  
  9. const int N = 33;
  10.  
  11. struct koordynaty
  12. {
  13.     int x;
  14.     int y;
  15. };
  16.  
  17. enum class pole
  18. {
  19.     puste, skarb, mur, poszukiwacz, przeciwnik
  20. };
  21.  
  22. enum class stan_gry
  23. {
  24.     gra_otwarta, koniec_zwyciestwo, koniec_porazka
  25. };
  26.  
  27. stan_gry stan = stan_gry::gra_otwarta;
  28. pole tablica[N][N];
  29. vector<koordynaty> przeciwnicy;
  30. koordynaty bohater;
  31. koordynaty cel;
  32.  
  33. bool operator==(koordynaty A, koordynaty B)
  34. {
  35.     if(A.x == B.x && A.y == B.y)
  36.         return true;
  37.     return false;
  38. }
  39.  
  40. void uzupelnienie(int ilosc_przeciwnikow)
  41. {
  42.     srand(time(NULL));
  43.  
  44.     vector<koordynaty> puste_pola;
  45.     koordynaty nowy;
  46.  
  47.     for(int i = 0; i < N ; i++)
  48.     {
  49.         for(int j = 0; j < N; j++)
  50.         {
  51.             if(i == 0 || i == N - 1 || j == 0 || j == N - 1)
  52.             {
  53.                 tablica[i][j] = pole::mur;
  54.                 continue;
  55.             }
  56.             if(i % 2 == 0 && j % 2 == 0)
  57.                 tablica[i][j] = pole::mur;
  58.             else
  59.             {
  60.                 tablica[i][j] = pole::puste;
  61.                 nowy.x = j;
  62.                 nowy.y = i;
  63.                 puste_pola.push_back(nowy);
  64.             }
  65.         }
  66.     }
  67.  
  68.     int liczba_pustych = puste_pola.size();
  69.     int numer = rand() % liczba_pustych;
  70.     nowy = puste_pola[numer];
  71.     cel = nowy;
  72.     tablica[nowy.y][nowy.x] = pole::skarb;
  73.     puste_pola.erase(puste_pola.begin() + numer);
  74.  
  75.     liczba_pustych = puste_pola.size();
  76.     numer = rand() % liczba_pustych;
  77.     nowy = puste_pola[numer];
  78.     bohater = nowy;
  79.     tablica[nowy.y][nowy.x] = pole::poszukiwacz;
  80.     puste_pola.erase(puste_pola.begin() + numer);
  81.  
  82.     while(ilosc_przeciwnikow >= 0)
  83.     {
  84.         liczba_pustych = puste_pola.size();
  85.         numer = rand() % liczba_pustych;
  86.         nowy = puste_pola[numer];
  87.         przeciwnicy.push_back(nowy);
  88.         tablica[nowy.y][nowy.x] = pole::przeciwnik;
  89.         puste_pola.erase(puste_pola.begin() + numer);
  90.  
  91.         ilosc_przeciwnikow--;
  92.     }
  93.  
  94. }
  95.  
  96. vector<koordynaty> dostepne_pola_przeciwnika(koordynaty przeciwnik)
  97. {
  98.     vector<koordynaty> wynik;
  99.     wynik.clear();
  100.     koordynaty nowy;
  101.  
  102.     // sprawdzenie czy przeciwnik może wejść na pole z poszukiwaczem:
  103.     // w lewo i w górę
  104.     if(tablica[przeciwnik.y - 1][przeciwnik.x - 1] == pole::poszukiwacz)
  105.     {
  106.         nowy.y = przeciwnik.y - 1;
  107.         nowy.x = przeciwnik.x - 1;
  108.         wynik.push_back(nowy);
  109.         return wynik;
  110.     }
  111.     // w górę
  112.     if(tablica[przeciwnik.y - 1][przeciwnik.x] == pole::poszukiwacz)
  113.     {
  114.         nowy.y = przeciwnik.y - 1;
  115.         nowy.x = przeciwnik.x;
  116.         wynik.push_back(nowy);
  117.         return wynik;
  118.     }
  119.     // w prawo i w górę
  120.     if(tablica[przeciwnik.y - 1][przeciwnik.x + 1] == pole::poszukiwacz)
  121.     {
  122.         nowy.y = przeciwnik.y - 1;
  123.         nowy.x = przeciwnik.x + 1;
  124.         wynik.push_back(nowy);
  125.         return wynik;
  126.     }
  127.     // w prawo
  128.     if(tablica[przeciwnik.y][przeciwnik.x + 1] == pole::poszukiwacz)
  129.     {
  130.         nowy.y = przeciwnik.y;
  131.         nowy.x = przeciwnik.x + 1;
  132.         wynik.push_back(nowy);
  133.         return wynik;
  134.     }
  135.     // w prawo i w dół
  136.     if(tablica[przeciwnik.y + 1][przeciwnik.x + 1] == pole::poszukiwacz)
  137.     {
  138.         nowy.y = przeciwnik.y + 1;
  139.         nowy.x = przeciwnik.x + 1;
  140.         wynik.push_back(nowy);
  141.         return wynik;
  142.     }
  143.     // w dół
  144.     if(tablica[przeciwnik.y + 1][przeciwnik.x] == pole::poszukiwacz)
  145.     {
  146.         nowy.y = przeciwnik.y + 1;
  147.         nowy.x = przeciwnik.x;
  148.         wynik.push_back(nowy);
  149.         return wynik;
  150.     }
  151.     // w lewo i w dół
  152.     if(tablica[przeciwnik.y + 1][przeciwnik.x - 1] == pole::poszukiwacz)
  153.     {
  154.         nowy.y = przeciwnik.y + 1;
  155.         nowy.x = przeciwnik.x - 1;
  156.         wynik.push_back(nowy);
  157.         return wynik;
  158.     }
  159.     // w lewo
  160.     if(tablica[przeciwnik.y][przeciwnik.x - 1] == pole::poszukiwacz)
  161.     {
  162.         nowy.y = przeciwnik.y;
  163.         nowy.x = przeciwnik.x - 1;
  164.         wynik.push_back(nowy);
  165.         return wynik;
  166.     }
  167.  
  168.     // poszukiwanie pustych pól:
  169.     // w lewo i w górę
  170.     if(tablica[przeciwnik.y - 1][przeciwnik.x - 1] == pole::puste)
  171.     {
  172.         nowy.y = przeciwnik.y - 1;
  173.         nowy.x = przeciwnik.x - 1;
  174.         wynik.push_back(nowy);
  175.     }
  176.     // w górę
  177.     if(tablica[przeciwnik.y - 1][przeciwnik.x] == pole::puste)
  178.     {
  179.         nowy.y = przeciwnik.y - 1;
  180.         nowy.x = przeciwnik.x;
  181.         wynik.push_back(nowy);
  182.     }
  183.     // w prawo i w górę
  184.     if(tablica[przeciwnik.y - 1][przeciwnik.x + 1] == pole::puste)
  185.     {
  186.         nowy.y = przeciwnik.y - 1;
  187.         nowy.x = przeciwnik.x + 1;
  188.         wynik.push_back(nowy);
  189.     }
  190.     // w prawo
  191.     if(tablica[przeciwnik.y][przeciwnik.x + 1] == pole::puste)
  192.     {
  193.         nowy.y = przeciwnik.y;
  194.         nowy.x = przeciwnik.x + 1;
  195.         wynik.push_back(nowy);
  196.     }
  197.     // w prawo i w dół
  198.     if(tablica[przeciwnik.y + 1][przeciwnik.x + 1] == pole::puste)
  199.     {
  200.         nowy.y = przeciwnik.y + 1;
  201.         nowy.x = przeciwnik.x + 1;
  202.         wynik.push_back(nowy);
  203.     }
  204.     // w dół
  205.     if(tablica[przeciwnik.y + 1][przeciwnik.x] == pole::puste)
  206.     {
  207.         nowy.y = przeciwnik.y + 1;
  208.         nowy.x = przeciwnik.x;
  209.         wynik.push_back(nowy);
  210.     }
  211.     // w lewo i w dół
  212.     if(tablica[przeciwnik.y + 1][przeciwnik.x - 1] == pole::puste)
  213.     {
  214.         nowy.y = przeciwnik.y + 1;
  215.         nowy.x = przeciwnik.x - 1;
  216.         wynik.push_back(nowy);
  217.     }
  218.     // w lewo
  219.     if(tablica[przeciwnik.y][przeciwnik.x - 1] == pole::puste)
  220.     {
  221.         nowy.y = przeciwnik.y;
  222.         nowy.x = przeciwnik.x - 1;
  223.         wynik.push_back(nowy);
  224.     }
  225.     return wynik;
  226. }
  227.  
  228. void poruszanie_przeciwnikiem(unsigned nr)  // nr - nr przeciwnika
  229. {
  230.     vector<koordynaty> kierunki = dostepne_pola_przeciwnika(przeciwnicy[nr]);
  231.     unsigned ile_mozliwosci = kierunki.size();
  232.  
  233.     if(ile_mozliwosci == 0)
  234.         return;
  235.  
  236.     koordynaty ruch = przeciwnicy[nr];
  237.     if(ile_mozliwosci == 1)
  238.     {
  239.         // poruszamy się na jedyne dostępne pole:
  240.         // czyścimy pole na którym znajduje się obecnie:
  241.         tablica[ruch.y][ruch.x] = pole::puste;
  242.         // wykonujemy ruch:
  243.         ruch = kierunki[0];
  244.  
  245.         // sprawdzamy czy nie jest to ruch na pole z poszukiwaczem:
  246.         if(tablica[ruch.y][ruch.x] == pole::poszukiwacz)
  247.             stan = stan_gry::koniec_porazka;
  248.         tablica[ruch.y][ruch.x] = pole::przeciwnik;
  249.         // aktualizujemy położenie:
  250.         przeciwnicy[nr] = ruch;
  251.         return;
  252.     }
  253.  
  254.     // więcej niż 1 możliwość:
  255.     srand(time(nullptr));
  256.     int numer = rand() % ile_mozliwosci;
  257.     tablica[ruch.y][ruch.x] = pole::puste;
  258.     // wykonujemy ruch:
  259.     ruch = kierunki[numer];
  260.     tablica[ruch.y][ruch.x] = pole::przeciwnik;
  261.     // aktualizujemy położenie:
  262.     przeciwnicy[nr] = ruch;
  263. }
  264.  
  265. void poruszanie_poszukiwaczem()
  266. {
  267.     // sprawdzamy czy możemy się gdzieś ruszyć
  268.     if(tablica[bohater.y][bohater.x - 1] == pole::mur || tablica[bohater.y][bohater.x - 1] == pole::przeciwnik)
  269.         if(tablica[bohater.y][bohater.x + 1] == pole::mur || tablica[bohater.y][bohater.x + 1] == pole::przeciwnik)
  270.             if(tablica[bohater.y - 1][bohater.x] == pole::mur || tablica[bohater.y - 1][bohater.x] == pole::przeciwnik)
  271.                 if(tablica[bohater.y + 1][bohater.x] == pole::mur || tablica[bohater.y + 1][bohater.x] == pole::przeciwnik)
  272.                 {
  273.                     stan = stan_gry::koniec_porazka;
  274.                     return;
  275.                 }
  276.  
  277.  
  278.     char direction;
  279.     bool flaga;
  280.  
  281.     do
  282.     {
  283.         flaga = true;
  284.  
  285.         do
  286.         {
  287.             direction = getch();
  288.             direction = toupper(direction);
  289.  
  290.         }
  291.         while(direction != 'J' && direction != 'K' && direction != 'L' && direction != 'I');
  292.  
  293.         switch(direction)
  294.         {
  295.         case 'J':
  296.             // w lewo
  297.             if(bohater.x > 1 && tablica[bohater.y][bohater.x - 1] != pole::mur && tablica[bohater.y][bohater.x - 1] != pole::przeciwnik)
  298.             {
  299.                 tablica[bohater.y][bohater.x] = pole::mur;
  300.                 --bohater.x;
  301.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  302.                 flaga = false;
  303.             }
  304.             break;
  305.         case 'I':
  306.             // w górę
  307.             if(bohater.y > 1 && tablica[bohater.y - 1][bohater.x] != pole::mur && tablica[bohater.y - 1][bohater.x] != pole::przeciwnik)
  308.             {
  309.                 tablica[bohater.y][bohater.x] = pole::mur;
  310.                 --bohater.y;
  311.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  312.                 flaga = false;
  313.             }
  314.             break;
  315.         case 'L':
  316.             // w prawo
  317.             if(bohater.x < 31 && tablica[bohater.y][bohater.x + 1] != pole::mur && tablica[bohater.y][bohater.x + 1] != pole::przeciwnik)
  318.             {
  319.                 tablica[bohater.y][bohater.x] = pole::mur;
  320.                 ++bohater.x;
  321.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  322.                 flaga = false;
  323.             }
  324.             break;
  325.         case 'K':
  326.             // w dół
  327.             if(bohater.y < 31 && tablica[bohater.y + 1][bohater.x] != pole::mur && tablica[bohater.y + 1][bohater.x] != pole::przeciwnik)
  328.             {
  329.                 tablica[bohater.y][bohater.x] = pole::mur;
  330.                 ++bohater.y;
  331.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  332.                 flaga = false;
  333.             }
  334.         }
  335.  
  336.     }
  337.     while(flaga);
  338.  
  339.     if(bohater == cel)
  340.         stan = stan_gry::koniec_zwyciestwo;
  341. }
  342.  
  343. void wypisz_plansze()
  344. {
  345.     for(int i = 0; i < N; ++i)
  346.     {
  347.         for(int j = 0; j < N; ++j)
  348.             switch(tablica[i][j])
  349.             {
  350.             case pole::mur:
  351.                 cout << '#';
  352.                 break;
  353.             case pole::skarb:
  354.                 cout << 'X';
  355.                 break;
  356.             case pole::puste:
  357.                 cout << ' ';
  358.                 break;
  359.             case pole::poszukiwacz:
  360.                 cout << 'O';
  361.                 break;
  362.             case pole::przeciwnik:
  363.                 cout << '@';
  364.             }
  365.         cout << endl;
  366.     }
  367. }
  368.  
  369. void ruch_przeciwnikami()
  370. {
  371.     unsigned ile = przeciwnicy.size();
  372.     for(unsigned i = 0; i < ile; ++i)
  373.         poruszanie_przeciwnikiem(i);
  374. }
  375.  
  376. int main()
  377. {
  378.     int ilosc_przeciwnikow;
  379.  
  380.     cout << "Podaj ilosc przeciwnikow: " << endl;
  381.     cin >> ilosc_przeciwnikow;
  382.  
  383.     uzupelnienie(ilosc_przeciwnikow);
  384.  
  385.     do
  386.     {
  387.         system("cls");          // odświeżenie konsoli
  388.         wypisz_plansze();
  389.         poruszanie_poszukiwaczem();
  390.         ruch_przeciwnikami();
  391.     }
  392.     while(stan == stan_gry::gra_otwarta);
  393.  
  394.     system("cls");
  395.     wypisz_plansze();
  396.     cout << endl;
  397.     if(stan == stan_gry::koniec_porazka)
  398.         cout << "Niestety, przegrales/przegralas :(\n";
  399.     else
  400.         cout << "Zwyciestwo, gratulacje!\n";
  401.  
  402.     return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement