Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Napisati program koji će, na osnovu odabranih komandi, omogućiti pomijeranje kocke unutar definisanog okvira. Prilikom pravljenja programa voditi računa o sljedećem:
- 1. Program treba izgledati kao na narednoj slici
- 2. Početna veličina matrice je 20 x 20, a početna veličina kocke je 2
- 3. Veličina matrice se povećava sa povećavanjem kocke (komanda P)
- 4. Veličina kocke ne smije biti manja od 1
- 5. Komande za pomijeranje kocke su:
- /Lijevo - L/Desno - R/Gore - U/Dole - D/ Povecaj - P/ Smanji - S/
- 6. Komande mogu biti unesene velikim ili malim slovima
- 7. Kocka ne smije izaći iz definisanog okvira.
- U slučaju da korisnik 3 puta dotakne okvir igra se prekida.
- 8. Voditi računa o pravilnoj alokaciji i dealokaciji memorije
- struct Kocka {
- int lokacijaX;
- int lokacijaY;
- int velicina;
- };
- void main() {
- char ** matrica = nullptr;
- Kocka kocka;
- char komanda;
- do {
- cout << "/Lijevo - L/Desno - R/Gore - U/Dole - D/" << endl;
- cout << "/Povecaj - P/ Smanji - S/" << endl;
- cout << "Komanda -> ";
- cin >> komanda;
- system("cls");
- } while (1);
- }*/
- #include <iostream>
- #include <iomanip>
- #include <conio.h> //za korištenje _getch()
- using namespace std;
- int redovi = 20;
- int kolone = 20;
- struct Kocka {
- int lokacijaX; //predstavlja red, gdje se nalazi u matrici
- int lokacijaY; //predstavlja kolonu, gdje se nalazi u matrici
- int velicina; //koliki je taj objekat, koliko znakova ima po redovima i kolonama
- };
- void ocistiMatricu(char ** matrica)
- {
- for (int i = 0; i < redovi; i++)
- for (int j = 0; j < kolone; j++)
- matrica[i][j] = '.';
- }
- void Dealokacija(char ** &matrica)
- {
- for (int i = 0; i < redovi; i++)
- {
- delete[]matrica[i];
- }
- delete[] matrica;
- matrica = nullptr;
- }
- void Alokacija(char ** &matrica, Kocka kocka) //alociranje prostora za matricu (main mora znati šta se desilo pa ide referenca)
- {
- if (matrica != nullptr)
- Dealokacija(matrica);
- matrica = new char*[redovi + kocka.velicina];
- for (int i = 0; i < redovi + kocka.velicina; i++)
- {
- matrica[i] = new char[kolone + kocka.velicina];
- }
- //ocistiMatricu(matrica);
- }
- void ispis(char ** matrica, Kocka kocka)
- {
- ocistiMatricu(matrica);
- //ispis kocke:
- for (int i = kocka.lokacijaX; i < kocka.lokacijaX + kocka.velicina; i++) //lok x=4 y=4, vel=2
- for (int j = kocka.lokacijaY; j < kocka.lokacijaY + kocka.velicina; j++)
- matrica[i][j] = 'x';
- /* for (int i = 0; i < kolone; i++)
- cout << "--"; //kreira gornji border matrice
- cout << "+" << endl;
- for (int i = 0; i < redovi; i++) //ispisuje svaki pojedini red
- {
- cout << "|";
- for (int j = 0; j < kolone; j++)
- cout << setw(2) << matrica[i][j];
- cout << "|" << endl;
- }
- for (int i = 0; i < kolone; i++)
- cout << "--"; //kreira donji border matrice
- cout << "+" << endl;*/
- for (int i = 0; i < redovi; i++)
- {
- for (int j = 0; j < kolone; j++)
- {
- if (matrica[i][j] != 'x')
- {
- matrica[i][j] = '.';
- }
- cout << setw(2) << matrica[i][j];
- }
- cout << endl;
- }
- //ocistiMatricu(matrica);
- }
- void main() {
- Kocka kocka; //unutar sebe čuvao u kom redu, koloni i veličina objekta
- //ako je kol=8 i red=8 tu taj objekat počinje (oznaka * ili šta želiš)
- //ako je vrijednost=2, objekat treba imati popunjene dvije kućice jedna do druge
- char ** matrica = nullptr;
- int doticanjeZida = 0;
- //centriranje kocke:
- kocka.lokacijaX = (redovi / 2)-1;
- kocka.lokacijaY = (kolone / 2 )- 1;
- kocka.velicina = 2;
- Alokacija(matrica, kocka);
- char komanda;
- do {
- ispis(matrica, kocka);
- cout << "/Lijevo - L/Desno - R/Gore - U/Dole - D/" << endl; //funkcinalnosti, gdje će se pomjerati kockica unutar matrice
- //to je manipulisanje vrijednostima atributa u strukturi kocka
- cout << "/Povecaj - P/ Smanji - S/" << endl;//povećanje i smnanjenje objekta i matrice, znači u dinam. memoriji, a ne na steku
- cout << "Komanda -> ";
- //cin >> komanda;
- //nije efikasan unos, efikasniji unos:
- komanda = _getch(); //reaguje na sami pritisak tipke na tastaturi, (dinamičnije rketanje bez tipke enter)
- komanda = toupper(komanda); //ako je korisnik unio mal slovo bti će pretvoreno u veliko
- if (komanda == 'L') //isti red, mijenja se kolona
- {
- if (kocka.lokacijaY - 1 < 0)
- doticanjeZida++;
- else
- kocka.lokacijaY--;
- }
- else if (komanda == 'R') //isti red, mijenja se kolona za +1
- {
- if (kocka.lokacijaY + 1 > kolone - kocka.velicina)
- doticanjeZida++;
- else
- kocka.lokacijaY++;
- }
- else if (komanda == 'U') //promjena reda, za jedan manji od trenutnog
- {
- if (kocka.lokacijaX - 1 < 0)
- doticanjeZida++;
- else
- kocka.lokacijaX--;
- }
- else if (komanda == 'D')
- {
- if (kocka.lokacijaX + 1 > redovi - kocka.velicina)
- doticanjeZida++;
- else
- kocka.lokacijaX++;
- }
- else if (komanda == 'P')
- {
- //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.
- //sad je red=21, kolona=21
- kocka.velicina++;
- Dealokacija(matrica);
- redovi++;
- kolone++;
- Alokacija(matrica, kocka);
- }
- else if (komanda == 'S' && kocka.velicina - 1 >= 1)
- {
- //treba da se kocka smanji i veličina matrice,
- kocka.velicina--;
- Dealokacija(matrica);
- redovi--;
- kolone--;
- Alokacija(matrica, kocka);
- }
- //mozes probati postaviti i ogranicenja i da korisnika onemogucis da kad korisnik dodje do ivice da izlaz iz kocke dimenzija matrice nije moguc
- system("cls");
- } while (doticanjeZida<3);
- cout << "Igra je zavrsena. Treci put ste udarili u zid." << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement