Kaip programuoti žaidimus C Vadovėlis vienas

01

iš 05

Žaidimų programavimo vadovėlių įvadas

Tai yra pirmasis iš kelių žaidimų programavimo vadovėlių, skirtų C pradedantiesiems. Užuot susikoncentravę į C mokymą, tada rodydami programų pavyzdžius, jie moko C, pateikdami jums visas C programas (ty žaidimus)

Laikyti tai paprasta

Pirmasis serijos žaidimas yra konsolė (t. Y. Tekstu paremtas žaidimas, vadinamas „Žvaigždžių imperijomis“). „Žvaigždžių imperijos“ yra paprastas žaidimas, kuriame jūs turite užfiksuoti visas 10 „Galaxy“ sistemų, sustabdydami tą patį savo AI priešininką.

Jūs pradedate turėti 0 sistemą, o jūsų priešas - 9 sistemą. Likusios aštuonios sistemos (1-8) pradeda veikti neutraliai. Visos sistemos prasideda nuo 5 parsek x x 5 parsek kvadratų, taigi nė viena sistema nėra viena nuo kitos didesnėmis kaip 6 parsis. Toliausiai du taškai yra (0,0) ir (4,4). Pagal Pitagoro teoremą tolimiausias atstumas nuo bet kurių dviejų sistemų yra kvadratinė šaknis (4).2 + (4)2), kuri yra kvadratinė šaknis iš 32, kuri yra apie 5.657.

Atminkite, kad tai nėra galutinė versija ir ji bus pakeista. Paskutinis pakeitimas: 2011 m. Rugpjūčio 21 d.

instagram viewer

Pasukite ir realiuoju laiku

Žaidimas yra pagrįstas savo ruožtu ir kiekvienu pasukimu jūs duodate nurodymus perkelti bet kokį laivynų skaičių iš bet kurios jums priklausančios sistemos į bet kurią kitą sistemą. Jei turite daugiau nei vieną sistemą, galite užsisakyti laivynus, kad perkeltumėte iš visų savo sistemų į tikslinę sistemą. Tai atliekama proporcingai suapvalinus, taigi, jei jums priklauso trys sistemos (1,2,3) su 20, 10 ir 5 automobilių parkais. ir jūs užsakote 10 laivynų pereiti prie 4 sistemos, tada 6 pereis iš 1 sistemos, 3 iš 2 sistemos ir 1 iš sistemos 3. Kiekvienas laivynas juda 1 greitis per posūkį.

Kiekvienas posūkis trunka 5 sekundes, tačiau jūs galite pakeisti greitį, kad jį padidintumėte arba sulėtintumėte, pakeisdami 5 šioje kodo eilutėje į 3 arba 7 arba bet ką, ką pasirinksite. Ieškokite šios kodo eilutės:

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

C programavimo vadovėlis

Šis žaidimas buvo užprogramuotas ir daroma prielaida, kad jūs nežinote jokio C programavimo. Aš supažindinsiu su C programavimo ypatybėmis šiame ir kituose dviejuose ar trijuose vadovėliuose, jiems tobulėjant. Pirmiausia, nors jums reikės kompiliatoriaus, skirto „Windows“. Čia yra du nemokami:

  • Bandyti CC386
  • Arba „Visual C ++ 2010 Express“

Straipsnyje CC386 pateikiami nurodymai, kaip sukurti projektą. Jei įdiegsite tą kompiliatorių, viskas, ką jums reikia padaryti, yra įkelti „Hello World“ programą, kaip aprašyta, nukopijuokite ir įklijuokite šaltinio kodą virš pavyzdžio, išsaugokite jį, tada paspauskite F7, kad sudarytumėte ir paleistumėte. Panašiai „Visual C ++ 2010“ straipsnis sukuria „sveiko pasaulio“ programą. Parašykite jį ir paspauskite F7, kad sukurtumėte „Star Empires.“, F5, kad paleistumėte.

