Kako programirati igre u C. Tutorial One

01

od 05

Uvod u Vodič za programiranje igara

Ovo je prvi od nekoliko igara za programiranje igara na C-u za kompletne početnike. Umjesto da se koncentrirate na podučavanje C-a, tada prikazujete primjere programa koji podučavaju C pružajući vam kompletne programe (tj. Igre) na C-u

Jednostavnost

Prva igra u nizu je konzola (tj. Igra na temelju teksta koja se zove Star Empires). Star Empires je jednostavna igra u kojoj morate zarobiti svih 10 sustava u Galaksiji dok zaustavljate svog AI protivnika da radi isto.

Započinjete posjedovanje sustava 0, dok vaš neprijatelj vlastiti sustav 9. Preostalih osam sustava (1-8) započinje neutralno. Svi sustavi počinju unutar kvadrata od 5 parsec x 5 parsec, tako da nijedan sustav nije više od 6 parsesova. Udaljene dvije točke su (0,0) i (4,4). Po Pitagorinom teoremu, najudaljenija udaljenost od bilo koja dva sustava je kvadratni korijen ((4)2 + (4)2) koji je kvadratni korijen 32. što je oko 5.657.

Imajte na umu da ovo nije konačna verzija pa će biti dopunjeni. Zadnja promjena: 21. kolovoza 2011.

instagram viewer

Uključeno i u stvarnom vremenu

Igra se temelji na potezima i sa svakim zaokretom dajete naredbe za premještanje bilo kojeg broja flote iz bilo kojeg sustava koji posjedujete u bilo koji drugi sustav. Ako posjedujete više od jednog sustava, možete naručiti flote za prelazak iz svih svojih sustava na ciljni sustav. To se provodi proporcionalno zaokružujući, tako da ako posjedujete tri sustava (1,2,3) sa 20, 10 i 5 flota i naredite 10 flota za prijelaz na sustav 4, tada 6 ide iz sustava 1, 3 iz sustava 2 i 1 iz sustava 3. Svaka flota kreće 1 parsec po okretaju.

Svako okretanje traje 5 sekundi, ali možete mijenjati brzinu da biste ga ubrzali ili usporili mijenjanjem 5 u ovom retku koda u 3 ili 7 ili sve što odaberete. Potražite ovaj kôd:

onesec = sat () + (5 * CLOCKS_PER_SEC);

Vodič za programiranje C

Ova igra je programirana i pretpostavlja da ne znate nijedan C program. Uvest ću značajke programiranja za C u ove i sljedeće dvije ili tri udžbenike kako napreduju. Prvo vam je potreban prevodilac za Windows. Evo dva besplatna:

  • Probati CC386
  • Ili Visual C ++ 2010 Express

Članak CC386 vodi vas kroz stvaranje projekta. Ako instalirate taj prevodilac, tada morate samo učitati Hello Hello program, kako je opisano, kopirati i zalijepiti izvorni kod preko primjera, spremiti ga, a zatim pritisnite F7 da biste ga kompilirali i pokrenuli. Isto tako članak Visual C ++ 2010 stvara hello svjetski program. Prepišite je i pritisnite F7 da biste izgradili Star Empires., F5 da biste je pokrenuli.

Na sljedećoj stranici - Neka zvijezda carstva djeluju

02

od 05

Natjecanje zvijezdanih carstava u djelo

Natjecanje zvijezdanih carstava u djelo

U igri moramo spremiti podatke o flotama i sustavima. Flota je jedan ili više brodova s ​​zapovijedom da pređu iz jednog sustava u drugi. Zvjezdani sustav je mnoštvo planeta, ali više je apstraktni entitet u ovoj igri. Za flotu moramo zadržati sljedeće podatke.

  • Sustav podrijetla (1-10).
  • Odredišni sustav (1-10)
  • Koliko brodova (1-mnogo)
  • Okrene se dolasku
  • Čija je flota? 0 = igrač, 9 = neprijatelj

Upotrijebit ćemo strukturu u C da to zadržimo:

structure flota {
int iz sustava;
int tosystem;
int okreće;
int floetsize;
int vlasnik;
};

Struktura je skup podataka, u ovom slučaju 5 brojeva kojima manipuliramo kao jedan. Svaki broj ima naziv, npr. Iz sustava, to sustava. Ta su imena promjenjiva imena u C i mogu imati podvlake poput_to, ali ne i razmake. U C su brojevi ili cijeli brojevi; cijeli brojevi poput 2 ili 7 nazivaju se int ili brojevi s decimalnim dijelovima poput 2.5 ili 7.3333 i nazivaju se floats. U cijelim Star Empiresima plovke koristimo samo jednom. U komadu koda koji izračunava udaljenost između dva mjesta. Svaki drugi broj je int.

Dakle, flota je naziv za strukturu podataka koja sadrži pet int varijabli. To je za jednu flotu. Ne znamo koliko ćemo flota morati držati, tako da ćemo dodijeliti velikodušnu sobu za 100 koristeći niz. Mislite na strukturu poput stola za večeru sa sobom za pet osoba (inta). Niz je poput dugog niza stolova za večeru. 100 stolova znači da može smjestiti 100 x 5 osoba.

Da smo zapravo posluživali tih 100 stolova za večeru, morali bismo znati koji je to stol i činiti to numeriranjem. U C uvijek numeriramo elemente nizova počevši od 0. Prvi stol za večeru (flota) je broj 0, sljedeći je 1, a posljednji je 99. Uvijek ga se sjećam koliko je to stola od večere od ovog stola? Prva je na početku, pa je i 0.

Ovako proglašavamo flotu (tj. Naše stolove za večeru).

flote strukturne flote [100];

Pročitajte ovo s lijeva na desno. Flota Struktura odnosi se na našu strukturu koja drži jednu flotu. Naziv flote ime je koje dajemo svim flotama i [100] nam govori da u varijabli flote postoji flota od 100 x struktura. Svaki int zauzima 4 lokacije u memoriji (zvane bajti), tako da jedna flota zauzima 20 bajta, a 100 flota 2000 bajtova. Uvijek je dobra ideja koliko memorije treba našem programu da pohrani svoje podatke.

U floti strukture svaki od inta ima cijeli broj. Ovaj je broj pohranjen u 4 bajta, a raspon je od -2,147,483,647 do 2,147,483,648. Većinu vremena koristit ćemo manje vrijednosti. Postoji deset sustava tako da će i iz sustava i iz sustava biti u vrijednosti 0 do 9.

Na sljedećoj stranici: Sustavi i nasumični brojevi

03

od 05

O sustavima i slučajnim brojevima

Svaki od neutralnih sustava (1-8) započinje s 15 brodova (koje sam odabrao iz zraka!), A druga dva (vaš: sustav 0 i vaš računalni protivnik u sustavu 9) imaju po 50 brodova. Svakim zaokretom broj brodova u sustavu povećava se za 10% zaokruženim prema dolje. Ako nakon jednog zaokreta, ako ih ne pomaknete, vaš 50 će postati 55, a svaki od neutralnih sustava imat će 16 (15 + 1,5 zaobljeni prema dolje). Imajte na umu da se flote koje se kreću u drugi sustav ne povećavaju.

Ovakav način povećanja broja brodova može se činiti pomalo čudnim, ali učinio sam to kako bi igra nastavila dalje. Umjesto da pretrpam ovaj udžbenik s previše o dizajnerskim odlukama, napisao sam zaseban članak o dizajnerskim odlukama Star Empiresa.

Provedbeni sustavi

Na početku trebamo generirati sve sustave i staviti ih na kartu s maksimalno jednim sustavom u svaka lokacija, Budući da je 25 mreža na našoj mreži 5 x 5, imat ćemo deset sustava i 15 praznih lokacija. Generiramo ih pomoću funkcije GenMapSystems () koju ćemo pogledati na sljedećoj stranici.

Sustav je pohranjen u strukturi, sa slijedeća 4 polja koja su sva int.

struct system {
int x, y;
int numfleet;
int vlasnik;
};

Galaksija (svih 10 sustava) pohranjuje se u drugom nizu baš kao i s flotama, osim što imamo 10 sustava.

galaksija sustava sustava [10];

Nasumični brojevi

Sve igre trebaju nasumične brojeve. C ima ugrađeni funkcijski rand () koji vraća slučajni int. To možemo nametnuti u raspon prenošenjem maksimalnog broja u i korištenjem operatora%. (Modul). To je poput aritmetike sata, osim što umjesto 12 ili 24 prelazimo u int broj zvan max.

/ * vraća broj između 1 i max * /
int Random (int max) {
povrat (rand ()% max) +1;
}

Ovo je primjer funkcije koja je komad koda zamotan u spremnik. Prvi redak koji započinje / * i završava * / je komentar. Kaže što kôd radi, ali ga zanemaruje pregovarač koji čita upute C i pretvara ih u upute koje računalo razumije i može vrlo brzo izvršiti.

  • Pitate se što je prevoditelj? Čitati Što je prevoditelj? (Članak)

Funkcija je poput matematičke funkcije kao što je Sin (x). Postoje tri dijela u ovoj funkciji:

int slučajno (int max)

Int kaže kakvu vrstu broja vraća (obično int ili float). Random je ime funkcije i (int max) kaže da prenosimo int broj. Mogli bismo ga koristiti na ovaj način:

int kockice;
kockice = Slučajno (6); / * vraća slučajni broj između 1 i 6 * /

Crta:

povrat (rand ()% max) +1;

Na sljedećoj stranici: Stvaranje slučajne početne mape

04

od 05

Stvaranje slučajne početne mape

Mapa Star Empires

Ovaj kôd u nastavku generira početnu kartu. To je prikazano gore.

