1 / 14

IGRA X-O UZ POMOĆ C++

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.

Download Presentation

IGRA X-O UZ POMOĆ C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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ć

  2. UVOD 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. 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.

  3. UVOD Logika zadatka je bazirana na ponavljanju poteza odnosno polja usled simetričnosti table, tako da se analiziraju samo tri polja: * I * I ---+---+--- I * I ---+---+--- I I 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. 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 .

  4. UVOD Kada proverava da li može da pobedi, on proverava neki od šablona za pobedu. To isto čini i za blokadu. Pogledajte šablone 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.

  5. KONSTRUKCIJA ZADATKA HEADER-i windows.h folder 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 nizovima list.h sastoji se od deklaracija tipova i eksternih funkcija , kao i definicija i makroa. fstream omogućava čitanje i pisanje podataka iz fajlova kao ulazni ili izlazni strim.

  6. KONSTRUKCIJA ZADATKA KLASE: 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 pobedu static char zp1[10]; //staticki su sabloni jer su jedinstveni za static int zp1potez; static char* zp(int i); //niz koji vrti sablone za pobedu static int zppotez(int rot,int sab); //niz koji vrti sablone zapoteze static char zb1[10]; //sabloni za blokiranje igraca int Sablon::zp1potez = 1; //potez koji pobedjuje

  7. KONSTRUKCIJA ZADATKA KLASE: Dabi “naučili” program kako da se ponaša mi mu dajemo slucajeve koji dovodedo pobede: char Sablon::zp1[10]={'R','?','O','O','*','*','*','*','*','*'}; gde je 'R' samopomoć 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 pobedu char* Sablon::zb(int i){ //petlja za prolaz kroz niz sablona za blokadu Pogledajte klasu šabloni

  8. KONSTRUKCIJA ZADATKA KLASE: 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();

  9. KONSTRUKCIJA ZADATKA KLASE: 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 poteza static 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še void odigraj(int pozicija,char znak); Da bi proverili ishod poteza koristimo funkciju: int Pobeda(char c);

  10. KONSTRUKCIJA ZADATKA KLASE: Funkcija koja upisuje potez u tabelu je tipa i takođe sadrži dva parametra: mesto i tip znaka koji treba da upiše void 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){

  11. KONSTRUKCIJA ZADATKA KLASE: 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

  12. 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 sablonima int marker = 1; //pretpostavka da se slazu for(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

  13. 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 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).

  14. KONSTRUKCIJA ZADATKA MAIN 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.ucitajPotaz(); 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

More Related