Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using std::cin;
  6. using std::cout;
  7. using std::endl;
  8.  
  9. typedef std::vector<std::vector<char>> Matrica;
  10. typedef std::vector<std::vector<std::vector<char>>> Tridi;
  11.  
  12. // Tri De Matrica
  13. std::vector<std::vector<std::vector<char>>> KreirajMatrice(int m, int n) {
  14.  
  15.     if (m <= 0 || n <= 0) throw std::domain_error("Dimenzije matrice moraju biti pozitivne");
  16.     else if (m >= 100 || n >= 100) throw std::domain_error("Prevelike dimenzije");
  17.     else if (m != n) {
  18.         throw std::domain_error("Matrice moraju biti kvadratne");
  19.     }
  20.  
  21.     Matrica N(m, std::vector<char>(n));
  22.     Matrica A(m, std::vector<char>(n));
  23.  
  24.     for (int i = 0; i < m; i++) {
  25.         for (int j = 0; j < n; j++) {
  26.             N.at(i).at(j) = '-';
  27.             A.at(i).at(j) = '-';
  28.         }
  29.     }
  30.  
  31.     std::vector<std::vector<std::vector<char>>> matrica;
  32.     matrica.push_back(N);
  33.     matrica.push_back(A);
  34.  
  35.     return matrica;
  36. }
  37.  
  38. void Nacrtaj(const std::vector<std::vector<std::vector<char>>>& mat, int n) {
  39.  
  40.     if(n!=0 && n!=1) throw std::domain_error("Pogresno pozvana funkcija 'Nacrtaj'");
  41.     //prvi
  42.     if (n == 0) {
  43.         for (int i = 0; i < mat.at(0).size(); i++) {
  44.             for (int j = 0; j < mat.at(0).size(); j++) {
  45.                 cout<< mat.at(0).at(i).at(j)<<" ";
  46.             }
  47.             cout << endl;
  48.         }
  49.     }
  50.     //drugi
  51.     else if (n == 1) {
  52.         for (int i = 0; i < mat.at(1).size(); i++) {
  53.             for (int j = 0; j < mat.at(1).size(); j++) {
  54.                 cout<< mat.at(1).at(i).at(j)<<" ";
  55.             }
  56.             cout << endl;
  57.         }
  58.     }
  59. }
  60.  
  61.  
  62. bool PogadjanjeRobota(const std::vector<std::vector<std::vector<char>>>& mat, int p) {
  63.  
  64.     char znak = 'A';
  65.     char pogodak = 'X';
  66.     char promasaj = 'O';
  67.     int kill1 = 0;
  68.     int faul1 = 0;
  69.  
  70.     int kill2 = 0;
  71.     int faul2 = 0;
  72.  
  73.     bool prekid = false;
  74.  
  75.     bool kraj_igre1 = false;
  76.     bool kraj_igre2 = false;
  77.  
  78.     Tridi matrica = std::move(mat);
  79.  
  80.     //brisati matrice prva i druga!
  81.     Matrica prva(mat.at(0).size(), std::vector<char>(mat.at(0).size()));
  82.     Matrica druga(mat.at(1).size(), std::vector<char>(mat.at(1).size()));
  83.  
  84.     for (int i = 0; i < mat.at(0).size(); i++) {
  85.         for (int j = 0; j < mat.at(0).size(); j++) {
  86.             prva.at(i).at(j) = mat.at(0).at(i).at(j);
  87.             druga.at(i).at(j) = mat.at(1).at(i).at(j);
  88.         }
  89.     }
  90.     int broj_gadjanja = prva.size() * prva.at(0).size() * 2;
  91.  
  92.     for (int k = 0; k < broj_gadjanja; k++) {
  93.         //PRVI
  94.         if (k % 2 == 0) { //gadja prvi
  95.             cout << "Prvi gadja (unesi koordinate): ";
  96.             int x1, y1;
  97.             cin >> x1 >> y1;
  98.  
  99.             if (x1 == -2 && y1 == -2) {
  100.                 //pozivanje funkcije Nacrtaj
  101.                 Nacrtaj(matrica, 0);
  102.                 //treba se nastaviti sa unosom!!
  103.  
  104.             }
  105.             else if (x1 == -1 && y1 == -1) {
  106.                 prekid = true;
  107.                 break;
  108.             }
  109.  
  110.             if (prva.at(x1).at(y1) == znak) {
  111.                 prva.at(x1).at(y1) = pogodak;
  112.                 matrica.at(0).at(x1).at(y1) = pogodak;
  113.                 cout << "Pogodak"<<endl;
  114.                 kill1++;
  115.             }
  116.             else if (prva.at(x1).at(y1) != znak) {
  117.                 prva.at(x1).at(y1) = promasaj;
  118.                 matrica.at(0).at(x1).at(y1) = promasaj;
  119.                 cout << "Promasaj"<<endl;
  120.                 faul1++;
  121.             }
  122.             bool gotova = false;
  123.             int brejk = 0;
  124.             for (int i = 0; i < prva.size(); i++) {
  125.                 for (int j = 0; j < prva.size(); j++) {
  126.                     if (prva.at(i).at(j) == znak) {
  127.                         brejk = 1;
  128.                         break;
  129.                     }
  130.                     else gotova = true;
  131.                 }
  132.                 if (brejk == 1) {
  133.                     gotova = false;
  134.                     break;
  135.                 }
  136.             }
  137.  
  138.             if (gotova == true) {
  139.                 kraj_igre1 = true;
  140.                 break;
  141.             }
  142.         }
  143.         //DRUGI
  144.         else if (k % 2 != 0) { //gadja drugi
  145.             cout << "Drugi gadja (unesi koordinate): ";
  146.             int x2, y2;
  147.             cin >> x2 >> y2;
  148.             if (x2 == -2 && y2 == -2) {
  149.                 //pozivanje funkcije Nacrtaj
  150.                 Nacrtaj(matrica, 1);
  151.             }
  152.             else if (x2 == -1 && y2 == -1) {
  153.                 prekid = true;
  154.                 break;
  155.             }
  156.             if (druga.at(x2).at(y2) == znak) {
  157.                 druga.at(x2).at(y2) = pogodak;
  158.                 matrica.at(01).at(x2).at(y2) = pogodak;
  159.                 cout << "Pogodak"<<endl;
  160.                 kill2++;
  161.             }
  162.             else if (druga.at(x2).at(y2) != znak) {
  163.                 druga.at(x2).at(y2) = promasaj;
  164.                 matrica.at(1).at(x2).at(y2) = promasaj;
  165.                 cout << "Promasaj"<<endl;
  166.                 faul2++;
  167.             }
  168.  
  169.             bool gotova2 = false;
  170.             int brejk = 0;
  171.             for (int i = 0; i < druga.size(); i++) {
  172.                 for (int j = 0; j < druga.size(); j++) {
  173.                     if (druga.at(i).at(j) == znak) {
  174.                         brejk = 1;
  175.                         break;
  176.                     }
  177.                     else gotova2 = true;
  178.                 }
  179.                 if (brejk == 1) {
  180.                     gotova2 = false;
  181.                     break;
  182.                 }
  183.             }
  184.  
  185.             if (gotova2 == true) {
  186.                 //ispise sve ko sta kako i break
  187.                 kraj_igre2 = true;
  188.                 break;
  189.             }
  190.         }
  191.     }
  192.     if (prekid == true) {
  193.         cout << "Igra je prekinuta!";
  194.         return true;
  195.     }
  196.  
  197.     else if (kraj_igre1 == true) {
  198.         cout << "Pobjednik je igrac broj 1. Cestitke!" << endl;
  199.         cout << "Broj pogodjenih: " << kill1 << endl;
  200.         cout << "Broj promasenih: " << faul1 << endl;
  201.         return true;
  202.     }
  203.     else if (kraj_igre2 == true) { //pobijedio drugi
  204.         cout << "Pobjednik je igrac broj 2. Cestitke!" << endl;
  205.         cout << "Broj pogodjenih: " << kill2 << endl;
  206.         cout << "Broj promasenih: " << faul2 << endl;
  207.         return true;
  208.     }
  209.  
  210.     return false;
  211. }
  212.  
  213.  
  214. //modifikacija
  215. bool Grbava(Matrica m) {
  216.     for (int i = 0; i < m.size(); i++)
  217.         if (m.at(0).size() != m.at(i).size()) return true;
  218.     return false;
  219. }
  220.  
  221. bool Kvadratna(Matrica m) {
  222.     if (m.size() != m.at(0).size()) return false;
  223.     return true;
  224. }
  225.  
  226.  
  227. void Unos(std::vector<std::vector<std::vector<char>>>& matrice, int p) {
  228.  
  229.  
  230.     //ERRORs
  231.     if (matrice.at(0).size() == 0 && matrice.at(1).size() == 0) throw std::domain_error("Matrica ne postoji!");
  232.     else if (matrice.size() != 2) throw std::range_error("3D matrica ima pogrešne dimenzije");
  233.     else if (matrice.at(0).size() == 0 || matrice.at(1).size() == 0) throw std::domain_error("Neka od dvije matrice je prazna");
  234.     else if (Grbava(matrice.at(0)) || Grbava(matrice.at(1))) throw std::domain_error("Neka matrica je grbava");
  235.     else if (p > 15) throw std::range_error("Zelite igrati sa previse robota");
  236.     else if (p > matrice.at(0).size() || p > matrice.at(1).size()) throw std::overflow_error("Zelite igrati sa previse robota");
  237.     else if (!Kvadratna(matrice.at(0)) || !Kvadratna(matrice.at(1))) throw std::domain_error("Neka od matrica nije kvadratna");
  238.     else if (matrice.at(0).size() != matrice.at(1).size()) throw std::domain_error("Matrice nemaju iste dimenzije");
  239.  
  240.    
  241.     static int igrac = 0;
  242.     //Matrica jedan(size, std::vector<char>(size, '-'));
  243.     //pazi na broj ponavljanja ove petljee
  244.  
  245.     for (int k = 1; k <= p; k++) {
  246.  
  247.  
  248.         // unos koordinata
  249.         int x1, y1;
  250.         cout << "Unesite pocetne koordinate " << k << ". robota (x1 i y1): ";
  251.         cin >> x1 >> y1;
  252.         int x2, y2;
  253.         cout << "Unesite krajnje koordinate " << k << ". robota (x2 i y2): ";
  254.         cin >> x2 >> y2;
  255.  
  256.         if (x1 != x2 && y1 != y2) throw ("Moraju biti horizontalno ili vertikalno postavljeni roboti!");
  257.         if (k == 1) {
  258.             if (x1 != x2 || y1 != y2) throw std::domain_error("Pogresna velicina robota");
  259.             else {
  260.                 matrice.at(igrac).at(x1).at(y1)= 'A'; //direktno upisivanje u matricu
  261.             }
  262.         }
  263.         if (k >= 2) {
  264.             if (x1 == x2) {
  265.                 int i = x1;
  266.                 int zbir = abs(y1 - y2) + 1;
  267.                 if (k != zbir) throw std::domain_error("Pogresna velicina robota");
  268.  
  269.                 if (y1 < y2) {
  270.                     for (int j = y1; j <= y2; j++) {
  271.                         matrice.at(igrac).at(i).at(j) = 'A';
  272.                     }
  273.                 }
  274.                 else if (y1 > y2) {
  275.                     for (int j = y2; j < y1; j++) {
  276.                         matrice.at(igrac).at(i).at(j) = 'A';
  277.                     }
  278.                 }
  279.                 else throw std::domain_error("Pogresna velicina robota");
  280.             }
  281.  
  282.             else if (y1 == y2) {
  283.                 int i = y1;
  284.                 int zbir2 = abs(x1 - x2) + 1;
  285.                 if (k != zbir2) throw std::domain_error("Pogresna velicina robota");
  286.                 if (x1 < x2) {
  287.                     for (int j = x1; j <= x2; j++) {
  288.                         matrice.at(igrac).at(i).at(j) = 'A';
  289.                     }
  290.                 }
  291.                 else if (x1 > x2) {
  292.                     for (int j = x2; j <= x1; j++) {
  293.                         matrice.at(igrac).at(i).at(j) = 'A';
  294.                     }
  295.                 }
  296.                 else throw std::domain_error("Pogresna velicina robota");
  297.             }
  298.             else throw ("Moraju biti horizontalno ili vertikalno postavljeni roboti!");
  299.         }
  300.     }
  301.     igrac++;
  302. }
  303.  
  304.  
  305. int main() {
  306.    
  307.     cout << "Unesite dimenzije matrica (m i n): ";
  308.     int m, n;
  309.     cin >> m >> n;
  310.  
  311.     //kreiranje matrice
  312.     Tridi matrica = KreirajMatrice(m, n);
  313.  
  314.     cout << "Unesite broj robota: ";
  315.     int p;
  316.     cin >> p;
  317.  
  318.     cout << "PRVI IGRAC" << endl;
  319.     Unos(matrica, p);
  320.     //uhvatiti overflow error za ponavljanje unosa p
  321.     cout << "DRUGI IGRAC" << endl;
  322.     Unos(matrica, p);
  323.  
  324.     cout << "Uspjesno ste unijeli pozicije robota. Sada moze poceti pogadjanje." << endl;
  325.  
  326.     PogadjanjeRobota(matrica, p);
  327.    
  328.     return 0;
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement