14
IGRA X-O UZ POMOĆ C++ Projekat iz predmeta Uvod u programiranje 2 Profesor : Dr Ranko Popović Studenti : Ušljebrka Jelena II-14- Milentijević Ana 111-0 Simić Stevan 258-0 Petković Goran 145-05

IGRA X-O UZ POMOĆ C++

Embed Size (px)

DESCRIPTION

IGRA X-O UZ POMOĆ C++. Projekat iz predmeta Uvod u programiranje 2. Studenti : Ušljebrka Jelena II-14-06 Milentijević Ana 111-05 Simić Stevan 258-05 Petković Goran 145-05. Profesor : Dr Ranko Popović. UVOD. - PowerPoint PPT Presentation

Citation preview

Page 1: IGRA X-O UZ POMOĆ C++

IGRA X-O UZ POMOĆ C++Projekat iz predmeta Uvod u programiranje 2

Profesor :

Dr Ranko PopovićStudenti :

Ušljebrka Jelena II-14-06Milentijević Ana 111-05Simić Stevan 258-05Petković Goran 145-05

Page 2: IGRA X-O UZ POMOĆ C++

Svima je poznat jednostavan izgled polja za igranje iks-oksa koji ima po dve paralelne linije u horizontal i vertikali, koje se seku i možemo izbrojati 9 polja za upis. To je igra za dva igrača koja se igra na papiru na polju 3x3 kvadrata. Igrači naizmenično postavljaju svoje znakove (jedan koristi ikseve, drugi kružiće) u slobdna polja. Cilj igre je spojiti tri znaka vodoravno, uspravno ili dijagonalno.

UVOD

1 | 2 | 3 | | ---+---+--- ---+---+--- 4 | 5 | 6 | | ---+---+--- ---+---+--- 7 | 8 | 9 | |

Mi smo zadali da prednost, odnosno X uvek bude korisnik, a oks je uvek računar. Potezi koji mogu da se u odigraju su zapravo karakteri iz niza, odnosno pozicije i to od prve do devete. Iks uvek ima pet poteza, a oks četiri. Od poteza se mogu napraviti šabloni. Ako je kompjuter O, onda on uvek pobeđuje ili dolazi do nerešenog rezultata, odnosno popunjavanja polja.

Page 3: IGRA X-O UZ POMOĆ C++

Logika zadatka je bazirana na ponavljanju poteza odnosno polja usled simetričnosti table, tako da se analiziraju samo tri polja:

Ako kompjuter nađe potez u jednom od ova tri polja, onda on upiše potez i čeka protivnika. Potom proverava koja su polja zauzeta, ako ne može da smesti u ta tri, on vrši rotaciju table za 90 stepeni matematički pozitivno i pokušava da upiše u neka od ova tri polja sada rotirane table. Nakon četiri rotacije vraće se na početnu poziciju. Ukoliko tabla nije popunjena, postoji bar jedno slobodno mesto, ono se popunjava.

* I * I---+---+--- I * I---+---+--- I I

Kada se popunjava, prvo se vrši provera da li je moguće dobiti igru stavljenjem"O" u ova tri polja. Potom se proverava da li postoji neka pozicija X koju treba blokirati od pobede tj. spajanja tri polja stavljanjem"O" u treću poziciju. Ukoliko ni to nije moguće, vrši se provera da li može da spreči X od pobede u dva poteza stavljanjem znaka u neki od ovih polja. Ako ništa od toga ne može biti ispunjeno, kompjuter odabira proizvoljnu poziciju za svoj potez .

UVOD

Page 4: IGRA X-O UZ POMOĆ C++

Kada proverava da li može da pobedi, on proverava neki od šablona za pobedu. To isto čini i za blokadu.

Mi smo u zadatku napravili klase Sablon, Tabla, Komp i Covek i preko njihovih funkcija smo izvršili ove provere, dok smo radi lepote igre, u mainu, definisali ime korisnika, a po završetku njegov rezultat zabeležili u listu igrača u txt fajlu.

Pogledajte šablone

UVOD

Page 5: IGRA X-O UZ POMOĆ C++

HEADER-i

KONSTRUKCIJA ZADATKA

windows.hfolder koji sadrži deklaracije svih funkcija u API(application programming interface), sastavni deo opreme za razvoj programa software development kit (SDK).iostream.h biblioteka je objektno orijentisana biblioteka koja omogućava funkcionisanje ulaza i izlaza korišćenjem strimova podataka. cmath.h sadrži set funkcija koje računaju neke opšte matematičke operacije i formule string.h sadrži funkcije koje rade sa c-stringovima i nizovimalist.hsastoji se od deklaracija tipova i eksternih funkcija , kao i definicija i makroa. fstreamomogućava čitanje i pisanje podataka iz fajlova kao ulazni ili izlazni strim.

Page 6: IGRA X-O UZ POMOĆ C++

KLASE:KLASE:

KONSTRUKCIJA ZADATKA

Klasa Šabloni

Sadrži šablone za poteze, za pobedu, kao i za blokiranje protivnika. Oni su jedinstveni za ceo program, postoje samo na jednom mestu, te im se daje vrednost static, znači važe unutar celog programa i nepromenljivi su.

static char* zp(int i); //niz koji vrti sablone za pobedustatic char zp1[10]; //staticki su sabloni jer su jedinstveni zastatic int zp1potez; static char* zp(int i); //niz koji vrti sablone za pobedustatic int zppotez(int rot,int sab); //niz koji vrti sablone zapotezestatic char zb1[10]; //sabloni za blokiranje igracaint Sablon::zp1potez = 1; //potez koji pobedjuje

Page 7: IGRA X-O UZ POMOĆ C++

KLASE:KLASE:

KONSTRUKCIJA ZADATKA

Da bi “naučili” program kako da se ponaša mi mu dajemo slucajeve koji dovode do pobede:char Sablon::zp1[10]={'R','?','O','O','*','*','*','*','*','*'};gde je 'R' samo pomoć da bi lakše posmatrali polja u tabli, a '?' je mesto sledećeg poteza.

Tako se isto radi i za blokiranje suparnika, takođe se pravi raspored mogućih poteza za igru i načina kako se oni blokiraju:int Sablon::zb1potez = 1;char Sablon::zb1[10]={'R','?','X','X','*','*','*','*','*','*'};

U oba slučaja postoji po pet kobinacija pozicija odnosno pet varijanti poteza.char* Sablon::zp(int i){ //petlja za prolaz kroz niz sablona za pobeduchar* Sablon::zb(int i){ //petlja za prolaz kroz niz sablona za blokadu

Pogledajte klasu šabloni

Page 8: IGRA X-O UZ POMOĆ C++

KLASE:KLASE:

KONSTRUKCIJA ZADATKA

Klasa Tabla

Klasa Tabla iscrtava tablu na monitoru i proverava pozicije polja, odnosno poteze koji su uneti, poredi sa postojećim šablonima, vrši rotaciju polja i potom njihovo vraćanje na početnu poziciju. Ovo je potrebno da bi mogli svi potezi da budu pravilno uneseni.Čišćenje table, odnosno početnu praznu poziciju pokazujemo inicijalizacijom niza 3x3 polja:

for(int i=1; i<=9; tabla[i++]=' ');

a funkcija koja iscrtava tipa je void jer ne vraća vrednost : void iscrtaj(); Pošto postoji samo jedna tabla, koristimo pokazivače prilikom rotacije i unosa.

Za 0, odnosno 360 stepeni rotacije tabla je ista.char* rotiraj0();

Page 9: IGRA X-O UZ POMOĆ C++

KLASE:KLASE:

KONSTRUKCIJA ZADATKA

Kako se tabla rotira mi imamo novi niz, odnosno novu poziciju table:char* rotiraj90(); char* rotiraj180();char* rotiraj270();char* rotiraj(int i);

Funkcija koja vraća tablu unazad ima dva parametra: broj rotacija i poziciju potezastatic int rotirajNazad(int rot,int i);static int rotiraj90nazad(int i);Funkcija koja upisuje potez u tabelu je tipa i takođe sadrži dva parametra: mesto i tip znaka koji treba da upiševoid odigraj(int pozicija,char znak);

Da bi proverili ishod poteza koristimo funkciju:int Pobeda(char c);

Page 10: IGRA X-O UZ POMOĆ C++

KLASEKLASE::

KONSTRUKCIJA ZADATKA

Funkcija koja upisuje potez u tabelu je tipa i takođe sadrži dva parametra: mesto i tip znaka koji treba da upiševoid odigraj(int pozicija,char znak);Da bi proverili ishod poteza koristimo funkciju:int Pobeda(char c); Primenjujemo potrebne funkcije za proveru pozicija odigranog poteza, mogućih poteza, potencijalnog dobitka ili sprečavanja poteza, na primer : void odigraj(int pozicija,char znak);i:int Tabla::Pobeda(char c){if ((tabla[1] == c) && (tabla[2] == c) && (tabla[3] == c)) return 1;

Da bismo upisali potez na pravom mestu, treba da se tabla rotira unazad za pobedu/blokadu int Sablon::zppotez(int rot,int sab){ switch (sab){ odnosno:int Sablon::zbpotez(int rot,int sab){ switch (sab){

Page 11: IGRA X-O UZ POMOĆ C++

KLASEKLASE::

KONSTRUKCIJA ZADATKA

Da bi vratili tablu na početnu poziciju proveravamo broj rotacija:

int Tabla::rotirajNazad(int rot,int i){ switch (rot){

Odnosno rotacija unapred da bi mogli da uporedimo sa šablonima:

char* Tabla::rotiraj(int i){ switch (i){case 0: return Tabla::rotiraj0(); break;

Da bi u toku rada mogli da pristupimo tabeli, mi u dinamičkoj memoriji pravimo privremenu tabelu:

char* Tabla::rotiraj0(){char* tabla1 = new char[10]; tabla1[1]=tabla[1];i tako za svaku od rotacija.

Pogledajte kod Klase Tabla i njene funkcije

Page 12: IGRA X-O UZ POMOĆ C++

KONSTRUKCIJA ZADATKA

Klasa Komp

Klasa Komp ima u sebi definisan unapred znak „O“ i tablu na kojoj se ispisuje. Unutar klase se izvršava provera poteza odnosno poređenje sa šablonima u cilju pobede:int Komp::poredi(char* original,char* sablon){int Komp::Blokada(){int Komp::randomKorak(){U svrhu poređenja koristimo marker, koji poredi originalnu tablu sa postojećim šablonima:int Komp::poredi(char* original,char* sablon){ //poredjenje sa sablonimaint marker = 1; //pretpostavka da se slazufor(int i=1;i<=9;i++){if(sablon[i] == '*') continue;if(sablon[i] == '?' && original[i] == ' ') continue;if(sablon[i] == 'X' && original[i] == 'X') continue ;

Pogledajte kod klase Komp i njene funkcije

Page 13: IGRA X-O UZ POMOĆ C++

KONSTRUKCIJA ZADATKA

Klasa Covek

Klasa Covek sadrži ime igrača, njegov znak, u ovom slučaju 'X', kao i potez koji je odigrao.

Pogledajte kod klase Covek

MAIN FunkcijaMAIN Funkcija

U telu programa korisnik, igrač, bira od ponuđena tri izbora:

-Igra-top lista -izlaz.

Ulaskom u igru pozivaju se klase i formiraju se objekti: covek,tabla i potez i pozivaju se funkcije koje se odnose na igru: odigraj (potez,c), iscrtaj(), ucitajPotaz(),Pobeda(c).

Page 14: IGRA X-O UZ POMOĆ C++

KONSTRUKCIJA ZADATKA

MAIN FunkcijaMAIN Funkcija

Pomoću do while petlje se odvija igra do događaja pobede ili nerešenog do{ potez = k.sledpotez(); t.odigraj(potez,'O'); t.iscrtaj(); if(t.Pobeda('O')) { out_file <<gubitnik<< endl; break;} potez = covek.ucitaj Potaz();

t.odigraj(potez,'X');t.iscrtaj();

}while( !t.Pobeda('O') && !t.Pobeda('X') );

Za upis u top listu koriste se standardne operacije sa fajlovima: upis, nastavak i zatvaranje. Pogledajte kod Main funkcije

Pogledajte kod celog projekta