Kitame puslapyje - Priversti Žvaigždžių imperijas veikti

02

iš 05

Žvaigždžių imperijų kūrimas

Žvaigždžių imperijų kūrimas

Turime saugoti informaciją apie žaidimų parkus ir sistemas. Laivynas yra vienas ar keli laivai, turintys nurodymą pereiti iš vienos sistemos į kitą. Žvaigždžių sistema yra keletas planetų, bet yra labiau abstrakti šio žaidimo esmė. Turime turėti šią informaciją apie laivyną.

  • Kilmės sistema (1–10).
  • Paskirties sistema (1-10)
  • Kiek laivų (1 daug)
  • Pasisuka atvykti
  • Kieno tai laivynas? 0 = žaidėjas, 9 = priešas

Mes naudosime strypą C, kad tai laikytume:

struktūrinis laivynas {
int iš sistemos;
int tosistema;
int posūkiai;
vidinis transporto parkas;
int savininkas;
};

Struktūra yra duomenų rinkinys, šiuo atveju 5 skaičiai, kuriais mes manipuliuojame kaip vienas. Kiekvienas numeris turi pavadinimą, pvz., Iš sistemos, tos sistemos. Šie vardai yra kintamieji vardai C raidėje ir gali turėti pabraukimus, pavyzdžiui, tai, bet ne tarpai. C raidėje skaičiai yra arba sveikasis skaičius; ištisiniai skaičiai, tokie kaip 2 arba 7, vadinami intais, arba skaičiai su dešimtainėmis dalimis, pvz., 2,5 arba 7,3333, ir šie skaičiai yra vadinami kintamaisiais. Visoje Žvaigždžių imperijoje plūdes naudojame tik vieną kartą. Kodo dalyje, apskaičiuojančioje atstumą tarp dviejų vietų. Kiekvienas kitas skaičius yra vidinis.

Taigi laivynas yra duomenų struktūros, turinčios penkis vidinius kintamuosius, pavadinimas. Dabar tai skirta vienam laivynui. Mes nežinome, kiek laivynų turėsime laikyti, todėl paskirsime dosnų kambarį 100, naudodami masyvą. Pagalvokite apie statinį kaip prie vakarienės stalo su penkiais žmonėmis (intais). Masyvas yra tarsi ilga vakarienės stalų eilė. 100 lentelių reiškia, kad joje gali būti 100 x 5 žmonių.

Jei mes iš tikrųjų patiektume tuos 100 vakarienės stalų, mes turėtume žinoti, kuris stalas buvo kuris, ir mes tai darome numeruodami. C, mes visada sunumeruojame masyvų elementus, prasidedančius nuo 0. Pirmasis pietų stalas (parkas) yra 0, kitas - 1, o paskutinis - 99. Aš visada atsimenu, kiek yra vakarienės stalų nuo šio stalo? Pirmasis yra pradžioje, taigi 0 yra kartu.

Taip mes deklaruojame laivynus (ty mūsų vakarienės stalus).

struktūrinių laivynų parkai [100];

Perskaitykite tai iš kairės į dešinę. Struktūrinis laivynas reiškia mūsų struktūrą, kad būtų laikomas vienas laivynas. Vardas „flotilės“ yra vardas, kurį suteikiame visiems laivynams ir [100] mums sako, kad laivyno kintamajame yra 100 x struct flotilės. Kiekvienas int užima 4 vietas atmintyje (vadinamus baitais), taigi vienas laivynas užima 20 baitų, o 100 laivynų yra 2000 baitų. Visada pravartu žinoti, kiek atminties reikia mūsų programai, kad būtų galima saugoti duomenis.

Struktūriniame parke kiekviena inta turi sveiką skaičių. Šis skaičius saugomas 4 baitais, jo diapazonas yra nuo -2 147 483 647 iki 2 147 483 648. Dažniausiai naudosime mažesnes vertes. Yra dešimt sistemų, taigi tiek iš sistemos, tiek iš tos sistemos bus vertės nuo 0 iki 9.

