Advertisement
MeehoweCK

Untitled

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