01
no 05
Ievads spēļu programmēšanas pamācībās

Šī ir pirmā no vairākām programmām, kurās tiek apmācītas C spēles spēles, kas paredzētas iesācējiem. Tā vietā, lai koncentrētos uz C mācīšanu, pēc tam parādot programmu paraugus, viņi māca C, nodrošinot C ar pilnām programmām (ti, spēlēm)
Turot to vienkārši
Pirmā spēle sērijā ir konsole (t.i., uz tekstu balstīta spēle ar nosaukumu Zvaigžņu impērijas). Zvaigžņu impērijas ir vienkārša spēle, kurā jums jāfiksē visas 10 sistēmas Galaktikā, vienlaikus apturot AI pretinieku darīt to pašu.
Jums sāk piederēt sistēma 0, savukārt ienaidniekam - 9. sistēma. Atlikušās astoņas sistēmas (1-8) sāk darboties neitrāli. Visas sistēmas sākas ar 5 parsec x 5 parsec kvadrātu, tāpēc neviena sistēma nav lielāka par 6 parses viena no otras. Tālākie divi punkti ir (0,0) un (4,4). Pēc Pitagora teorēmas vistālākais attālums starp jebkurām divām sistēmām ir kvadrātsakne (4)2 + (4)2), kas ir kvadrātsakne no 32, kas ir apmēram 5.657.
Lūdzu, ņemiet vērā, ka šī nav galīgā versija, un tā tiks labota. Pēdējās izmaiņas: 2011. gada 21. augustā.
Gājienu režīms un reāllaiks
Spēle balstās uz pagriezieniem, un katrs pagrieziens dod rīkojumus pārvietot jebkuru flotu skaitu no jebkuras jums piederošas sistēmas uz jebkuru citu. Ja jums pieder vairāk nekā viena sistēma, varat pasūtīt flotes, lai pārietu no visām savām sistēmām uz mērķa sistēmu. Tas tiek darīts proporcionāli noapaļoti, ja jums pieder trīs sistēmas (1,2,3) ar 20, 10 un 5 flotēm. un jūs pasūtāt 10 flotes, lai pārietu uz 4. sistēmu, tad 6 pāries no 1., 3. no 2. uz sistēmu un 1. no sistēmas 3. Katra autoparks pārvietojas pa 1 parsku vienā pagriezienā.
Katrs pagrieziens ilgst 5 sekundes, lai gan jūs varat mainīt ātrumu, lai to paātrinātu vai palēninātu, mainot 5 šajā koda rindā uz 3 vai 7 vai neatkarīgi no tā, ko izvēlaties. Meklējiet šo koda rindu:
onesec = pulkstenis () + (5 * CLOCKS_PER_SEC);
C programmēšanas apmācība
Šī spēle ir ieprogrammēta, un tiek pieņemts, ka jūs nezināt nevienu C programmēšanu. Es iepazīstināšu ar C programmēšanas funkcijām šajā un nākamajās divās vai trīs pamācībās, tām progresējot. Vispirms jums būs nepieciešams kompilators operētājsistēmai Windows. Šeit ir divi bezmaksas:
- Izmēģiniet CC386
- Vai Visual C ++ 2010 Express
Rakstā CC386 ir sniegta informācija par projekta izveidi. Ja instalējat šo kompilatoru, viss, kas jums jādara, ir ielādēt Hello World programmu, kā aprakstīts, nokopējiet un ielīmējiet avota kodu virs piemēra, saglabājiet to un pēc tam nospiediet taustiņu F7, lai to apkopotu un palaistu. Tāpat arī Visual C ++ 2010 raksts izveido sveikas pasaules programmu. Pārrakstiet to un nospiediet F7, lai izveidotu Zvaigžņu impērijas., F5, lai to darbinātu.
Nākamajā lapā - Zvaigžņu impēriju darbošanās
02
no 05
Zvaigžņu impēriju darbošanās
Zvaigžņu impēriju darbošanās
Mums ir jāuzglabā informācija par flotēm un spēlēm. Flote ir viens vai vairāki kuģi ar rīkojumu pāriet no vienas sistēmas uz otru. Zvaigžņu sistēma ir vairākas planētas, bet šajā spēlē vairāk ir abstrakta vienība. Par floti mums ir jāsaglabā šāda informācija.
- Izcelsmes sistēma (1-10).
- Galamērķa sistēma (1-10)
- Cik kuģu (1-daudz)
- Pagriežas uz ierašanos
- Kuru flote tā ir? 0 = spēlētājs, 9 = ienaidnieks
Lai to noturētu, mēs izmantosim struktūru C:
strūklaku flote {
int no sistēmas;
int tosistēma;
int pagriezieni;
int flotesizmērs;
int īpašnieks;
};
Struktūra ir datu kopums, šajā gadījumā 5 skaitļi, ar kuriem mēs manipulējam kā viens. Katram skaitlim ir nosaukums, piemēram, fromsystem, tosystem. Šie nosaukumi ir mainīgi nosaukumi C, un tiem var būt pasvītrojumi, piemēram, tas, bet ne atstarpes. C, skaitļi ir vai nu veseli skaitļi; veselus skaitļus, piemēram, 2 vai 7, sauc par collām vai cipariem ar decimāldaļām, piemēram, 2,5 vai 7,3333, un tos sauc par pludiņiem. Zvaigžņu impērijās pludiņus mēs izmantojam tikai vienu reizi. Kodā, kas aprēķina attālumu starp divām vietām. Katrs otrais cipars ir int.
Tātad flote ir nosaukums datu struktūrai, kurā ir pieci int mainīgie. Tagad tas ir paredzēts vienai flotei. Mēs nezinām, cik daudz flotu mums vajadzēs turēt, tāpēc mēs piešķirsim dāsnu vietu 100, izmantojot masīvu. Domājiet par būvi kā pie pusdienu galda ar vietu pieciem cilvēkiem (collas). Masīvs ir kā gara vakariņu galdu rinda. 100 galdi nozīmē, ka tajā var ietilpt 100 x 5 cilvēki.
Ja mēs faktiski pasniegtu šos 100 vakariņu galdus, mums būtu jāzina, kurš galds bija kurš, un mēs to darām ar numerāciju. C, mēs vienmēr numurējam masīva elementus, sākot no 0. Pirmais pusdienu galds (flote) ir skaitlis 0, nākamais ir 1 un pēdējais ir 99. Es vienmēr to atceros, cik vakariņu galdos ir šis galds no paša sākuma? Pirmais ir pašā sākumā, līdz ar to 0 ir.
Tas ir veids, kā mēs deklarējam flotes (ti, mūsu pusdienu galdus).
strūklaku flotes flotes [100];
Lasiet to no kreisās uz labo pusi. Strukturētā flote attiecas uz mūsu struktūru vienas flotes turēšanai. Flotes nosaukums ir nosaukums, ko mēs piešķiram visām flotēm, un [100] mums saka, ka flotu mainīgajā lielumā ir 100 x struktūras flotes. Katra int aizņem 4 vietas atmiņā (sauktas par baitiem), tāpēc viena flote aizņem 20 baitus, bet 100 flotes ir 2000 baitu. Vienmēr ir laba ideja zināt, cik daudz atmiņas mūsu programmai ir nepieciešams, lai glabātu savus datus.
Struktūrflotē katram intam ir vesels skaitlis. Šis skaitlis tiek saglabāts 4 baitos, un šī diapazons ir no -2 147 483 647 līdz 2 147 483 648. Lielāko daļu laika mēs izmantosim mazākas vērtības. Ir desmit sistēmas, tāpēc gan no sistēmas, gan no to sistēmas turēs vērtības no 0 līdz 9.
Nākamajā lapā: Sistēmas un nejaušie skaitļi
03
no 05
Par sistēmām un gadījuma skaitļiem
Katra no neitrālajām sistēmām (1-8) sākas ar 15 kuģiem (numuru, kuru es izvēlējos no gaisa!), Ar kuru sākt, un abiem pārējiem (jūsu: 0 sistēma un datora pretinieks 9. sistēmā) ir pa 50 kuģiem. Katrā pagriezienā kuģu skaits sistēmā tiek palielināts par 10%, noapaļojot uz leju. Tātad pēc viena pagrieziena, ja jūs tos nepārvietosit, jūsu 50 kļūs par 55 un katrā no neitrālajām sistēmām būs 16 (15 + 1,5 noapaļoti uz leju). Ņemiet vērā, ka flotu, kas pārvietojas uz citu sistēmu, skaits nepalielinās.
Šādi palielināt kuģu skaitu var šķist nedaudz dīvaini, bet es esmu to izdarījis, lai spēle turpinātos. Tā vietā, lai pārblīvētu šo mācību ar pārāk daudz lēmumiem par dizainu, es uzrakstīju atsevišķu rakstu par Zvaigžņu impēriju dizaina lēmumiem.
Īstenošanas sistēmas
Sākumā mums jāģenerē visas sistēmas un jāievieto tās kartē, maksimāli viena sistēma iekšā katrā vietā, tā kā mūsu 5 x 5 režģī ir 25 vietas, mums būs desmit sistēmas un 15 tukšas atrašanās vietas. Mēs tos ģenerējam, izmantojot funkciju GenMapSystems (), kuru mēs apskatīsim nākamajā lapā.
Sistēma tiek glabāta konstrukcijā ar šādiem 4 laukiem, kas visi ir int.
konstrukcijas sistēma {
int x, y;
int numletes;
int īpašnieks;
};
Galaktika (visas 10 sistēmas) tiek glabāta citā masīvā, tāpat kā flotēs, izņemot to, ka mums ir 10 sistēmas.
struktūras sistēmas galaktika [10];
Nejaušie skaitļi
Visām spēlēm nepieciešami nejauši skaitļi. C ir iebūvēta funkcija rand (), kas atgriež nejaušu int. Mēs to varam piespiest diapazonā, nododot maksimālo skaitu un izmantojot operatoru%. (Modulus). Tas ir kā pulksteņa aritmētika, izņemot 12 vai 24 vietā mēs ievadām int numuru, ko sauc par max.
/ * atgriež skaitli no 1 līdz maks. * /
int nejauši (int max) {
atgriešanās (rand ()% max) +1;
}
Šis ir funkcijas piemērs, kas ir konteinera iekšpusē iesaiņots koda gabals. Pirmā rinda, kas sākas / * un beidzas * /, ir komentārs. Tajā teikts, ko kods dara, bet kompilators, kas izlasa C instrukcijas un pārvērš tās instrukcijās, kuras dators saprot un var ļoti ātri izpildīt, to ignorē.
- Nez, kas ir kompilators? Lasīt Kas ir kompilators? (Raksts)
Funkcija ir kā matemātiska funkcija, piemēram, Sin (x). Šai funkcijai ir trīs daļas:
int nejauši (int max)
Int saka, kāda veida numuru tas atgriežas (parasti int vai float). Nejaušs ir funkcijas nosaukums un (int max) saka, ka mēs ejam ar int numuru. Mēs to varētu izmantot šādi:
int kauliņi;
kauliņš = nejaušs (6); / * atgriež izlases numuru no 1 līdz 6 * /
Līnija:
atgriešanās (rand ()% max) +1;
Nākamajā lapā: Izlases starta kartes ģenerēšana
04
no 05
Izlases starta kartes ģenerēšana