Kitame puslapyje: Sistemos ir atsitiktiniai skaičiai

03

iš 05

Apie sistemas ir atsitiktinius skaičius

Kiekviena iš neutralių sistemų (1-8) prasideda nuo 15 laivų (skaičių, kurį pasirinkau iš oro!), O kiti du (jūsų: 0 sistema ir jūsų kompiuterio priešininkas 9 sistemoje) turi po 50 laivų. Kiekviename posūkyje laivų skaičius sistemoje padidinamas 10%, suapvalinus žemyn. Taigi po vieno posūkio, jei jų nejudinsite, jūsų 50 taps 55, o kiekvienoje neutralioje sistemoje bus 16 (15 + 1,5 suapvalinta). Atminkite, kad į kitą sistemą perkeliamų transporto priemonių skaičius nepadidėja.

Padidinti laivų skaičių tokiu būdu gali pasirodyti šiek tiek keista, bet aš tai padariau, kad žaidimas judėtų toliau. Užuot griozdėjęs šį vadovėlį per daug dėl dizaino sprendimų, parašiau atskirą straipsnį apie „Star Empires“ dizaino sprendimus.

Įdiegimo sistemos

Pradžioje turime sugeneruoti visas sistemas ir sudėti jas į žemėlapį, daugiausia viena sistema kiekvienoje vietoje, kadangi mūsų 5 x 5 tinklelyje yra 25 vietos, turėsime dešimt sistemų ir 15 tuščių vietos. Juos sugeneruojame naudodami funkciją „GenMapSystems“ (), kurią nagrinėsime kitame puslapyje.

Sistema saugoma pastate, kuriame yra šie 4 laukai, kurie visi yra int.

konstrukcijų sistema {
int x, y;
vidiniai numeriai;
int savininkas;
};

Galaktika (visos 10 sistemų) saugoma kitame masyve, kaip ir flotilėse, išskyrus tai, kad turime 10 sistemų.

struktūros sistemos galaktika [10];

Atsitiktiniai skaičiai

Visiems žaidimams reikia atsitiktinių skaičių. C turi įmontuotą funkciją rand (), kuri grąžina atsitiktinį int. Mes galime jį priversti į diapazoną, praleidžiant maksimalų skaičių ir panaudojant operatorių%. (Modulis). Tai yra kaip laikrodžio aritmetinė, išskyrus vietoj 12 ar 24, praleidžiame vidinį skaičių, vadinamą maks.

/ * grąžina skaičių nuo 1 iki max * /
int atsitiktinis (int max) {
grąža (rand ()% max) +1;
}

Tai yra funkcijos, kurios kodas yra įvyniotas į konteinerį, pavyzdys. Pirma eilutė, kuri prasideda / * ir baigiasi * /, yra komentaras. Tai sako, ką daro kodas, tačiau nekreipia dėmesio į kompiliatorių, kuris skaito C instrukcijas ir paverčia jas instrukcijomis, kurias kompiuteris supranta ir gali vykdyti labai greitai.

  • Įdomu, kas yra kompiliatorius? Skaitykite Kas yra kompiliatorius? (Straipsnis)

Funkcija yra tarsi matematinė funkcija, tokia kaip Sin (x). Yra trys šios funkcijos dalys:

int atsitiktinis (int max)

Int sako, kokio tipo numerį jis grąžina (paprastai int arba float). Atsitiktinis yra funkcijos pavadinimas ir (int max) sako, kad mes einame int skaičiumi. Mes galime naudoti tai taip:

int kauliukai;
kauliukas = atsitiktinis (6); / * grąžina atsitiktinį skaičių nuo 1 iki 6 * /

Linija:

grąža (rand ()% max) +1;

