Advertisement
MeehoweCK

Untitled

Dec 28th, 2020
734
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.22 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.     char direction;
  268.     bool flaga;
  269.  
  270.     do
  271.     {
  272.         flaga = true;
  273.  
  274.         do
  275.         {
  276.             direction = getch();
  277.             direction = toupper(direction);
  278.  
  279.         }
  280.         while(direction != 'J' && direction != 'K' && direction != 'L' && direction != 'I');
  281.  
  282.         switch(direction)
  283.         {
  284.         case 'J':
  285.             // w lewo
  286.             if(bohater.x > 1 && tablica[bohater.y][bohater.x - 1] != pole::mur && tablica[bohater.y][bohater.x - 1] != pole::przeciwnik)
  287.             {
  288.                 tablica[bohater.y][bohater.x] = pole::mur;
  289.                 --bohater.x;
  290.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  291.                 flaga = false;
  292.             }
  293.             break;
  294.         case 'I':
  295.             // w górę
  296.             if(bohater.y > 1 && tablica[bohater.y - 1][bohater.x] != pole::mur && tablica[bohater.y - 1][bohater.x] != pole::przeciwnik)
  297.             {
  298.                 tablica[bohater.y][bohater.x] = pole::mur;
  299.                 --bohater.y;
  300.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  301.                 flaga = false;
  302.             }
  303.             break;
  304.         case 'L':
  305.         // w prawo
  306.         if(bohater.x < 31 && tablica[bohater.y][bohater.x + 1] != pole::mur && tablica[bohater.y][bohater.x + 1] != pole::przeciwnik)
  307.             {
  308.                 tablica[bohater.y][bohater.x] = pole::mur;
  309.                 ++bohater.x;
  310.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  311.                 flaga = false;
  312.             }
  313.             break;
  314.         case 'K':
  315.             // w dół
  316.             if(bohater.y < 31 && tablica[bohater.y + 1][bohater.x] != pole::mur && tablica[bohater.y + 1][bohater.x] != pole::przeciwnik)
  317.             {
  318.                 tablica[bohater.y][bohater.x] = pole::mur;
  319.                 ++bohater.y;
  320.                 tablica[bohater.y][bohater.x] = pole::poszukiwacz;
  321.                 flaga = false;
  322.             }
  323.         }
  324.  
  325.     }
  326.     while(flaga);
  327.  
  328.     if(bohater == cel)
  329.         stan = stan_gry::koniec_zwyciestwo;
  330. }
  331.  
  332. void wypisz_plansze()
  333. {
  334.     for(int i = 0; i < N; ++i)
  335.     {
  336.         for(int j = 0; j < N; ++j)
  337.             switch(tablica[i][j])
  338.             {
  339.             case pole::mur:
  340.                 cout << '#';
  341.                 break;
  342.             case pole::skarb:
  343.                 cout << 'X';
  344.                 break;
  345.             case pole::puste:
  346.                 cout << ' ';
  347.                 break;
  348.             case pole::poszukiwacz:
  349.                 cout << 'O';
  350.                 break;
  351.             case pole::przeciwnik:
  352.                 cout << '@';
  353.             }
  354.         cout << endl;
  355.     }
  356.  
  357.     cout << endl;
  358.     cout << bohater.x << '\t' << bohater.y << endl;
  359. }
  360.  
  361. void ruch_przeciwnikami()
  362. {
  363.     unsigned ile = przeciwnicy.size();
  364.     for(unsigned i = 0; i < ile; ++i)
  365.         poruszanie_przeciwnikiem(i);
  366. }
  367.  
  368. int main()
  369. {
  370.     int ilosc_przeciwnikow;
  371.  
  372.     cout << "Podaj ilosc przeciwnikow: " << endl;
  373.     cin >> ilosc_przeciwnikow;
  374.  
  375.     uzupelnienie(ilosc_przeciwnikow);
  376.  
  377.     do
  378.     {
  379.         system("cls");          // odświeżenie konsoli
  380.         wypisz_plansze();
  381.         poruszanie_poszukiwaczem();
  382.         ruch_przeciwnikami();
  383.     }
  384.     while(stan == stan_gry::gra_otwarta);
  385.  
  386.     return 0;
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement