01
alates 05
Mängude programmeerimise õpetuste sissejuhatus
See on esimene mitmest C-mängus programmeerimisest, mis on mõeldud algajatele. Selle asemel, et keskenduda C õpetamisele ja näidata näidisprogramme, õpetavad nad C, pakkudes teile C-keeles terviklikke programme (st mänge)
Hoides seda lihtsana
Sarja esimene mäng on konsool (st tekstipõhine mäng nimega Star Empires). Star Empires on lihtne mäng, kus peate jäädvustama Galaxy kõik 10 süsteemi, samal ajal peatades oma AI vastase sama tegemise.
Hakkate omama süsteemi 0, samal ajal kui teie vaenlase enda süsteem 9. Ülejäänud kaheksa süsteemi (1-8) algavad kõik neutraalselt. Kõik süsteemid käivituvad 5-parselise x 5-parselise ruudu sees, nii et ükski süsteem pole üksteisest suurem kui 6 parselit. Kaks kõige kaugemat punkti on (0,0) ja (4,4). Pythagorase teoreemi järgi on kahest süsteemist kõige kaugemal ruutjuur (4)2 + (4)2), mis on ruutjuur 32-st, mis on umbes 5.657.
Pange tähele, see pole lõplik versioon ja seda muudetakse. Viimane muudatus: 21. august 2011.
Pöörepõhine ja reaalajas
Mäng põhineb kordamööda ja igal käigul annate korralduse suvalise arvu laevastike teisaldamiseks suvalisest süsteemist teise süsteemi. Kui teil on mitu süsteemi, saate tellida laevastikke, et liikuda kõigist süsteemidest sihtsüsteemi. Seda tehakse proportsionaalselt ümardatult, nii et kui teil on kolm süsteemi (1,2,3) koos 20, 10 ja 5 laevastikuga ja tellite 10 laevastikku, et minna süsteemi 4, siis 6 läheb süsteemist 1, 3 süsteemist 2 ja 1 süsteemist 3. Iga laevastik liigub 1 parsel pöörde kohta.
Iga pööre kestab 5 sekundit, ehkki kiirust saab selle kiirendamiseks või aeglustamiseks muuta, muutes selle koodirida 5 väärtuseks 3 või 7 või ükskõik, mille valite. Otsige seda koodirida:
onesec = kell () + (5 * CLOCKS_PER_SEC);
C programmeerimisõpetus
See mäng on programmeeritud ja eeldab, et te ei tunne ühtegi C-programmeerimist. Tutvustan selles ja järgmises kahes või kolmes õpetuses C-programmeerimisfunktsioone nende edenedes. Esiteks on teil vaja Windowsi jaoks kompilaatorit. Siin on kaks tasuta:
- Proovige CC386
- Või Visual C ++ 2010 Express
Artikkel CC386 tutvustab teid projekti loomise kaudu. Kui installite selle kompilaatori, peate vaid laadima programmi Hello World vastavalt kirjeldusele, kopeerima ja kleepima lähtekoodi näite kohale, salvestama selle ja seejärel vajutama F7, et see kompileerida ja käivitada. Samuti loob Visual C ++ 2010 artikkel teremaailma programmi. Star Empires. Ehitamiseks kirjutage see üle ja vajutage F7. Selle käivitamiseks vajutage F5.
Järgmisel lehel - Tähe impeeriumide tööle panemine
02
alates 05
Tähe impeeriumide tööle panemine
Tähe impeeriumide tööle panemine
Peame talletama teabe mängu laevastikes ja süsteemides. Laevastik on üks või mitu laeva, mille korraldus on liikuda ühelt süsteemelt teisele. Tähesüsteem on arv planeete, kuid on selles mängus pigem abstraktne üksus. Laevastiku kohta peame hoidma järgmist teavet.
- Päritolu süsteem (1-10).
- Sihtkoha süsteem (1-10)
- Mitu laeva (1-palju)
- Pöördub saabumisele
- Kelle laevastik see on? 0 = mängija, 9 = vaenlane
Selle hoidmiseks kasutame C-tüüpi struktuuri:
struktuurilaevastik {
int fromsystem;
int tosüsteem;
int pöörded;
int laevastiku suurus;
int omanik;
};
Struktuur on andmete kogum, antud juhul 5 numbrit, millega me ühena manipuleerime. Igal numbril on nimi, nt fromsystem, tosystem. Need nimed on C muutuja nimed ja neil võib olla allakriipsud, nagu see, kuid mitte tühikuid. C-s on numbrid kas täisarv; täisarvu nagu 2 või 7 nimetatakse neid intsideks või komakohtade arvuga nagu 2,5 või 7,3333 ja neid nimetatakse ujukiteks. Terves Tähe impeeriumides kasutame hõljumeid ainult üks kord. Kahe koha vahelise kauguse arvutamisel kasutatava koodipalaga. Iga teine number on int.
Seega on laevastik andmestruktuuri nimi, mis sisaldab viit int muutujat. Nüüd on see ühe laevastiku jaoks. Me ei tea, kui palju laevastikke meil on vaja hoida, nii et eraldame massiiviga ruume 100 jaoks. Mõelge konstruktsioonile nagu õhtusöögilaud, kus oleks ruumi viiele inimesele (ints). Massiiv on nagu pikk õhtusöögilaud. 100 lauda tähendab, et see mahutab 100 x 5 inimest.
Kui me tegelikult teenindaksime neid 100 õhtusöögilauda, peaksime teadma, milline laud oli, ja teeme seda nummerdamise teel. C-s nummerdame massiivi elemendid alati algusega 0. Esimene õhtusöögilaud (laevastik) on number 0, järgmine on 1 ja viimane on 99. Ma mäletan seda alati kui mitu õhtusöögilauda on see laud algusest peale? Esimene neist on stardis, st 0 mööda.
Nii deklareerime laevastikud (st meie õhtusöögilauad).
laevastiku laevastikud [100];
Lugege seda vasakult paremale. Struktuurne laevastik viitab meie struktuurile ühe laevastiku hoidmiseks. Nimi laevastikud on nimi, mille anname kõigile laevastikele ja [100] ütleb, et laevastike muutuja hulgas on 100 x struct laevastikku. Iga int võtab 4 mälu asukohta (nn baiti), nii et üks laevastik võtab 20 baiti ja 100 laevastikku on 2000 baiti. Alati on hea teada, kui palju mälu meie programm oma andmete hoidmiseks vajab.
Struktuuripargis on igal sisendil täisarv. See arv on salvestatud 4 baiti ja selle vahemik on vahemikus -2 147 483 647 kuni 2 147 483 648. Enamasti kasutame väiksemaid väärtusi. Süsteemi on kümme, nii et nii süsteem kui ka tosüsteem hoiavad väärtusi 0 kuni 9.
Järgmisel lehel: Süsteemid ja juhuslikud numbrid
03
alates 05
Süsteemide ja juhuslike numbrite kohta
Igal neutraalsüsteemil (1-8) on 15 laevaga (numbri, mille valisin õhust!) Alustamiseks ja ülejäänud kahel (teie oma: süsteem 0 ja teie arvuti vastane süsteemil 9) on kummalgi 50 laeva. Igal pöördel suurendatakse laevade arvu süsteemis 10%, ümardades allapoole. Kui pärast ühte pööret, kui te neid ei liiguta, saab 50-st 55 ja kõigil neutraalsetel süsteemidel 16 (15 + 1,5 ümardatud). Pange tähele, et teise süsteemi liikuvate laevastike arv ei suurene.
Laevade arvu suurendamine võib sel moel tunduda pisut veider, kuid olen teinud seda selleks, et mäng edasi liikuks. Selle asemel, et risustada seda õpetust liiga palju kujundusotsustega, kirjutasin eraldi artikli Star Empiresi disainiotsuste kohta.
Rakendussüsteemid
Alguses peame genereerima kõik süsteemid ja panema need kaardile, maksimaalselt ühe süsteemiga igas asukohas, kuna meie 5 x 5 ruudustikul on 25 asukohta, on meil kümme süsteemi ja 15 tühja asukohad. Nende genereerimiseks kasutatakse funktsiooni GenMapSystems (), mida vaatleme järgmisel lehel.
Süsteemi hoitakse struktuuris, milles on järgmised 4 välja, mis on kõik omavahel seotud.
struktuurisüsteem {
int x, y;
int numbrid;
int omanik;
};
Galaktikat (kõiki 10 süsteemi) hoitakse teises massiivis nagu ka laevastike puhul, välja arvatud see, et meil on 10 süsteemi.
struktuurisüsteemi galaktika [10];
Juhuslikud numbrid
Kõik mängud vajavad juhuslikke numbreid. C-l on sisseehitatud funktsioon rand (), mis tagastab juhusliku int. Saame selle vahemikku sundida, maksimeerides maksimaalse arvu ja kasutades% operaatorit. (Moodul). See on nagu kella aritmeetika, välja arvatud 12 või 24 asemel sisestame sisenumbri, mida nimetatakse max.
/ * tagastab arvu vahemikus 1 kuni max * /
int juhuslik (int max) {
tootlus (rand ()% max) +1;
}
See on näide funktsioonist, mis on konteineri sisse mähitud kooditükk. Esimene siin olev rida, mis algab / * ja lõpeb * /, on kommentaar. Selles öeldakse, mida kood teeb, kuid seda eirab kompilaator, kes loeb C-juhiseid ja teisendab need juhisteks, millest arvuti saab aru ja mida saab väga kiiresti täita.
- Huvitav, mis kompilaator on? Loe Mis on kompilaator? (Artikkel)
Funktsioon on nagu matemaatiline funktsioon, näiteks Sin (x). Sellel funktsioonil on kolm osa:
int juhuslik (int max)
Int ütleb, mis tüüpi numbri see tagastab (tavaliselt int või float). Juhuslik on funktsiooni nimi ja (int max) ütleb, et me läbime int arvu. Me võime seda kasutada nii:
int täringud;
täringud = juhuslikud (6); / * tagastab juhusliku arvu vahemikus 1 kuni 6 * /
Rida:
tootlus (rand ()% max) +1;
Järgmisel lehel: Juhusliku alguskaardi genereerimine
04
alates 05
Juhusliku alguskaardi genereerimine
See allolev kood genereerib stardikaardi. See on ülal näidatud.
kehtetu GenMapSystems () {
int i, x, y;
for (x = 0; x for (y = 0; y paigutus [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Leidke järelejäänud 8 süsteemile tühi koht * /
jaoks (i = 1; ma teen {
x = juhuslik (5) -1;
y = juhuslik (5) -1;
}
while (paigutus [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}
Süsteemide genereerimine on mängija ja vastaste süsteemide (punktides 0,0) ja (4,4) liitmine ning seejärel 8 juhusliku lisamisega ülejäänud 23 tühja kohta.
Kood kasutab kolme reaga määratletud int muutujat
int i, x, y;
Muutuja on asukoht mälus, millel on int väärtus. Muutujad x ja y hoiavad süsteemide koordinaate ja nende väärtus on vahemikus 0–4. Muutujat i kasutatakse silmuste loendamiseks.
8 juhusliku süsteemi 5x5 ruudustikku paigutamiseks peame teadma, kas mõnes asukohas on süsteem juba olemas, ja takistama teise paigutamist samasse kohta. Selleks kasutame lihtsat kahemõõtmelist märkide massiivi. Tüüp char on teine muutuja tüüp C-s ja sellel on üks täht, näiteks „B” või „x”.
Krunt andmetüüpide kohta C-s
C muutujate põhitüübid on int (täisarvud nagu 46), char (tähemärk nagu A) ja float (ujukomaga numbrite hoidmiseks nagu 3.567). Massiivid [] on sama elemendi loendite hoidmiseks. Nii char [5] [5] määratleb loendite loendi; kahemõõtmeline märkide massiiv. Mõelge sellele nagu 25 kraapitavat tükki, mis on paigutatud 5 x 5 ruudustikku.
Nüüd me silmus!
Iga sümbol seatakse algselt topeltsilmuse tühikule, kasutades avalduste jaoks kahte. A-lause jaoks on kolm osa. Initsialiseerimine, võrdlusosa ja muutmisosa.
for (x = 0; x for (y = 0; y paigutus [x] [y] = '';
}
- x = 0; See on lähtestamise osa.
- x
- x ++. See on muutuste osa. See lisab 1 kuni x.
Niisiis (jaoks (x = 0; x
Sees jaoks (x-silmus on y-silmuse jaoks, mis teeb sama ka y korral. See y-silmus juhtub iga X väärtuse korral. Kui X on 0, siis Y on silmus 0 kuni 4, kui X on 1, Y on silmus ja nii edasi. See tähendab, et iga paigutusmassiivi 25 asukohast lähtestatakse tühikuks.
Pärast silmuse jaoks kutsutakse funktsioon InitSystem viie int parameetriga. Funktsioon tuleb enne selle kutsumist määratleda. Vastasel juhul ei tea kompilaator, mitu parameetrit sellel peaks olema. InitSystemil on need viis parameetrit.
Järgmisel lehel: Jätkub juhusliku alguskaardi genereerimine ...
05
alates 05
Jätkatakse juhusliku alguskaardi genereerimist
Need on parameetrid InitSystemile.
- systemindex - väärtus vahemikus 0 -9.
- x ja y - süsteemi koordinaadid (0-4).
- numships - mitu laeva selles süsteemis on.
- omanik. Kes omab süsteemi. 0 tähendab mängijat, 9 tähendab vaenlast.
Nii initsialiseerib rida InitSystem (0,0,0,50,0) süsteemi 0 asukohtades x = -0, y = 0 50 laevaga omanikule 0.
C-l on kolme tüüpi silmuseid, samas kui silmuseid, nii silmuste kui ka silmuste jaoks ja mida me kasutame funktsioonis GenMapSystems. Siin peame ülejäänud 8 süsteemi kuskile galaktikasse paigutama.
jaoks (i = 1; ma teen {
x = juhuslik (5) -1;
y = juhuslik (5) -1;
}
while (paigutus [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}
Selles koodis on kaks pesastatud silmust. Väline silmus on avalduse jaoks, mis loendab i muutuja algväärtusest 1 lõpliku väärtuseni 8. Kasutame süsteemi viitamiseks i. Pidage meeles, et oleme juba algatanud süsteemi 0 ja 9, seega lähtestame nüüd süsteemid 1-8.
Kõik alates tegemisest {kuni hetkeni (paigutus [x] [y]) on teine silmus. Selle süntaks on teha {midagi} while (tingimus on tõene); Seega määrame juhuslikud väärtused väärtustele x ja y, iga väärtus jääb vahemikku 0–4. Juhuslik (5) tagastab väärtuse vahemikus 1 kuni 5, lahutades 1, saab vahemik 0–4.
Me ei taha panna kahte süsteemi samadele koordinaatidele, nii et see silmus otsib juhuslikku asukohta, milles on tühikut. Kui seal on süsteem, ei ole paigutus [x] [y] tühik. Kui me kutsume InitSystem, paneb see teistsuguse väärtuse. BTW! = Tähendab mitte võrdset ja == tähendab võrdset.
Kui kood jõuab mõne aja pärast InitSüsteemi (paigutus [x] [y]! = ''), Viitavad x ja y kindlasti paigutuse kohale, milles on tühikut. Seega võime helistada InitSystemile ja minna seejärel ringi ringi, et leida järgmise süsteemi juhuslik asukoht, kuni kõik 8 süsteemi on paigutatud.
Esimene üleskutse InitSystemile loob süsteemi 0 asukohas 0,0 (ruudustik vasakus ülaosas) 50 laevastikuga ja minu võitis see. Teine kõne initsialiseerib süsteemi 9 asukohas 4,4 (all paremal) 50 laevastikuga ja see kuulub mängijale 1. Järgmises õpetuses uurime lähemalt, mida InitSystem tegelikult teeb.
#defineeri
Need read deklareerivad sõnasõnalisi väärtusi. Tavaline on panna need suurtähtedesse. Kõikjal, kus kompilaator näeb MAXFLEETS-i, kasutab see väärtust 100. Muutke neid siin ja see kehtib kõikjal:
- #defineeri WIDTH 80
- #defineeri KÕRUS 50
- #defineeri MAXLEN 4
- #defineeri MAXFLEETS 100
- #defineerige MAXSYSTEMS 10
- #defineeri FIGHTMARKER 999
Järeldus
Selles õpetuses käsitleme muutujaid ning int, char ja struct kasutamist nende rühmitamiseks ning massiivi loendi loomiseks. Siis lihtne silmus, kasutades ja teha. Lähtekoodi uurimisel nähakse samu struktuure aeg-ajalt.
- jaoks (i = 0; i
- jaoks (i = 0; i
Õpetus Twowill vaatleb selles õpetuses mainitud C aspekte.