Kitame puslapyje: Atsitiktinio pradžios žemėlapio generavimas

04

iš 05

Atsitiktinio pradžios žemėlapio generavimas

Žvaigždžių imperijų žemėlapis

Šis žemiau pateiktas kodas sukuria pradžios žemėlapį. Štai jis parodytas aukščiau.

negaliojantis „GenMapSystems“ () {
int i, x, y;
už (x = 0; x už (y = 0; y išdėstymas [x] [y] = '';
}
„InitSystem“ (0,0,0,50,0);
„InitSystem“ (9,4,4,50,1);
/ * Raskite tuščią vietą likusioms 8 sistemoms * /
už (i = 1; aš darau {
x = atsitiktinis (5) -1;
y = atsitiktinis (5) -1;
}
while (išdėstymas [x] [y]! = '');
„InitSystem“ (i, x, y, 15, -1);
}
}

Sistemų generavimas yra žaidėjų ir oponentų sistemų pridėjimas (ties 0,0) ir (4,4), o po to atsitiktinai pridedančios 8 sistemos likusiose 23 tuščiose vietose.

Kode naudojami trys eilutės apibrėžti int kintamieji

int i, x, y;

Kintamasis yra vieta atmintyje, turinti vidinę reikšmę. Kintamieji x ir y laiko sistemų koordinates ir reikš diapazoną nuo 0 iki 4. Kintamasis i naudojamas skaičiuojant kilpas.

Norėdami patalpinti 8 atsitiktines sistemas į 5x5 tinklelį, turime žinoti, ar vieta jau turi sistemą, ir užkirsti kelią kitai įterpti į tą pačią vietą. Tam naudojame paprastą dviejų matmenų ženklų masyvą. Char tipas yra kitas C tipo kintamasis ir turi vieną ženklą, pavyzdžiui, „B“ arba „x“.

Duomenų tipų pradmuo C

Pagrindiniai kintamųjų tipai C yra int (sveikieji skaičiai, pavyzdžiui, 46), char (vienas ženklas, pvz., „A“) ir plūduriuojantis (skirtas laikyti skaičius su slankiojo kablelio pavidalu, pavyzdžiui, 3.567). Masyvai [] yra skirti to paties elemento sąrašams laikyti. Taigi char [5] [5] nusako sąrašų sąrašą; dvimatis ženklų masyvas. Pagalvokite apie tai kaip 25 „Scrabble“ gabalėliai, išdėstyti 5 x 5 tinklelyje.

Dabar mes Loop!

Iš pradžių kiekvienas simbolis nustatomas kaip tarpas dviguboje kilpoje, naudojant du teiginius. A pareiškimą sudaro trys dalys. Iniciacija, palyginimo dalis ir pakeitimo dalis.

už (x = 0; x už (y = 0; y išdėstymas [x] [y] = '';
}

  • x = 0; Tai yra iniciacijos dalis.
  • x
  • x ++. Tai yra pokyčių dalis. Tai prideda 1 prie x.

Taigi (už (x = 0; x

Viduje for (x kilpa yra y kilpa, kuri tą patį daro ir y. Ši y kilpa atsitinka kiekvienai X reikšmei. Kai X yra 0, Y bus kilpa nuo 0 iki 4, kai X yra 1, Y bus kilpa ir pan. Tai reiškia, kad kiekviena iš 25 vietų išdėstymo masyve yra inicializuota kaip tarpas.

Po „for loop“ funkcija iškviečiama „InitSystem“ su penkiais int parametrais. Funkcija turi būti apibrėžta prieš ją iškviečiant, kitaip kompiliatorius nežinos, kiek parametrų ji turėtų turėti. „InitSystem“ turi šiuos penkis parametrus.

Kitame puslapyje: Tęsiamas atsitiktinio pradžios žemėlapio generavimas ...

05

iš 05

Tęsiamas atsitiktinio pradžios žemėlapio generavimas

Tai yra „InitSystem“ parametrai.

  • systemindex - reikšmė nuo 0 iki 9.
  • x ir y - sistemos koordinatės (0-4).
  • Numships - kiek laivų yra šioje sistemoje.
  • savininkas. Kam priklauso sistema. 0 reiškia žaidėją, 9 reiškia priešą.

Taigi eilutė „InitSystem“ (0,0,0,50,0) inicijuoja sistemą 0 vietose x = -0, y = 0 su 50 laivų 0 savininkui.

C yra trijų tipų kilpos, o kilpos - kilpoms ir kilpoms, kurias mes naudojame ir darome funkcijoje GenMapSystems. Čia likusias 8 sistemas turime sudėti kažkur galaktikoje.

už (i = 1; aš darau {
x = atsitiktinis (5) -1;
y = atsitiktinis (5) -1;
}
while (išdėstymas [x] [y]! = '');
„InitSystem“ (i, x, y, 15,0);
}

Šiame kode yra dvi įdėtos kilpos. Išorinė kilpa yra skirta teiginiui, suskaičiuojančiam i kintamąjį nuo pradinės vertės 1 iki galutinės 8. Mes nurodysime sistemą i. Atminkite, kad mes jau inicijavome 0 ir 9 sistemas, todėl dabar mes inicijuojame 1-8 sistemas.

Viskas nuo do {iki to laiko (išdėstymas [x] [y] yra antra kilpa). Tai yra sintaksė „daryti {kažkas} kol (sąlyga teisinga); Taigi atsitiktines vertes priskiriame x ir y, kiekvienai reikšmei 0–4 intervale. Atsitiktine reikšme (5) gaunama reikšmė nuo 1 iki 5, atimant 1 gaunama 0–4 sritis.

Mes nenorime, kad dvi sistemos būtų išdėstytos tomis pačiomis koordinatėmis, todėl ši kilpa ieško atsitiktinės vietos, kurioje yra vietos. Jei ten yra sistema, išdėstymas [x] [y] nebus tarpas. Kai mes vadiname „InitSystem“, ji sukuria kitokią vertę. BTW! = Reiškia ne lygus ir == reiškia lygus.

Kai kodas po kurio laiko pasiekia „InitSystem“ (išdėstymas [x] [y]! = ''), X ir y būtinai nurodo išdėstymo vietą, kurioje yra vietos. Taigi galime paskambinti „InitSystem“ ir tada apeiti forumą, norėdami rasti atsitiktinę kitos sistemos vietą, kol visos 8 sistemos bus išdėstytos.

Pirmasis skambutis „InitSystem“ sukuria 0 sistemą 0,0 vietoje (viršutinėje kairėje tinklo pusėje) su 50 laivynų ir mane laimėjo. Antrasis kvietimas inicijuoja 9 sistemą 4,4 vietoje (apačioje dešinėje) su 50 laivynų ir priklauso 1 žaidėjui. Kitame vadovėlyje atidžiai panagrinėsime, ką „InitSystem“ daro.

#define

Šios eilutės skelbia pažodines vertybes. Įprasta juos dėti didžiosiomis raidėmis. Visur, kur kompiliatorius mato MAXFLEETS, naudojama vertė 100. Pakeiskite juos čia ir jis galioja visur:

  • #define 80 pločio
  • #define 50 AUKŠTIS
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #define FIGHTMARKER 999

Išvada

Šiame vadove apžvelgėme kintamuosius ir int, char bei struct naudojimą, kad grupuotume plius masyvą sąrašui sudaryti. Tada paprasta kilpa naudojant ir padaryti. Jei nagrinėsite šaltinio kodą, tos pačios struktūros bus matomos kartas nuo karto.

  • už (i = 0; i
  • už (i = 0; i

Vadovėlis „Twowill“ pažvelgs į šiame vadovėlyje paminėtus C aspektus.

instagram story viewer