Upload
justin-jenkins
View
67
Download
7
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
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
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.
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
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
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.
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
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
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();
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);
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){
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
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
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).
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