void GenMapSystems () {
int i, x, y;
for (x = 0; x for (y = 0; y izgled [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Pronađite prazan prostor za preostalih 8 sustava * /
za (i = 1; ja {
x = Slučajno (5) -1;
y = Slučajno (5) -1;
}
while (izgled [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}

Generiranje sustava stvar je dodavanja sustava igrača i protivnika (na 0,0) i (4,4), a zatim nasumičnim dodavanjem 8 sustava na preostala 23 prazna mjesta.

Kod koristi tri int varijable definirane linijom

int i, x, y;

Varijabla je mjesto u memoriji koje sadrži int vrijednost. Promjenjive x i y drže koordinate sustava i držat će vrijednost u rasponu 0-4. Varijabla i koristi se za brojanje u petlji.

Da bi 8 slučajnih sustava smjestili u mrežu 5x5, moramo znati ima li lokacija već sustav i spriječiti postavljanje drugog na isto mjesto. Za to koristimo jednostavan dvodimenzionalni niz znakova. Tip char je druga vrsta varijable u C i sadrži jedan znak poput "B" ili "x".

Primer na Datatypes in C

Temeljne vrste varijabli u C su int (cijeli brojevi kao 46), char (jedan znak poput "A") i plutajući (za držanje brojeva s pomičnom točkom poput 3.567). Nizovi [] su za držanje popisa istog elementa. Dakle, char [5] [5] definira popis popisa; dvodimenzionalni niz znakova. Zamislite to kao 25 ​​komada za sređivanje raspoređenih u rešetki 5 x 5.

Sad smo petlja!

Svaki je znak početno postavljen na prostor u dvostrukoj petlji koristeći dva za izjave. A za izjavu ima tri dijela. Inicijalizacija, usporedni dio i dio promjene.

for (x = 0; x for (y = 0; y izgled [x] [y] = '';
}

  • x = 0; Ovo je dio za inicijalizaciju.
  • x
  • x ++. Ovo je dio promjene. To dodaje 1 na x.

Dakle (za (x = 0; x

Unutar for (petlja x je for y y petlja koja radi isto za y. Ova petlja y se događa za svaku vrijednost X. Kad je X 0, Y će se petljati od 0 do 4, kada je X 1, Y će se petljati i tako dalje. To znači da se svaka od 25 lokacija u nizu izgleda inicijalizira u razmak.

Nakon petlje for, poziva se funkcija InitSystem s pet int parametara. Funkcija mora biti definirana prije nego što se nazove ili prevoditelj neće znati koliko parametara bi trebao imati. InitSystem ima ovih pet parametara.

Na sljedećoj stranici: Nastavlja se generiranje slučajne početne mape ...

05

od 05

Nastavlja se generiranje slučajne početne mape

Ovo su parametri za InitSystem.

  • systemindex - vrijednost od 0 -9.
  • x i y - koordinate sustava (0-4).
  • brodovi - koliko brodova ima u ovom sustavu.
  • vlasnik. Tko posjeduje sustav. 0 znači igrača, 9 znači neprijatelja.

Dakle, linija InitSystem (0,0,0,50,0) inicijalizira sustav 0 na lokacijama x = -0, y = 0 s 50 brodova do vlasnika 0.

C ima tri vrste petlje, dok petlje, za petlje i radimo petlje, a mi koristimo i radimo u funkciji GenMapSystems. Ovdje moramo postaviti preostalih 8 sustava negdje u galaksiji.

za (i = 1; ja {
x = Slučajno (5) -1;
y = Slučajno (5) -1;
}
while (izgled [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}

U ovom su kodu dvije ugniježđene petlje. Vanjska petlja je izraz koji broji i varijablu i od početne vrijednosti 1 do krajnje vrijednosti 8. Upotrijebit ćemo i za upućivanje na sustav. Zapamtite da smo već pokrenuli sustav 0 i 9, tako da sada inicijaliziramo sustave 1-8.

Sve, od trenutka do {do vremena (izgled [x] [y], druga je petlja). To je sintaksa je to {something} while (uvjet je istina); Stoga dodijeljujemo slučajne vrijednosti x i y, svaka vrijednost u rasponu 0-4. Slučajno (5) vraća vrijednost u rasponu 1 do 5, oduzimanjem 1 dobiva se područje 0-4.

Ne želimo staviti dva sustava u iste koordinate, tako da ova petlja traži slučajnu lokaciju koja u sebi ima razmak. Ako postoji sustav, izgled [x] [y] neće biti razmak. Kad nazovemo InitSystem, tamo se postavlja drugačija vrijednost. BTW! = Znači nije jednak i == znači jednak.

Kad kôd nakon nekog vremena stigne do InitSystem-a (izgled [x] [y]! = ''), X i y definitivno se odnose na mjesto u izgledu koje ima prostor u njemu. Stoga možemo nazvati InitSystem i zatim kružiti oko petlje za pronalazak slučajne lokacije za sljedeći sustav dok ne postavimo svih 8 sustava.

Prvi poziv InitSystem postavlja sustav 0 na lokaciju 0,0 (gornji lijevi dio mreže) s 50 flota i ja sam zadivljen. Drugi poziv inicijalizira sustav 9 na lokaciji 4,4 (dolje desno) s 50 flota i u vlasništvu je igrača 1. Pomno ćemo pogledati što InitSystem zapravo radi u sljedećem vodiču.

#definirati

Ovi retci izjavljuju doslovne vrijednosti. Uobičajeno ih je staviti u velika slova. Svugdje gdje prevoditelj vidi MAXFLEETS, koristi vrijednost 100. Ovdje ih promijenite i vrijedi posvuda:

  • #define ŠIRINA 80
  • #define HEIGHT 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSISTEMI 10
  • #define FIGHTMARKER 999

Zaključak

U ovom smo vodiču opisali varijable i uporabu int, char i strukturnih skupina da bismo ih grupirali, kao i niz za stvaranje popisa. Zatim jednostavna petlja pomoću i za. Ako proučite izvorni kôd, iste se građevine vide nakon vremena.

  • za (i = 0; i
  • za (i = 0; i

Vodič Dva puta ćemo pogledati aspekte C spomenute u ovom vodiču.