Jak programovat hry v C. Výukový program One

01

z 05

Úvod do výukových programů pro hry

Toto je první z několika her, které programují návody v C pro úplné začátečníky. Místo toho, aby se soustředili na výuku C, pak ukázali ukázkové programy, které učí C tím, že vám poskytnou kompletní programy (tj. Hry) v C

Udržet to jednoduché

První hra v řadě je konzole (tj. Textová hra s názvem Star Empires). Star Empires je jednoduchá hra, ve které musíte zachytit všech 10 systémů v Galaxii a zároveň zastavit svého soupeře AI.

Začnete vlastnit systém 0, zatímco váš nepřítel vlastní systém 9. Zbývajících osm systémů (1-8) začíná neutrálně. Všechny systémy začínají na 5 parsec x 5 parsec náměstí, takže žádný systém není od sebe vzdálen více než 6 parsec. Nejvzdálenější dva body jsou (0,0) a (4,4). Podle Pythagorovy věty je nejvzdálenější vzdálenost od všech dvou systémů druhá odmocnina (4)2 + (4)2), což je druhá odmocnina 32, což je asi 5,657.

Vezměte prosím na vědomí, že toto není konečná verze a bude změněna. Poslední změna: 21. srpna 2011.

Turn Based & Real-Time

instagram viewer

Hra je založena na tahu a každé otočení udělíte příkazy k přesunutí libovolného počtu flotil z jakéhokoli systému, který vlastníte, do jakéhokoli jiného systému. Pokud vlastníte více než jeden systém, můžete objednat flotily, aby se přesunuly ze všech svých systémů do cílového systému. To se děje pro rata zaokrouhleno nahoru, takže pokud vlastníte tři systémy (1,2,3) s přítomností 20, 10 a 5 vozových parků a objednáte 10 flotíl, aby šli do systému 4, potom 6 půjde ze systému 1, 3 ze systému 2 a 1 ze systému 3. Každá flotila se pohybuje o 1 parsec za kolo.

Každé otočení trvá 5 sekund, i když můžete změnit rychlost tak, aby se zvýšila nebo zpomalila změnou 5 v tomto řádku kódu na 3 nebo 7 nebo podle vašeho výběru. Vyhledejte tento řádek kódu:

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

C Programovací výuka

Tato hra byla naprogramována a předpokládá, že neznáte žádné programování v C. Během tohoto postupu představím programovací funkce C v tomto a dalších dvou nebo třech tutoriálech. Nejprve však budete potřebovat kompilátor pro Windows. Zde jsou dvě bezplatné:

  • Snaž se CC386
  • Nebo Visual C ++ 2010 Express

Článek CC386 vás provede vytvořením projektu. Pokud nainstalujete tento kompilátor, stačí načíst program Hello World, jak je popsáno, zkopírujte a vložte zdrojový kód do příkladu, uložte jej a pak stiskněte F7, abyste jej zkompilovali a spustili. Podobně článek Visual C ++ 2010 vytváří program hello world. Přepište jej a stisknutím klávesy F7 vytvořte Star Empires., F5 jej spustíte.

Na další stránce - Jak funguje Hvězdná říše

02

z 05

Jak Hvězdné říše fungovat

Jak Hvězdné říše fungovat

Potřebujeme ukládat informace o flotilách a systémech ve hře. Flotila je jedna nebo více lodí s příkazem k přesunu z jednoho systému do druhého. Hvězdný systém je řada planet, ale v této hře je spíše abstraktní entitou. Pro flotilu musíme mít následující informace.

  • Původní systém (1-10).
  • Cílový systém (1-10)
  • Kolik lodí (1-Mnoho)
  • Obrací se k příchodu
  • Čí je to loďstvo? 0 = Hráč, 9 = Nepřítel

Budeme používat strukturu v C, abychom to udrželi:

struct fleet {
int fromsystem;
int tosystem;
int se otočí;
int flotilize;
int vlastník;
};

