Advertisement
MeehoweCK

Untitled

Dec 8th, 2020
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <conio.h>
  6.  
  7. using namespace std;
  8.  
  9. const short N = 30;
  10.  
  11. enum class obiekt
  12. {
  13.     mur, pusty, poszukiwacz, wrog, skarb
  14. };
  15.  
  16. enum class stan_gry
  17. {
  18.     otwarta, porazka, zwyciestwo
  19. };
  20.  
  21. stan_gry stan;
  22.  
  23. struct koordynaty
  24. {
  25.     short x;
  26.     short y;
  27. };
  28.  
  29. void rysuj_plansze(obiekt plansza[][N])
  30. {
  31.     for(short i = 0; i < N + 2; ++i)
  32.         cout << '-';
  33.     cout << endl;
  34.     for(short i = 0; i < N; ++i)
  35.     {
  36.         cout << '|';
  37.         for(short j = 0; j < N; ++j)
  38.         {
  39.             switch(plansza[i][j])
  40.             {
  41.             case obiekt::mur:
  42.                 cout << '#';
  43.                 break;
  44.             case obiekt::pusty:
  45.                 cout << ' ';
  46.                 break;
  47.             case obiekt::poszukiwacz:
  48.                 cout << 'O';
  49.                 break;
  50.             case obiekt::wrog:
  51.                 cout << '@';
  52.                 break;
  53.             case obiekt::skarb:
  54.                 cout << 'X';
  55.                 break;
  56.             }
  57.         }
  58.         cout << '|' << endl;
  59.     }
  60.     for(short i = 0; i < N + 2; ++i)
  61.         cout << '-';
  62.     cout << endl;
  63. }
  64.  
  65. vector<koordynaty> wrogowie;
  66. koordynaty bohater;
  67. koordynaty cel;
  68.  
  69. vector<koordynaty> znajdz_puste(obiekt plansza[][N])
  70. {
  71.     koordynaty nowy;
  72.     vector<koordynaty> wyniki;
  73.     for(short i = 0; i < N; ++i)
  74.         for(short j = 0; j < N; ++j)
  75.         {
  76.             if(plansza[i][j] == obiekt::pusty)
  77.             {
  78.                 nowy.y = i;
  79.                 nowy.x = j;
  80.                 wyniki.push_back(nowy);
  81.             }
  82.         }
  83.     return wyniki;
  84. }
  85.  
  86. void wypelnij_plansze(obiekt plansza[][N], short ile_wrogow)
  87. {
  88.     for(short i = 0; i < N; ++i)
  89.         for(short j = 0; j < N; ++j)
  90.         {
  91.             if(i % 2 == 0 && j % 2 == 0)
  92.                 plansza[i][j] = obiekt::mur;
  93.             else
  94.                 plansza[i][j] = obiekt::pusty;
  95.         }
  96.  
  97.     koordynaty nowy;
  98.  
  99.     // wypelnienie wrogami:
  100.     wrogowie.clear();
  101.     short ile_pustych;
  102.     vector<koordynaty> puste;
  103.     srand(static_cast<unsigned>(time(nullptr)));
  104.     for(short i = 0; i < ile_wrogow; ++i)
  105.     {
  106.         puste = znajdz_puste(plansza);
  107.         ile_pustych = puste.size();
  108.         wrogowie.push_back(puste[rand() % ile_pustych]);
  109.         nowy.x = wrogowie[i].x;
  110.         nowy.y = wrogowie[i].y;
  111.         plansza[nowy.y][nowy.x] = obiekt::wrog;
  112.     }
  113.  
  114.     // dodanie poszukiwacza:
  115.     puste = znajdz_puste(plansza);
  116.     ile_pustych = puste.size();
  117.     bohater = puste[rand() % ile_pustych];
  118.     plansza[bohater.y][bohater.x] = obiekt::poszukiwacz;
  119.  
  120.     // dodanie skarbu:
  121.     puste = znajdz_puste(plansza);
  122.     ile_pustych = puste.size();
  123.     cel = puste[rand() % ile_pustych];
  124.     plansza[cel.y][cel.x] = obiekt::skarb;
  125. }
  126.  
  127. vector<koordynaty> znajdz_dostepne_poszukiwacz(obiekt plansza[][N], koordynaty xy)
  128. {
  129.     vector<koordynaty> wyniki;
  130.     koordynaty nowy;
  131.     wyniki.clear();
  132.  
  133.     // w lewo
  134.     if(xy.x > 0)
  135.         if(plansza[xy.y][xy.x - 1] == obiekt::poszukiwacz)
  136.         {
  137.             nowy.x = xy.x - 1;
  138.             nowy.y = xy.y;
  139.             wyniki.push_back(nowy);
  140.             return wyniki;
  141.         }
  142.     // w lewo i w górę
  143.     if(xy.x > 0 && xy.y > 0)
  144.         if(plansza[xy.y - 1][xy.x - 1] == obiekt::poszukiwacz)
  145.         {
  146.             nowy.x = xy.x - 1;
  147.             nowy.y = xy.y - 1;
  148.             wyniki.push_back(nowy);
  149.             return wyniki;
  150.         }
  151.     // w górę
  152.     if(xy.y > 0)
  153.         if(plansza[xy.y - 1][xy.x] == obiekt::poszukiwacz)
  154.         {
  155.             nowy.x = xy.x;
  156.             nowy.y = xy.y - 1;
  157.             wyniki.push_back(nowy);
  158.             return wyniki;
  159.         }
  160.     // w prawo i w górę
  161.     if(xy.x < N - 1 && xy.y > 0)
  162.         if(plansza[xy.y - 1][xy.x + 1] == obiekt::poszukiwacz)
  163.         {
  164.             nowy.x = xy.x + 1;
  165.             nowy.y = xy.y - 1;
  166.             wyniki.push_back(nowy);
  167.             return wyniki;
  168.         }
  169.     // w prawo
  170.     if(xy.x < N - 1)
  171.         if(plansza[xy.y][xy.x + 1] == obiekt::poszukiwacz)
  172.         {
  173.             nowy.x = xy.x + 1;
  174.             nowy.y = xy.y;
  175.             wyniki.push_back(nowy);
  176.             return wyniki;
  177.         }
  178.     // w prawo i w dół
  179.     if(xy.x < N - 1 && xy.y < N - 1)
  180.         if(plansza[xy.y + 1][xy.x + 1] == obiekt::poszukiwacz)
  181.         {
  182.             nowy.x = xy.x + 1;
  183.             nowy.y = xy.y + 1;
  184.             wyniki.push_back(nowy);
  185.             return wyniki;
  186.         }
  187.     // w dół
  188.     if(xy.y < N - 1)
  189.         if(plansza[xy.y + 1][xy.x] == obiekt::poszukiwacz)
  190.         {
  191.             nowy.x = xy.x;
  192.             nowy.y = xy.y + 1;
  193.             wyniki.push_back(nowy);
  194.             return wyniki;
  195.         }
  196.     // w lewo i w dół
  197.     if(xy.x > 0 && xy.y < N - 1)
  198.         if(plansza[xy.y + 1][xy.x - 1] == obiekt::poszukiwacz)
  199.         {
  200.             nowy.x = xy.x - 1;
  201.             nowy.y = xy.y + 1;
  202.             wyniki.push_back(nowy);
  203.             return wyniki;
  204.         }
  205.  
  206.  
  207.     // puste pola:
  208.     // w lewo
  209.     if(xy.x > 0)
  210.         if(plansza[xy.y][xy.x - 1] == obiekt::pusty)
  211.         {
  212.             nowy.x = xy.x - 1;
  213.             nowy.y = xy.y;
  214.             wyniki.push_back(nowy);
  215.         }
  216.     // w lewo i w górę
  217.     if(xy.x > 0 && xy.y > 0)
  218.         if(plansza[xy.y - 1][xy.x - 1] == obiekt::pusty)
  219.         {
  220.             nowy.x = xy.x - 1;
  221.             nowy.y = xy.y - 1;
  222.             wyniki.push_back(nowy);
  223.         }
  224.     // w górę
  225.     if(xy.y > 0)
  226.         if(plansza[xy.y - 1][xy.x] == obiekt::pusty)
  227.         {
  228.             nowy.x = xy.x;
  229.             nowy.y = xy.y - 1;
  230.             wyniki.push_back(nowy);
  231.         }
  232.     // w prawo i w górę
  233.     if(xy.x < N - 1 && xy.y > 0)
  234.         if(plansza[xy.y - 1][xy.x + 1] == obiekt::pusty)
  235.         {
  236.             nowy.x = xy.x + 1;
  237.             nowy.y = xy.y - 1;
  238.             wyniki.push_back(nowy);
  239.         }
  240.     // w prawo
  241.     if(xy.x < N - 1)
  242.         if(plansza[xy.y][xy.x + 1] == obiekt::pusty)
  243.         {
  244.             nowy.x = xy.x + 1;
  245.             nowy.y = xy.y;
  246.             wyniki.push_back(nowy);
  247.         }
  248.     // w prawo i w dół
  249.     if(xy.x < N - 1 && xy.y < N - 1)
  250.         if(plansza[xy.y + 1][xy.x + 1] == obiekt::pusty)
  251.         {
  252.             nowy.x = xy.x + 1;
  253.             nowy.y = xy.y + 1;
  254.             wyniki.push_back(nowy);
  255.         }
  256.     // w dół
  257.     if(xy.y < N - 1)
  258.         if(plansza[xy.y + 1][xy.x] == obiekt::pusty)
  259.         {
  260.             nowy.x = xy.x;
  261.             nowy.y = xy.y + 1;
  262.             wyniki.push_back(nowy);
  263.         }
  264.     // w lewo i w dół
  265.     if(xy.x > 0 && xy.y < N - 1)
  266.         if(plansza[xy.y + 1][xy.x - 1] == obiekt::pusty)
  267.         {
  268.             nowy.x = xy.x - 1;
  269.             nowy.y = xy.y + 1;
  270.             wyniki.push_back(nowy);
  271.         }
  272.  
  273.     return wyniki;
  274. }
  275.  
  276. void wykonaj_ruch(obiekt plansza[][N])
  277. {
  278.     char znak;
  279.     bool flaga;
  280.     do
  281.     {
  282.         flaga = true;
  283.         znak = getch();
  284.         znak = toupper(znak);
  285.         switch(znak)
  286.         {
  287.         case 'P':       // pauza
  288.             system("cls");
  289.             cout << "Gra zostala zapauzowana. Wcisnij dowolny przycisk, aby kontynuowac...\n";
  290.             getch();
  291.             system("cls");
  292.             rysuj_plansze(plansza);
  293.             break;
  294.  
  295.         case 'I':       // poruszaj w gore
  296.             if(bohater.y > 0)
  297.                 if(plansza[bohater.y - 1][bohater.x] == obiekt::pusty || plansza[bohater.y - 1][bohater.x] == obiekt::skarb)
  298.                 {
  299.                     if(plansza[bohater.y - 1][bohater.x] == obiekt::skarb)
  300.                     {
  301.                         plansza[bohater.y][bohater.x] = obiekt::mur;
  302.                         plansza[bohater.y - 1][bohater.x] = obiekt::poszukiwacz;
  303.                         stan = stan_gry::zwyciestwo;
  304.                         return;
  305.                     }
  306.                     plansza[bohater.y][bohater.x] = obiekt::mur;
  307.                     plansza[bohater.y - 1][bohater.x] = obiekt::poszukiwacz;
  308.                     --bohater.y;
  309.                     flaga = false;
  310.                 }
  311.             break;
  312.         case 'J':       // poruszaj w lewo
  313.             if(bohater.x > 0)
  314.                 if(plansza[bohater.y][bohater.x - 1] == obiekt::pusty || plansza[bohater.y][bohater.x - 1] == obiekt::skarb)
  315.                 {
  316.                     if(plansza[bohater.y][bohater.x - 1] == obiekt::skarb)
  317.                     {
  318.                         plansza[bohater.y][bohater.x] = obiekt::mur;
  319.                         plansza[bohater.y][bohater.x - 1] = obiekt::poszukiwacz;
  320.                         stan = stan_gry::zwyciestwo;
  321.                         return;
  322.                     }
  323.                     plansza[bohater.y][bohater.x] = obiekt::mur;
  324.                     plansza[bohater.y ][bohater.x - 1] = obiekt::poszukiwacz;
  325.                     --bohater.x;
  326.                     flaga = false;
  327.                 }
  328.             break;
  329.         case 'K':       // poruszaj w dol
  330.             if(bohater.y < N - 1)
  331.                 if(plansza[bohater.y + 1][bohater.x] == obiekt::pusty || plansza[bohater.y + 1][bohater.x] == obiekt::skarb)
  332.                 {
  333.                     if(plansza[bohater.y + 1][bohater.x] == obiekt::skarb)
  334.                     {
  335.                         plansza[bohater.y][bohater.x] = obiekt::mur;
  336.                         plansza[bohater.y + 1][bohater.x] = obiekt::poszukiwacz;
  337.                         stan = stan_gry::zwyciestwo;
  338.                         return;
  339.                     }
  340.                     plansza[bohater.y][bohater.x] = obiekt::mur;
  341.                     plansza[bohater.y + 1][bohater.x] = obiekt::poszukiwacz;
  342.                     ++bohater.y;
  343.                     flaga = false;
  344.                 }
  345.             break;
  346.         case 'L':       // poruszaj w prawo
  347.             if(bohater.x < N - 1)
  348.                 if(plansza[bohater.y][bohater.x + 1] == obiekt::pusty || plansza[bohater.y][bohater.x + 1] == obiekt::skarb)
  349.                 {
  350.                     if(plansza[bohater.y][bohater.x + 1] == obiekt::skarb)
  351.                     {
  352.                         plansza[bohater.y][bohater.x] = obiekt::mur;
  353.                         plansza[bohater.y][bohater.x + 1] = obiekt::poszukiwacz;
  354.                         stan = stan_gry::zwyciestwo;
  355.                         return;
  356.                     }
  357.                     plansza[bohater.y][bohater.x] = obiekt::mur;
  358.                     plansza[bohater.y][bohater.x + 1] = obiekt::poszukiwacz;
  359.                     ++bohater.x;
  360.                     flaga = false;
  361.                 }
  362.             break;
  363.         }
  364.     }
  365.     while(flaga);
  366. }
  367.  
  368. void wykonaj_ruch_wrogiem(koordynaty& przeciwnik, obiekt plansza[][N])
  369. {
  370.     vector<koordynaty> dostepne = znajdz_dostepne_poszukiwacz(plansza, przeciwnik);
  371.  
  372.     short dostepne_pola = dostepne.size();
  373.     if(dostepne_pola == 0)
  374.         return;
  375.     if(dostepne_pola == 1)
  376.     {
  377.         if(plansza[dostepne[0].y][dostepne[0].x] == obiekt::poszukiwacz)
  378.         {
  379.             plansza[dostepne[0].y][dostepne[0].x] = obiekt::wrog;
  380.             stan = stan_gry::porazka;
  381.             return;
  382.         }
  383.         // opuszczenie pola
  384.         plansza[przeciwnik.y][przeciwnik.x] = obiekt::pusty;
  385.         // zajęcie nowego pola:
  386.         przeciwnik = dostepne[0];
  387.         plansza[przeciwnik.y][przeciwnik.x] = obiekt::wrog;
  388.     }
  389.  
  390.     // wylosuj kierunek:
  391.     srand(static_cast<unsigned>(time(nullptr)));
  392.     short nr = rand() % dostepne_pola;
  393.     // opuszczenie pola
  394.     plansza[przeciwnik.y][przeciwnik.x] = obiekt::pusty;
  395.     // zajęcie nowego pola:
  396.     przeciwnik = dostepne[nr];
  397.     plansza[przeciwnik.y][przeciwnik.x] = obiekt::wrog;
  398. }
  399.  
  400. void ruszaj_wrogami(obiekt plansza[][N])
  401. {
  402.     short ilu_wrogow = wrogowie.size();
  403.     for(short i = 0; i < ilu_wrogow; ++i)
  404.         wykonaj_ruch_wrogiem(wrogowie[i], plansza);
  405. }
  406.  
  407. int main()
  408. {
  409.     cout << "Witaj w grze!\n";
  410.     cout << "Twoim celem jest dotarcie poszukiwaczem (O) do skarbu (X). Mozesz sie poruszac nastepujaco:\n";
  411.     cout << "\tI - gora\n";
  412.     cout << "\tJ - lewo\n";
  413.     cout << "\tK - dol\n";
  414.     cout << "\tL - prawo\n";
  415.     cout << "\tP - pauza\n";
  416.     cout << "Uwazaj na swoich wrogow (@), ktorzy rowniez sie poruszaja. Kontakt z ktoryms z nich oznacza przegrana!\n";
  417.     cout << "Pamietaj, ze poruszajac sie, zostawiasz za soba mur (#), na ktory nikt nie moze wejsc. Powodzenia!\n";
  418.     obiekt plansza[N][N];
  419.     cout << "Wpisz ilu chcesz przeciwnikow na planszy (od 1 do 9): ";
  420.     short ilu_wrogow;
  421.     cin >> ilu_wrogow;
  422.     while(ilu_wrogow < 1 || ilu_wrogow > 9)
  423.     {
  424.         cout << "Wpisz liczbe od 1 do 9: ";
  425.         cin >> ilu_wrogow;
  426.     }
  427.  
  428.     wypelnij_plansze(plansza, ilu_wrogow);
  429.  
  430.     stan = stan_gry::otwarta;
  431.  
  432.     cout << "Wcisnij dowolny przycisk, aby rozpoczac gre...";
  433.     getch();
  434.     system("cls");
  435.  
  436.     while(stan == stan_gry::otwarta)
  437.     {
  438.         rysuj_plansze(plansza);
  439.         wykonaj_ruch(plansza);
  440.         ruszaj_wrogami(plansza);
  441.         system("cls");
  442.     }
  443.     rysuj_plansze(plansza);
  444.     if(stan == stan_gry::porazka)
  445.         cout << "Niestety, przegrales!\n";
  446.     else
  447.         cout << "Brawo! Wygrales!\n";
  448.  
  449.     return 0;
  450. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement