![]() |
![]() |
|
Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara... |
![]() |
|
Alatke vezane za temu | Vrste prikaza |
![]() |
#201 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Ima li uopšte nekoga da prati ovu temu ili ja to onako čisto bezveze punim sadržajem
![]() |
![]() |
![]() |
![]() |
#202 | |
Deo inventara foruma
Član od: 6.11.2005.
Lokacija: Iznad reke, ispod drveća.
Poruke: 3.218
Zahvalnice: 58
Zahvaljeno 329 puta na 180 poruka
|
![]() Citat:
![]() |
|
![]() |
![]() |
![]() |
#203 |
Ponosni Eipixovac :)
|
![]()
a citam i uzivam
![]() ![]() ![]() |
![]() |
![]() |
![]() |
#204 |
Veteran
|
![]()
Pratimo, pratimo.
![]() Nego, ne znam koliko je pregledno praviti tutorijale preko foruma. Da sam na mestu nekog pocetnika ne znam koliko bi mi ovaj pristup odgovarao ali respect za ono sto radis. ![]() Ja sam davno radio tutorijale (za pascal dok se jos ucio na fakultetu) pa ako ti treba pomoc (ne u smislu da si nesposoban vec za fizikaliju) mozes da me cimnes. |
![]() |
![]() |
![]() |
#205 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Pa meni je u suštini to možda nekih sat vremena za tastaturom a onima koji ovde počinju može da bude par dana manje lupanja glave. Ovo nije ni namenjeno za neko detaljisanje. To ne bi tek moglo da se izvede
![]() Osnovna ideja mi je da svi koji već koriste neku knjigu iz C++-a imaju mesto gde će moći da pogledaju par "insider" trikova koji mogu da im olakšaju učenje. A pošto sam ovde najčešće korišćenu knjigu "Teach yourself C++ in 21 days" (bar sudeći po privatnim porukama koje dobijam) "prežvakao" bar jedno 20 puta, tačno znam na kojim mestima bi bilo dobro pojasniti neke stvari. @Nemesis Što se tiče pomoći imaću te u vidu ako nešto zatreba. Naravno pod uslovom da si sa Pascal-a prešao na C++ ![]() Poslednja ispravka: holodoc (21.8.2006 u 2:33) |
![]() |
![]() |
![]() |
#206 | |
Veteran
|
![]() Citat:
![]() |
|
![]() |
![]() |
![]() |
#207 |
Kekule Mekule
|
![]()
Aaa pratimo mi.Samo ti pisi.
![]() ![]() ![]() |
![]() |
![]() |
![]() |
#208 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Dobro. Ako je tako ovo ima bar i malo smisla. Ako mene ne mrzi da pišem što vas da mrzi da čitate
![]() Pre nego li započnem celu priču naravno ide kod. Kod:
/********************************************* Naziv: Tablica mnozenja File: TablicaMnozenja.cpp Author: holodoc Date: 18.08.2006. Opis: Demonstracija upotrebe ugnjezdenih for-next petlji na primeru ispisa tablice mnozenja. ************************************************/ #include <iostream> // ovo vec i vrapci znaju cemu sluzi using namespace std; // a tek ovo :) int main(){ int broj_redova, broj_kolona, red, kolona; // deklarisanje promenjljivih broj_redova = broj_kolona = 10; // postavljanje pocetnih vrednosti for(red = 1; red < broj_redova; red++){ cout << "------------------------------------------------------------------" << endl; for (kolona = 1; kolona < broj_kolona; kolona++){ cout << kolona * red << "\t"; } cout << "\n"; } fflush(stdin); // ovo smo naucili sta znaci prosli put cout << "ENTER za izlaz iz programa...." << endl; cin.get(); return EXIT_SUCCESS; // vracanje povratne vrednosti o uspesno izvrsenom programu } |
![]() |
![]() |
![]() |
#209 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Sledi priča o nečemu što se stvarno često koristi u programiranju a naziva se “ugnježdavanje” petlji. Znam da zvuči kao neki pojam koji bi možda više odgovarao Frojdu ili nekom iz njegove branše ali nije tako. Ugnježdavanje podrazumeva postavljanje bloka kontrole toka istog tipa jedan u okviru drugog. Znam da ovo zvuči malo konfuzno ali bi objašnjenje otprilike glasilo da ugnježdavanje podrazumeva da recimo neki “for” blok u sebi sadrži “for” blok. Primera radi u C-u i C++-u bi to bio ovakav raspored za recimo par “for” petlji mada se ugnježdavanje često radi i sa “if” i ostalim blokovima za kontrolu toka.
Kod:
for(..;..;..){ for(...;....;...){ ...... } } ![]() ![]() ![]() Da se vratim na ugnježdene petlje. Krenimo redom. Prvih par redova stvarno ne bi trebalo više uopšte da objašnjavam tako da ću ovaj put da ih preskočim. Sledeći kod služi za definisanje par potrebnih promenjljivih. Kod:
int broj_redova, broj_kolona, red, kolona; // deklarisanje promenjljivih broj_redova = broj_kolona = 10; // postavljanje pocetnih vrednosti |
![]() |
![]() |
![]() |
#210 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Naime sigurno vam je zapao za oko sledeći red.
Kod:
broj_redova = broj_kolona = 10; ![]() Zato ja kažem, koristite zagrade uvek jer će vam olakšati život. Sledećih par redova odrađuju lavovski deo posla u ovom primeru. Kod:
for(red = 1; red < broj_redova; red++){ cout << "------------------------------------------------------------------" << endl; for (kolona = 1; kolona < broj_kolona; kolona++){ cout << kolona * red << "\t"; } cout << "\n"; } |
![]() |
![]() |
![]() |
#211 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Kako ovo sve uopšte radi? Prva „for“ petlja se koristi da bi vršila brojanje od 1 sve do trenutka kada promenjljiva „red“ dostigne vrednost „10“. Znači u suštini ovaj deo bi se izvršio tačno 9 puta jer „deseti“ već ne bi ispunjavao uslov „<10“. E sada caka je u tome šta se dešava kada u okviru te prve „for“ petlje program naiđe na još jednu „for“ petlju. U tom slučaju ta druga petlja će se „vrteti“ sve dok ne ispuni svoj uslov odnosno broj kolona ne bude jednak broju „10“. U tom slučaju se druga „for“ petlja završava i kreće odbrojavanje reda prve for petlje i tako u krug sve dok se ne izbroji ukupno „red*kolona“ vrednosti. Znači, sadržaj promenljivih „red“ i „kolona“ u toku izvršavanja je seldeći:
Kod:
1,1 1,2 1,3 ... 1,9 2,1 2,2 ... 2,9 3,1 .... 9,8 9,9. Kod:
cout << kolona * red << "\t"; Sve ostalo u zadatku je samo šminka koja je postavljena na pravo mesto da bi se dočarali neki elementi. Recimo deo koda Kod:
cout << "------------------------------------------------------------------" << endl; Ostatak od ovog ostataka je opisan juče. Konkretno mislim na deo sa „fflush-om“. Nadam se da nisam bio preterano konfuzan u vezi ovih petlji ali treba shvatiti da je ovo jedan veoma važan deo u C++-u. Ako ima pitanja slobodno ih postavite. Toliko za sada. Poz. ![]() |
![]() |
![]() |
![]() |
#212 |
Kekule Mekule
|
![]()
Eh taman ja hteo da blebecem o petljama
![]() 1: while(uslov) { iskazi; } 2: do { iskazi; }while(uslovi); 3: for(broj; inkrement broja; uslov) { iskazi; } Sada prva petlja while radi nesto sve dok je uslov ispunjen.Na primer: Kod:
int i = 0; while(i < 10) { std::cout << "Zdravo!\n"; i++; } ![]() Ajmo sad na drugi tip.do...while je prakticno isto sr***e ko i while samo sto ce se uvek ali uvek jednom izvrsiti.Znaci ako je i 10 a uslov je i < 10 petlja se opet jednom izvrsava. Treci tip je pomenuo holodoc.To je for petlja.Posto je holodoc vec objasnjavao o toj petlji necu da vas smaram sa njom.Samo da pomenem da postoji for(;; ) sto je isto ko i while(true).Vi mozete bilo koji deo petlje for izostaviti(i napisati ; )! Cetvrti i najvise ukleti je goto.O njemu necu da pricam jer je toliko uklet i uopste nije dobar da nije vredan paznje. ![]() /edit od brzine nisam pravilno formulisao deo o do...while ![]() Poslednja ispravka: Andross (19.8.2006 u 0:11) |
![]() |
![]() |
![]() |
#213 | |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.242
Zahvalnice: 2.150
Zahvaljeno 4.982 puta na 2.899 poruka
|
![]() Citat:
Kod:
int i=0; while ((i++) < 10) std::cout << "Zdravo!\n"; ![]() |
|
![]() |
![]() |
![]() |
#214 |
Kekule Mekule
|
![]()
E da da malo pojasnim inkrement.Inkrement uvecava datu varijablu za jedan.Oznaka je varijabla++.Sada imamo da tipa inkrementa.Prefiks-inkrement i postfiks-inkrement.
Prvi je sa prefiksom znaci ++varijabla.Ovo je veoma vazno!Pre inkrement prvo uveca vrednost varijable pa je onda dodeljuje.Primer: Kod:
int var1 = 0; int var2 = 0; var2 = ++var1; Drugi tip je sa postfiksom.Znaci vec pomenuti var1++.Ovo je drugacije od prvog.Postfiks inkrement prvo vraca vrednost varijable pa je onda inkrementira!Sta to znaci.Na primer: Kod:
int var1 = 0; int var2 = 0; var2 = ++var1; var2 = var1++; Pozz. ![]() |
![]() |
![]() |
![]() |
#215 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.242
Zahvalnice: 2.150
Zahvaljeno 4.982 puta na 2.899 poruka
|
![]()
Zapravo, to je ono što se zove "bočni efekat", s tim što se u slučaju A++, prvo iskoristi vrednost promenljive A u izrazu u kome se nalazi pa se tek onda poveća, dok se kod ++A, prvo poveća pa onda iskoristi. Znači u onom gore slučaju, ((i++) < 10) prvo pita da li je trenutna vrednost "i" manja od 10 pa je onda poveća.
|
![]() |
![]() |
![]() |
#216 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Ovoga puta sledi nešto što je malo opipljivije i bliže svetu igara. U pitanju je simulator Loto-a koji vam omogućava da simulirate izvlačenje loto kuglica pri čemu imate kontrolu nad brojem kuglica koje sačinjavaju jednu kombinaciju. Program takođe prikazuje neke od osnovnih koncepata programiranja u okviru Windows okruženja kao što je „Mađarska notacija“. Takođe, demonstriran je na praktičnom primeru jedan od najčešće korišćenih algoritama za sortiranje jednodimenzionih nizova koji se bazira na tzv. „Nassi-Schneidermann” (Nasi-Šnajderman) algoritmu i njihovim dijagramima.
Pošto je kod malo podugačak možete ga skinuti kompletno u obliku .zip arhive koja se nalazi prikačena za ovaj post koja pored glavnom fajla “Loto.cpp” sadrži i DevC++-ov workspace za isti. Pre samog početka jedna mala korisna napomena. Naučite se da koristite pravilne i precizne nazive onoga što koristite. Znači, kako napredujete sa učenjem C++-a pokušajte da se potrudite da ne mešate izraze kao što su „deklaracija“ i „definicija“, „pretprocesorksa direktiva“ i „konstanta“ ili još gore „promenjljiva“ itd. Veoma je bitno da naučite kako se šta zove u bilo kom programskom jeziku a kamoli C++-u koji obiluje terminima. Sada to još uvek ne mora da predstavlja neki preterani problem ali kada u celu priču uđu termini kao što su „klase“, „konstruktori“, „destruktori“ i slični može da dođe do velike zbrke. Takođe ne bi bilo loše ovde pomenuti da će vam ovo bitno pomoći u slučajevima kada budete radili sa ljudima u timu jer u takvom slučaju sigurno neće biti vremena da vam kolege objašnjavaju razliku između „definicije“ i „deklaracije“ ![]() Pa da krenemo. Kod:
#include <iostream> // ovo nam je vec poznato #include <ctime> // ovo zaglavlje treba za postavljanje semena srand funckije #define UKUPNO_BROJEVA 39 // ukupan broj kuglica (brojeva u igri) Pretprocesorska direktiva “#define” definiše “konstantu” “UKUPNO_BROJEVA” koja sadrži ukupan broj kuglica iz kojih se izvlači kombinacija. Pošto mislim da naš “Loto” koristi kombinaciju “7 od 39” ovde je u pitanju taj sistem. Možda grešim jer odavno nisam igrao loto ali u svakom slučaju oba parametra možete menjati u kodu tako da ne bi trebalo da bude problema. |
![]() |
![]() |
![]() |
#217 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Pre nego što pređem na preostali deo koda sledi upoznavanje sa jednim od najvažnijih pravila prilikom programiranja u C++-u u Windows-u. Naime, u jednoj firmi koja zapošljava hiljade radnika, kao što je Microsoft veoma brzo se javio problem objedinjavanja projekata u jednu celinu na kojima radi ogroman broj ljudi. Shvativši da nešto mora da se uradi povodom tog problema čelnici Microsoft-a daju kao zadatak jednom od svojih radnika Charles-u Simonyi-u (Čarls Simonji) da napravi skup pravila i konvencija o obeležavanju svih važnijih delova koda i načinu njihovog pisanja. Pošto je Simonji bio mađar otuda i naziv “mađarska notacija”. Napominjem na ovom mestu da ne treba mešati mađarsku i poljsku notaciju pošto prva predstavlja konvenciju o pisanju koda u Windows-u dok druga služi za predstavljanje matematičkih operacija.
Mađarska notacija inače definiše načine na koje se obeležavaju promenjljive, funkcije, tipovi, konstante, klase i parametri. Neka od najvažnijih pravila je da se tip promenjljive obeležava malim slovom (ili grupom slova) i to recimo za cele brojeve se koristi “n”,”i”, za stringove “s” ili “str”, za bool promenjljive “b” itd. Znači, u sledećem kodu Kod:
int iKombinacija[7]; // niz sa celim brojevima koji ce da sadrzi kombinaciju izvlacenja int iBrojKuglica = 7; // pocetni broj kuglica u igri Kod:
void SortiranjeNiza(); Kod:
void sortiranje_niza(); Poslednja ispravka: holodoc (21.8.2006 u 0:53) |
![]() |
![]() |
![]() |
#218 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Iako je u ovom programu korišćenje globalnih promenjljivih dobro došlo njih ipak treba zaobilaziti kad god je to moguće jer se u većim projektima veoma često može desiti da slučajno dođe do zamene neke promenjljive koja je definisana kao globalna i to čak ako se njena promena vrši u nekoj funkciji u kojoj je deklarisana lokalana promenljiva. Zato je u običnom C-u ponekada malo teže zaobići korišćenje globalnih promenjljivih dok je u C++-u potreba za ovako nečim potpuno eliminisana uvođenjem par klasa. Ali to je već malo naprednija priča.
Sledeći kod definiše tzv. prototipove. Kod:
// deklarianje prototipova funkcija void PromenaNrKuglica(); void Izvlacenje(); void SortiranjeNiza(); void IspisKombinacije(); Kod:
Void PromenaNrKuglica (int, int); Sledi par funkcija koje će kasnije biti pozivane iz “main” funkcije. Naravno i kratak opis svake. Poslednja ispravka: holodoc (21.8.2006 u 0:55) |
![]() |
![]() |
![]() |
#219 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]() Kod:
void PromenaNrKuglica(){ //sipisivanje uvodnog teksta cout << "\nTrenutni broj aktivnih kuglica je " << iBrojKuglica << ".\n"; cout << "Unesite nov broj kuglica pri izvlacenju: "; cin >> iBrojKuglica; //unos novog broja kuglica cout << "Sva sledeca izvlacenja sadrzace " << iBrojKuglica << " kuglica!\n"; cout << "\nENTER za povratak u glavni meni....\n\n"; fflush(stdin); //brisanje buffer-a stdin-a cin.get(); //ajd neka neko cukne nesto na tastaturi } Sledeća funkcija služi za simulaciju "izvlačenja" brojeva. Kod:
void Izvlacenje(){ int iBrojac, iTragac; // deklarisanje promenjljivih za brojanje u for petljama bool bNovBroj; //sluzi za indikaciju da li je izvuceni broj jedinstven u kombinaciji srand((unsigned)time(NULL)); // postavljanje semena generatora slucajnih brojeva for(iBrojac = 0; iBrojac < iBrojKuglica; iBrojac++){ //glavna petlja izvlacenja do{ iKombinacija[iBrojac] = rand() % UKUPNO_BROJEVA + 1; bNovBroj = true; // resetovanje promenjljive unikatnosti :) for (iTragac = 0; iTragac < iBrojac; iTragac++){ // provera da li je izvucen broj vec u kombinaciji if(iKombinacija[iBrojac] == iKombinacija[iTragac]){ bNovBroj = false; //ukoliko je izvuceni broj duplikat bNovBroj obija vrednost false } } } while (!bNovBroj); //petlja se vrti sve dok izvuceni broj nije jedinstven } } Od ostalih stvari veoma je važno zapamtiti deo koda koji je u okviru “for” petlje (zajedno sa njom). Treba upamtiti da je ovo jedan od najpoznatijih algoritama za generisanje brojeva u slučaju da mora biti ispunjen uslov da ne sme da se pojave duplikati u kombinaciji. Treba ga zapamtiti. Čisto onako vežbe radi pokušajte da provalite kako funkcioniše. A da, izrazi tipa “!bNovBroj” su sasvim normalni u C++-u jer svaka vredbost izraza u zagradi kod while-a koja je različita od broja “0” ili ima vrednost “true” automatski se smatra kao ispunjen uslov. Primera radi petlja “while(1){};“ vrtela bi se beskonačno. Poslednja ispravka: holodoc (21.8.2006 u 0:56) |
![]() |
![]() |
![]() |
#220 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Sledeća funkcija služi za sortiranje niza da bi preglednost „ispljunutih“ brojeva bila veća.
Kod:
// Funkcija koja sortira izvucenu kombinaciju void SortiranjeNiza(){ int iNajmanjiIndeks; // pormenjljiva sadr\i vrednost trenutno najmanjeg indeksa for(int i = 0; i < (iBrojKuglica - 1); i++){ //pocetak petlje sortiranja int iNajmanjiIndeks = i; //dodela vrednosti brojacu i kao najmanjem indeksu for(int j = i + 1; j < iBrojKuglica; j++){ //uporedjivanje vrednosti sa njemu desnim if (iKombinacija[j] < iKombinacija[iNajmanjiIndeks]){ iNajmanjiIndeks = j; //definisanje nove najmanje vrednosti ako je broj manji } } if (iNajmanjiIndeks > i) { // zamena mesta u nizu jednostavnim koriscenjem pomocne promenjljive int iTemp; //deklarisanje pomocne promenjljive iTemp = iKombinacija[i]; // [1] -> iTemp iKombinacija[i] = iKombinacija[iNajmanjiIndeks]; //[1] -> [2] iKombinacija[iNajmanjiIndeks] = iTemp; } } } Sledeća funkcija jednostavno ispisuje datu kombinaciju. Kod:
void IspisKombinacije(){ int iBrojac; //jednostavan brojac cout << "\nDobitna kombinacija glasi:\n\n"; for(iBrojac = 0; iBrojac < iBrojKuglica; iBrojac++){ cout << "[" << iKombinacija[iBrojac] << "]"; } cout << "\n\nCestitamo (ne)srecnim dobitnicima :)\n\n"; cout << "ENTER za povratak u glavni meni....\n"; fflush(stdin); cin.get(); } |
![]() |
![]() |
![]() |
Bookmarks sajtovi |
Tagovi |
programiranje, tutoriali |
Alatke vezane za temu | |
Vrste prikaza | |
|
|