Struktura je soubor dat, v tomto případě 5 čísel, se kterými manipulujeme jako s jedním. Každé číslo má jméno, např. Fromsystem, tosystem. Tato jména jsou názvy proměnných v C a mohou mít podtržítka like_this, ale ne mezery. V C jsou čísla buď celá čísla; celá čísla jako 2 nebo 7 se nazývají ints nebo čísla s desetinnými částmi jako 2.5 nebo 7.3333 a tato čísla se nazývají floats. V celé Hvězdné říši používáme plave jen jednou. V kusu kódu, který vypočítává vzdálenost mezi dvěma místy. Každé další číslo je int.

Flotila je tedy název datové struktury obsahující pět proměnných int. Teď je to pro jednu flotilu. Nevíme, kolik flotil musíme držet, a tak přidělíme velkorysý prostor pro 100 pomocí pole. Mysli na strukturu jako na jídelní stůl s prostorem pro pět lidí (ints). Pole je jako dlouhá řada jídelních stolů. 100 stolů znamená, že pojme 100 x 5 osob.

Kdybychom skutečně podávali těch 100 jídelních stolů, museli bychom vědět, který stůl byl který, a uděláme to číslováním. V C vždy počítáme prvky polí začínající na 0. První jídelní stůl (flotila) je číslo 0, další je 1 a poslední 99. Vždycky si to pamatuji jako kolik jídelních stolů je tento stůl od začátku? První je na začátku, takže je 0.

Takto deklarujeme flotilu (tj. Naše večeře).

flotily strukturálních flotil [100];

Přečtěte si toto zleva doprava. Struktura flotily odkazuje na naši strukturu pro držení jedné flotily. Jmenná flotila je jméno, které dáme všem flotilám a [100] nám říká, že v proměnné flotily je 100 x strukturová flotila. Každé int zabírá 4 místa v paměti (nazývá se bajty), takže jedna flotila zabírá 20 bajtů a 100 flotil je 2000 bajtů. Vždy je dobré vědět, kolik paměti musí náš program uchovávat svá data.

Ve strukturální flotile má každý z ints celé číslo. Toto číslo je uloženo ve 4 bytech a jeho rozsah je od -2 147 483 647 do 2 147 483 648. Většinou používáme menší hodnoty. Existuje deset systémů, takže jak ze systému, tak ze systému budou mít hodnoty 0 až 9.

Na další stránce: Systémy a náhodná čísla

03

z 05

O systémech a náhodných číslech

Každý z neutrálních systémů (1-8) začíná 15 loděmi (číslo, které jsem si vybral ze vzduchu!) A začínají a další dva (váš: systém 0 a váš počítačový soupeř v systému 9) mají každý 50 lodí. Při každém otočení se počet lodí v systému zvyšuje o 10% zaokrouhlených dolů. Takže po jednom otočení, pokud je nepohybujete, se vaše 50 stane 55 a každý z neutrálních systémů bude mít 16 (15 + 1,5 zaokrouhleno dolů). Uvědomte si, že počet flotil přesouvajících se do jiného systému se nezvyšuje.

Zvýšení počtu lodí tímto způsobem se může zdát trochu podivné, ale udělal jsem to proto, aby hra pokračovala. Spíše než zaplnit tento tutoriál příliš velkým množstvím rozhodnutí o návrhu, napsal jsem samostatný článek o rozhodování o návrhu Star Empires.

Implementační systémy

Na začátku musíme vygenerovat všechny systémy a umístit je na mapu, maximálně jeden systém každé místo, protože na naší síti 5 x 5 je 25 míst, budeme mít deset systémů a 15 prázdných umístění. Generujeme je pomocí funkce GenMapSystems (), na kterou se podíváme na další stránce.

Systém je uložen v strukturu s následujícími 4 poli, která jsou všechna int.

struct system {
int x, y;
int numfleets;
int vlastník;
};

Galaxie (všech 10 systémů) je uložena v jiném poli, stejně jako u flotil, kromě toho, že máme 10 systémů.

galaxie strukturního systému [10];

Náhodná čísla

Všechny hry potřebují náhodná čísla. C má vestavěnou funkci rand (), která vrací náhodné int. Můžeme to vynutit do rozsahu předáním maximálního počtu v a pomocí% operátora. (Modulus). Je to jako aritmetika hodin, kromě toho, že místo 12 nebo 24 předáme číslo int nazvané max.

/ * vrátí číslo mezi 1 a max * /
int Random (int max) {
návrat (rand ()% max) +1;
}

Toto je příklad funkce, která je kusem kódu zabaleným uvnitř kontejneru. První řádek, který začíná / * a končí * /, je komentář. Říká, co kód dělá, ale je ignorován kompilátorem, který čte instrukce C a převádí je na instrukce, kterým počítač rozumí a dokáže provádět velmi rychle.

  • Zajímá vás, co je kompilátor? Číst Co je překladač? (Článek)

Funkce je jako matematická funkce, jako je Sin (x). Tato funkce má tři části:

int Náhodné (int max)

Int říká, jaký typ čísla se vrací (obvykle int nebo float). Náhodné je jméno funkce a (int max) říká, že předáváme číslo int. Můžeme to použít takto:

int kostky;
kostky = náhodný (6); / * vrací náhodné číslo mezi 1 a 6 * /

Linie:

návrat (rand ()% max) +1;

Na další stránce: Generování náhodné startovní mapy

04

z 05

Generování náhodné startovní mapy

Mapa hvězdných říší

Tento kód generuje počáteční mapu. To je ukázáno výše.

void GenMapSystems () {
int i, x, y;
pro (x = 0; x pro (y = 0; y rozložení [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Najděte prázdné místo pro zbývajících 8 systémů * /
pro (i = 1; dělám {
x = náhodný (5) -1;
y = náhodný (5) -1;
}
while (rozložení [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}

Generování systémů je věcí přidání hráče a soupeřových systémů (na 0,0) a (4,4) a pak náhodného přidání 8 systémů na zbývajících 23 prázdných místech.

Kód používá tři proměnné int definované řádkem

int i, x, y;

Proměnná je místo v paměti, které obsahuje int hodnotu. Proměnné xay drží souřadnice systémů a budou držet hodnotu v rozsahu 0-4. Proměnná i se používá pro počítání ve smyčkách.

Abychom umístili 8 náhodných systémů do mřížky 5x5, musíme vědět, zda místo již má systém a zabránit tomu, aby byl do stejného umístění umístěn jiný. K tomu používáme jednoduché dvourozměrné pole znaků. Typ char je další typ proměnné v C a obsahuje jeden znak jako 'B' nebo 'x'.

Primer na datových typech v C

Základním typem proměnných v C jsou int (celá čísla jako 46), char (jeden znak jako 'A') a float (pro držení čísel s plovoucí desetinnou čárkou jako 3.567). Pole [] slouží k uložení seznamů stejného prvku. Char [5] [5] tedy definuje seznam seznamů; dvourozměrné pole znaků. Myslete na to jako na 25 Scrabble kusů uspořádaných do mřížky 5 x 5.

Nyní se opakujeme!

Každý znak je zpočátku nastaven na mezeru ve dvojité smyčce pomocí dvou pro příkazy. Pro prohlášení má tři části. Inicializace, srovnávací část a část změn.

pro (x = 0; x pro (y = 0; y rozložení [x] [y] = '';
}

  • x = 0; Toto je inicializační část.
  • X
  • x ++. Toto je část pro změnu. Přidá 1 k x.

Takže (pro (x = 0; x

Uvnitř for (x loop je for y loop, který dělá to samé pro y. Tato smyčka y se stane pro každou hodnotu X. Když X je 0, Y bude opakovat 0 až 4, když X je 1, Y bude opakovat atd. To znamená, že každé z 25 umístění v poli rozvržení je inicializováno do prostoru.

Po smyčce for je vyvolána funkce InitSystem s pěti parametry int. Před voláním musí být definována funkce, jinak kompilátor nebude vědět, kolik parametrů má mít. InitSystem má těchto pět parametrů.

Na další stránce: Generování náhodné startovní mapy pokračuje ...

05

z 05

Pokračuje generování náhodné startovní mapy

Toto jsou parametry pro InitSystem.

  • systemindex - hodnota od 0 -9.
  • xay - souřadnice systému (0-4).
  • numships - kolik lodí je v tomto systému.
  • majitel. Kdo vlastní systém. 0 znamená hráče, 9 znamená nepřítele.

Řádek InitSystem (0,0,0,50,0) inicializuje systém 0 na místech x = -0, y = 0 s 50 loděmi majiteli 0.

C má tři typy smyček, zatímco smyčky, pro smyčky a smyčky a my používáme a děláme ve funkci GenMapSystems. Zde musíme umístit zbývajících 8 systémů někde v galaxii.

pro (i = 1; dělám {
x = náhodný (5) -1;
y = náhodný (5) -1;
}
while (rozložení [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}

V tomto kódu jsou dvě vnořené smyčky. Vnější smyčka je pro příkaz, který spočítá proměnnou i od počáteční hodnoty 1 do konečné hodnoty 8. Použijeme i k označení systému. Pamatujte, že jsme již inicializovali systém 0 a 9, takže nyní inicializujeme systémy 1-8.

Vše od do {do the time (layout [x] [y] je druhá smyčka. Jeho syntaxe je {něco}, zatímco (podmínka je pravdivá); Takže přiřazujeme náhodné hodnoty xay, každá hodnota v rozsahu 0-4. Náhodné (5) vrací hodnotu v rozsahu 1 až 5, odečtením 1 se získá rozsah 0-4.

Nechceme dát dva systémy na stejné souřadnice, takže tato smyčka hledá náhodné umístění, které má v sobě mezeru. Pokud existuje systém, rozložení [x] [y] nebude mezera. Když voláme InitSystem, dává to jinou hodnotu. BTW! = Znamená, že se nerovná a == znamená, že se rovná.

Když kód dosáhne systému InitSystem po chvíli (rozložení [x] [y]! = ''), X a y určitě označují místo v rozložení, které má v něm mezeru. Můžeme tedy zavolat InitSystem a pak obejít smyčku for, abychom našli náhodné umístění pro další systém, dokud nebude umístěno všech 8 systémů.

První volání InitSystem nastaví systém 0 na pozici 0,0 (vlevo nahoře od mřížky) s 50 flotilami a vyhrál mě. Druhý hovor inicializuje systém 9 v místě 4,4 (vpravo dole) s 50 loďstvy a je vlastněn hráčem 1. V příštím tutoriálu se podrobně podíváme na to, co InitSystem ve skutečnosti dělá.

#definovat

Tyto řádky deklarují doslovné hodnoty. Obvykle je vkládat do velkých písmen. Všude, kde kompilátor vidí MAXFLEETS, použije hodnotu 100. Změňte je zde a platí všude:

  • #define ŠÍŘKA 80
  • #define VÝŠKA 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #definovat FIGHTMARKER 999

Závěr

V tomto tutoriálu jsme se zabývali proměnnými a použitím int, char a struct k jejich seskupení plus pole k vytvoření seznamu. Pak jednoduché opakování pomocí a pro. Pokud prozkoumáte zdrojový kód, čas od času se zobrazí stejné struktury.

  • pro (i = 0; i
  • pro (i = 0; i

Výukový program Twowill se zaměřuje na aspekty C uvedené v tomto výukovém programu.

instagram story viewer