Šis kods zemāk ģenerē sākuma karti. Tas ir parādīts iepriekš.
spēkā neesošs GenMapSystems () {
int i, x, y;
for (x = 0; x for (y = 0; y izkārtojums [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Atrodiet tukšu vietu atlikušajām 8 sistēmām * /
priekš (i = 1; es daru {
x = nejaušs (5) -1;
y = nejauši (5) -1;
}
while (izkārtojums [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}
Sistēmu ģenerēšana ir spēlētāja un pretinieku sistēmu (pie 0,0) un (4,4) pievienošana un pēc tam nejauši pievienota 8 sistēma atlikušajās 23 tukšās vietās.
Kodā izmantoti trīs rindas definēti int mainīgie
int i, x, y;
Mainīgais ir vieta atmiņā, kurai ir int vērtība. Mainīgie lielumi x un y satur sistēmu koordinātas un turēs vērtību diapazonā no 0 līdz 4. Mainīgo i izmanto cilpu skaitīšanai.
Lai ievietotu 8 izlases sistēmas 5x5 režģī, mums jāzina, vai vietai jau ir sistēma, un jānovērš citas izvietošana tajā pašā vietā. Šim nolūkam mēs izmantojam vienkāršu divdimensiju rakstzīmju masīvu. Char tips ir cits C mainīgā tips, un tam ir viena rakstzīme, piemēram, “B” vai “x”.
Datu tipu gruntējums C
C mainīgo pamatveids ir int (veseli skaitļi, piemēram, 46), char (viena rakstzīme, piemēram, “A”) un float (skaitļu turēšanai ar peldošo komatu, piemēram, 3.567). Masīvi [] ir paredzēti viena un tā paša elementa sarakstu turēšanai. Tātad char [5] [5] definē sarakstu sarakstu; divdimensiju burtu kopums. Padomājiet par to, piemēram, 25 Scrabble gabalus, kas izvietoti 5 x 5 režģī.
Tagad mēs cilpa!
Sākotnēji katrs burts tiek iestatīts uz atstarpi divkāršā cilpā, paziņojumiem izmantojot divus. A paziņojumam ir trīs daļas. Inicializācija, salīdzināšanas daļa un mainīšanas daļa.
for (x = 0; x for (y = 0; y izkārtojums [x] [y] = '';
}
- x = 0; Šī ir inicializācijas daļa.
- x
- x ++. Šī ir pārmaiņu daļa. Tas pievieno skaitli 1 līdz x.
Tātad (par (x = 0; x
Inside for (x cilpa ir for y cilpa, kas dara to pašu y. Šī y cilpa notiek katrai X vērtībai. Kad X ir 0, Y būs cilpa no 0 līdz 4, kad X ir 1, Y būs cilpa un tā tālāk. Tas nozīmē, ka katra no 25 izkārtojuma masīva vietām tiek inicializēta ar atstarpi.
Pēc cilpas tiek izsaukta funkcija InitSystem ar pieciem int parametriem. Funkcija ir jādefinē, pirms tā tiek izsaukta, pretējā gadījumā kompilators nezina, cik daudz parametru tai vajadzētu būt. InitSystem ir šie pieci parametri.
Nākamajā lapā: Turpinās izlases starta kartes ģenerēšana ...
05
no 05
Turpinās izlases starta kartes ģenerēšana
Šie ir parametri InitSystem.
- systemindex - vērtība no 0 līdz 9.
- x un y - sistēmas koordinātas (0-4).
- numships - cik kuģu ir šajā sistēmā.
- īpašnieks. Kam pieder sistēma. 0 nozīmē spēlētāju, 9 nozīmē ienaidnieku.
Tātad līnija InitSystem (0,0,0,50,0) inicializē sistēmu 0 vietās x = -0, y = 0 ar 50 kuģiem īpašniekam 0.
C ir trīs cilpu veidi, savukārt cilpas - cilpām un to cilpām, un mēs to izmantojam funkcijai GenMapSystems. Šeit mums atlikušās 8 sistēmas jānovieto kaut kur galaktikā.
priekš (i = 1; es daru {
x = nejaušs (5) -1;
y = nejauši (5) -1;
}
while (izkārtojums [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}
Šajā kodā ir divas ligzdotas cilpas. Ārējā cilpa ir paredzēta paziņojumam, kas saskaita i mainīgo no sākotnējās vērtības 1 līdz gala vērtībai 8. Mēs izmantosim i, lai atsauktos uz sistēmu. Atcerieties, ka mēs jau esam inicializējuši 0 un 9 sistēmu, tāpēc tagad mēs inicializējam 1.-8. Sistēmu.
Viss, sākot no darīšanas līdz brīdim (izkārtojums [x] [y]) ir otrā cilpa. Tā ir sintakse: darīt {kaut ko}, kamēr (nosacījums ir taisnība); Tātad mēs piešķiram nejaušas vērtības x un y, katra vērtība ir diapazonā no 0 līdz 4. Nejaušs (5) atgriež vērtību diapazonā no 1 līdz 5, atņemot 1, iegūst diapazonu no 0 līdz 4.
Mēs nevēlamies ievietot divas sistēmas vienādās koordinātēs, tāpēc šī cilpa meklē nejaušu atrašanās vietu, kurā tajā ir atstarpe. Ja tur ir kāda sistēma, izkārtojums [x] [y] nebūs atstarpe. Kad mēs saucam par InitSystem, tas tur piešķir citu vērtību. BTW! = Nozīmē ne vienādu un == nozīmē vienādu ar.
Kad kods pēc brīža sasniedz InitSystem (izkārtojums [x] [y]! = ''), X un y noteikti norāda uz vietu izkārtojumā, kurā tajā ir atstarpe. Tātad mēs varam piezvanīt uz InitSystem un pēc tam apiet cilpu, lai atrastu nejaušu nākamās sistēmas atrašanās vietu, līdz visas 8 sistēmas ir ievietotas.
Pirmais zvans uz InitSystem izveido sistēmu 0 vietā 0,0 (režģa augšējā kreisajā stūrī) ar 50 flotēm un mani uzvarēja. Otrais zvans inicializē sistēmu 9 vietā 4,4 (apakšējā labajā pusē) ar 50 flotēm, un tā pieder 1. spēlētājam. Nākamajā apmācībā mēs rūpīgi apskatīsim, ko InitSystem faktiski dara.
#definēt
Šīs līnijas deklarē burtiskās vērtības. Ir ierasts tos ievietot ar lielajiem burtiem. Visur, kur kompilators redz MAXFLEETS, tas izmanto vērtību 100. Mainiet tos šeit, un tas attiecas uz visur:
- #definēt 80. PLATUMU
- #definēt 50 AUGSTUMU
- #define MAXLEN 4
- #definējiet MAXFLEETS 100
- #definējiet MAXSYSTEMS 10
- #definēt FIGHTMARKER 999
Secinājums
Šajā apmācībā mēs esam apskatījuši mainīgos un int, char un struct izmantošanu, lai tos grupētu, kā arī masīvu, lai izveidotu sarakstu. Pēc tam vienkārši cilpas, izmantojot for and do. Pārbaudot avota kodu, tās pašas struktūras tiek parādītas laiku pa laikam.
- par (i = 0; i
- par (i = 0; i
Pamācība Twowill aplūkot šajā apmācībā minētos C aspektus.