Advertisement
limun11

PRII - I parc.

Apr 1st, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.57 KB | None | 0 0
  1. /*Napisati program koji će, na osnovu odabranih komandi, omogućiti pomijeranje kocke unutar definisanog okvira. Prilikom pravljenja programa voditi računa o sljedećem:
  2. 1.  Program treba izgledati kao na narednoj slici
  3. 2.  Početna veličina matrice je 20 x 20, a početna veličina kocke je 2
  4. 3.  Veličina matrice se povećava sa povećavanjem kocke (komanda P)
  5. 4.  Veličina kocke ne smije biti manja od 1
  6. 5.  Komande za pomijeranje kocke su:
  7. /Lijevo - L/Desno - R/Gore - U/Dole - D/ Povecaj - P/ Smanji - S/
  8. 6.  Komande mogu biti unesene velikim ili malim slovima
  9. 7.  Kocka ne smije izaći iz definisanog okvira.
  10. U slučaju da korisnik 3 puta dotakne okvir igra se prekida.
  11. 8.  Voditi računa o pravilnoj alokaciji i dealokaciji memorije
  12.  
  13. struct Kocka {
  14. int lokacijaX;
  15. int lokacijaY;
  16. int velicina;
  17. };
  18.  
  19. void main() {
  20. char ** matrica = nullptr;
  21. Kocka kocka;
  22. char komanda;
  23. do {
  24. cout << "/Lijevo - L/Desno - R/Gore - U/Dole - D/" << endl;
  25. cout << "/Povecaj - P/ Smanji - S/" << endl;
  26. cout << "Komanda -> ";
  27. cin >> komanda;
  28. system("cls");
  29. } while (1);
  30. }*/
  31.  
  32. #include <iostream>
  33. #include <iomanip>
  34. #include <conio.h> //za korištenje _getch()
  35. using namespace std;
  36.  
  37. int redovi = 20;
  38. int kolone = 20;
  39.  
  40. struct Kocka {
  41.     int lokacijaX; //predstavlja red, gdje se nalazi u matrici
  42.     int lokacijaY; //predstavlja kolonu, gdje se nalazi u matrici
  43.     int velicina; //koliki je taj objekat, koliko znakova ima po redovima i kolonama
  44. };
  45.  
  46. void ocistiMatricu(char ** matrica)
  47. {
  48.     for (int i = 0; i < redovi; i++)
  49.         for (int j = 0; j < kolone; j++)
  50.             matrica[i][j] = '.';
  51.  
  52. }
  53. void Dealokacija(char ** &matrica)
  54. {
  55.     for (int i = 0; i < redovi; i++)
  56.     {
  57.         delete[]matrica[i];
  58.        
  59.     }
  60.     delete[] matrica;
  61.     matrica = nullptr;
  62. }
  63. void Alokacija(char ** &matrica, Kocka kocka) //alociranje prostora za matricu (main mora znati šta se desilo pa ide referenca)
  64. {
  65.     if (matrica != nullptr)
  66.         Dealokacija(matrica);
  67.  
  68.     matrica = new char*[redovi + kocka.velicina];
  69.     for (int i = 0; i < redovi + kocka.velicina; i++)
  70.     {
  71.         matrica[i] = new char[kolone + kocka.velicina];
  72.     }
  73.     //ocistiMatricu(matrica);
  74. }
  75.  
  76. void ispis(char ** matrica, Kocka kocka)
  77. {
  78.     ocistiMatricu(matrica);
  79.  
  80.     //ispis kocke:
  81.     for (int i = kocka.lokacijaX; i < kocka.lokacijaX + kocka.velicina; i++) //lok x=4 y=4, vel=2
  82.         for (int j = kocka.lokacijaY; j < kocka.lokacijaY + kocka.velicina; j++)
  83.             matrica[i][j] = 'x';
  84.  
  85.     /*  for (int i = 0; i < kolone; i++)
  86.     cout << "--"; //kreira gornji border matrice
  87.     cout << "+" << endl;
  88.  
  89.     for (int i = 0; i < redovi; i++) //ispisuje svaki pojedini red
  90.     {
  91.     cout << "|";
  92.     for (int j = 0; j < kolone; j++)
  93.     cout << setw(2) << matrica[i][j];
  94.     cout << "|" << endl;
  95.     }
  96.  
  97.     for (int i = 0; i < kolone; i++)
  98.     cout << "--"; //kreira donji border matrice
  99.     cout << "+" << endl;*/
  100.  
  101.     for (int i = 0; i < redovi; i++)
  102.     {
  103.         for (int j = 0; j < kolone; j++)
  104.         {
  105.             if (matrica[i][j] != 'x')
  106.             {
  107.                 matrica[i][j] = '.';
  108.             }
  109.             cout << setw(2) << matrica[i][j];
  110.         }
  111.         cout << endl;
  112.     }
  113.  
  114.     //ocistiMatricu(matrica);
  115. }
  116.  
  117. void main() {
  118.  
  119.     Kocka kocka; //unutar sebe čuvao u kom redu, koloni i veličina objekta
  120.                  //ako je kol=8 i red=8 tu taj objekat počinje (oznaka * ili šta želiš)
  121.                  //ako je vrijednost=2, objekat treba imati popunjene dvije kućice jedna do druge
  122.     char ** matrica = nullptr;
  123.     int doticanjeZida = 0;
  124.  
  125.  
  126.     //centriranje kocke:
  127.     kocka.lokacijaX = (redovi / 2)-1;
  128.     kocka.lokacijaY = (kolone / 2 )- 1;
  129.     kocka.velicina = 2;
  130.     Alokacija(matrica, kocka);
  131.  
  132.  
  133.     char komanda;
  134.     do {
  135.         ispis(matrica, kocka);
  136.         cout << "/Lijevo - L/Desno - R/Gore - U/Dole - D/" << endl; //funkcinalnosti, gdje će se pomjerati kockica unutar matrice
  137.                                                                     //to je manipulisanje vrijednostima atributa u strukturi kocka
  138.  
  139.         cout << "/Povecaj - P/ Smanji - S/" << endl;//povećanje i smnanjenje objekta i matrice, znači u dinam. memoriji, a ne na steku
  140.  
  141.         cout << "Komanda -> ";
  142.         //cin >> komanda;
  143.         //nije efikasan unos, efikasniji unos:
  144.         komanda = _getch(); //reaguje na sami pritisak tipke na tastaturi, (dinamičnije rketanje bez tipke enter)
  145.  
  146.         komanda = toupper(komanda); //ako je korisnik unio mal slovo bti će pretvoreno u veliko
  147.         if (komanda == 'L') //isti red, mijenja se kolona
  148.         {
  149.             if (kocka.lokacijaY - 1 < 0)
  150.                 doticanjeZida++;
  151.             else
  152.                 kocka.lokacijaY--;
  153.  
  154.         }
  155.         else if (komanda == 'R') //isti red, mijenja se kolona za +1
  156.         {
  157.             if (kocka.lokacijaY + 1 > kolone - kocka.velicina)
  158.                 doticanjeZida++;
  159.             else
  160.                 kocka.lokacijaY++;
  161.         }
  162.         else if (komanda == 'U') //promjena reda, za jedan manji od trenutnog
  163.         {
  164.             if (kocka.lokacijaX - 1 < 0)
  165.                 doticanjeZida++;
  166.             else
  167.                 kocka.lokacijaX--;
  168.         }
  169.         else if (komanda == 'D')
  170.         {
  171.             if (kocka.lokacijaX + 1 > redovi - kocka.velicina)
  172.                 doticanjeZida++;
  173.             else
  174.                 kocka.lokacijaX++;
  175.         }
  176.         else if (komanda == 'P')
  177.         {
  178.             //treba da se kocka poveća s 2*2 na 3*3, i velićina matrice, zato smo mat prvo dealocirali pa povećali redove i kolone tj.
  179.             //sad je red=21, kolona=21
  180.             kocka.velicina++;
  181.             Dealokacija(matrica);
  182.             redovi++;
  183.             kolone++;
  184.             Alokacija(matrica, kocka);
  185.         }
  186.         else if (komanda == 'S' && kocka.velicina - 1 >= 1)
  187.         {
  188.             //treba da se kocka smanji i veličina matrice,
  189.  
  190.             kocka.velicina--;
  191.             Dealokacija(matrica);
  192.             redovi--;
  193.             kolone--;
  194.             Alokacija(matrica, kocka);
  195.  
  196.         }
  197.  
  198.         //mozes probati postaviti i ogranicenja i da korisnika onemogucis da kad korisnik dodje do ivice da izlaz iz kocke dimenzija matrice nije moguc
  199.         system("cls");
  200.     } while (doticanjeZida<3);
  201.  
  202.     cout << "Igra je zavrsena. Treci put ste udarili u zid." << endl;
  203.  
  204.     system("pause");
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement