01
din 05
Introducere în tutorialele de programare a jocurilor
Acesta este primul dintre mai multe jocuri Tutoriale de programare a jocurilor în C pentru începători completi. În loc să se concentreze pe predarea C, apoi arată exemple de programe, ei predau C oferindu-vă programe complete (adică jocuri) în C
Păstrându-l simplu
Primul joc din serie este o consolă (adică un joc bazat pe text numit Star Empires). Star Empires este un joc simplu în care trebuie să capturați toate cele 10 sisteme din Galaxy, în timp ce vă opriți adversarul AI de a face același lucru.
Începeți să dețineți System 0, în timp ce propriul sistem 9 al inamicului. Restul de opt sisteme (1-8) încep toate neutru. Toate sistemele pornesc într-un pătrat 5 parsec x 5 parsec, astfel încât niciun sistem nu este mai mult de 6 parsecs una de alta. Cele mai îndepărtate două puncte sunt (0,0) și (4,4). Prin teorema lui Pitagora, cea mai îndepărtată distanță de oricare două sisteme este rădăcina pătrată ((4)2 + (4)2) care este rădăcina pătrată a 32, care este aproximativ 5.657.
Vă rugăm să rețineți că aceasta nu este versiunea finală și va fi modificată. Ultima modificare: 21 august 2011.
Turnat pe bază de timp și în timp real
Jocul este bazat pe ture și la fiecare rundă dați ordine să mutați orice număr de flote din orice sistem pe care îl dețineți în orice alt sistem. Dacă dețineți mai multe sisteme, puteți comanda flote pentru a trece de la toate sistemele dvs. la sistemul țintă. Acest lucru se face în mod proporțional rotunjit, astfel încât dacă dețineți trei sisteme (1,2,3) cu 20, 10 și 5 flote prezente și comandați 10 flote să treacă la sistemul 4, apoi 6 vor trece de la sistemul 1, 3 de la sistemul 2 și 1 de la sistem 3. Fiecare flotă mișcă 1 parsec pe rotație.
Fiecare viraj durează 5 secunde, deși puteți modifica viteza pentru a o mări sau încetini modificând 5 din această linie de cod la 3 sau 7 sau orice alegeți. Căutați această linie de cod:
onesec = ceas () + (5 * CLOCKS_PER_SEC);
C Tutorial de programare
Acest joc a fost programat și presupune că nu cunoașteți nicio programare C. Voi introduce caracteristicile de programare C în acest lucru și în următoarele două sau trei tutoriale pe măsură ce progresează. În primul rând, deși veți avea nevoie de un compilator pentru Windows. Iată două gratuite:
- Încerca CC386
- Sau Visual C ++ 2010 Express
Articolul CC386 vă conduce prin crearea unui proiect. Dacă instalați compilatorul respectiv, tot ce trebuie să faceți este să încărcați programul Hello World așa cum este descris, copiați și lipiți codul sursă peste exemplul, îl salvați și apoi apăsați F7 pentru a-l compila și rula. De asemenea, articolul Visual C ++ 2010 creează un program mondial salutar. Suprascrieți-l și apăsați F7 pentru a construi Star Empires., F5 pentru a-l rula.
Pe pagina următoare - Crearea imperiilor stelelor
02
din 05
Realizarea Imperiilor Stelei de lucru
Realizarea Imperiilor Stelei de lucru
Trebuie să stocăm informații pe flote și sisteme în joc. O flotă este una sau mai multe nave cu ordin de a trece de la un sistem la altul. Un sistem de stele este un număr de planete, dar este mai mult o entitate abstractă în acest joc. Trebuie să deținem următoarele informații pentru o flotă.
- Sistem de origine (1-10).
- Sistemul de destinație (1-10)
- Câte nave (1-multe)
- Se întoarce spre Sosire
- A cui flotă este? 0 = jucător, 9 = dușman
Vom folosi o structură în C pentru a reține acest lucru:
struct flota {
int din sistem;
int tosistem;
viraje int;
int fleetsize;
proprietar int;
};
O struct este o colecție de date, în acest caz 5 numere pe care le manipulăm ca unul. Fiecare număr are un nume, de exemplu de la sistem, tosistem. Aceste nume sunt nume variabile în C și pot avea scoruri subliniate precum_aici, dar nu și spații. În C, numerele sunt fie întregi; numere întregi ca 2 sau 7 acestea se numesc ints, sau numere cu părți zecimale precum 2.5 sau 7.3333 și acestea se numesc float. În ansamblul Imperiilor Stelare, folosim o singură dată plute. Într-o bucată de cod care calculează distanța dintre două locuri. Orice alt număr este un int.
Flota este deci numele unei structuri de date care conține cinci variabile int. Acum asta este pentru o Flotă. Nu știm câte flote va trebui să deținem, așa că vom aloca o cameră generoasă pentru 100 folosind o serie. Gândiți-vă la o structură ca la o masă de cină cu cameră pentru cinci persoane (ints). O serie este ca un rând lung de mese de cină. 100 de mese înseamnă că poate reține 100 x 5 persoane.
Dacă am servi de fapt acele 100 de mese de cină, ar trebui să știm care masă era și să facem asta numerotând. În C, numerotăm întotdeauna elemente de matrice începând cu 0. Prima masă (flotă) este numărul 0, următoarea este 1 și ultima 99. Îmi amintesc întotdeauna ca fiind câte mese pentru cină este această masă de la început? Primul este la început, la fel este 0 de-a lungul.
Așa declarăm flotele (adică mesele noastre de cină).
struct flote de flotă [100];
Citiți acest lucru de la stânga la dreapta. Flota Struct se referă la structura noastră pentru a deține o flotă. Numele flotelor este numele pe care îl dăm tuturor flotelor și [100] ne spune că există flota 100 x struct în variabila flotelor. Fiecare int ocupă 4 locații în memorie (numite octeți), astfel încât o flotă ocupă 20 de octeți și 100 de flote este de 2000 de octeți. Este întotdeauna o idee bună să știm câtă memorie are nevoie de programul nostru pentru a-și păstra datele.
În flota de structuri, fiecare dintre ints conține un număr întreg. Acest număr este stocat în 4 octeți, iar acest interval este de la -2,147.483.647 la 2.147.483.648. De cele mai multe ori vom folosi valori mai mici. Există zece sisteme, atât din sistem, cât și din sistemul tosistem vor deține valori 0 până la 9.
Pe pagina următoare: Sisteme și numere aleatorii
03
din 05
Despre sisteme și numere aleatorii
Fiecare dintre sistemele neutre (1-8) începe cu 15 nave (un număr pe care l-am ales din aer!) Pentru a începe, iar celelalte două (ale voastre: sistemul 0 și oponentul computerului dvs. la sistemul 9) au câte 50 de nave. La fiecare rotație, numărul navelor dintr-un sistem este mărit cu 10% rotunjit. Așadar, după o rundă, dacă nu le mutați, 50 de dvs. vor deveni 55 și fiecare sistem neutru va avea 16 (15 + 1,5 rotunjit). Rețineți că flotele care se mută într-un alt sistem nu cresc numărul.
Creșterea numărului de nave în acest fel poate părea un pic ciudat, dar am făcut-o pentru a menține jocul în mișcare de-a lungul. În loc să aglomereze acest tutorial cu prea multe decizii de proiectare, am scris un articol separat despre deciziile de design ale Star Empires.
Implementarea sistemelor
La început trebuie să generăm toate sistemele și să le punem pe hartă, cu maximum un sistem în fiecare locație, întrucât există 25 de locații pe grila noastră de 5 x 5, vom avea zece sisteme și 15 goale locații. Le generăm folosind funcția GenMapSystems () pe care o vom analiza în pagina următoare.
Un sistem este stocat într-o struct, cu următoarele 4 câmpuri care sunt toate int.
struct system {
int x, y;
numerele de int;
proprietar int;
};
Galaxia (toate cele 10 sisteme) este stocată într-un alt tablou la fel ca în flote, cu excepția cazului în care avem 10 sisteme.
galaxia sistemului struct [10];
Numere aleatorii
Toate jocurile au nevoie de numere aleatorii. C are o funcție încorporată rand () care returnează o intrare aleatoare. Putem forța acest lucru într-o gamă trecând numărul maxim în și folosind% operator. (Modulus). Aceasta este ca aritmetica ceasului, cu excepția cazului în loc de 12 sau 24, trecem într-un număr int numit max.
/ * returnează un număr între 1 și maxim * /
int Aleatoriu (max. int) {
returnare (rand ()% max) +1;
}
Acesta este un exemplu de funcție, care este o bucată de cod învelită în interiorul unui container. Prima linie aici care începe / * și sfârșește * / este un comentariu. Acesta spune ce face codul, dar este ignorat de compilator care citește instrucțiunile C și le transformă în instrucțiuni pe care computerul le înțelege și le poate executa foarte rapid.
- Te întrebi ce este un compilator? Citit Ce este un compilator? (Articol)
O funcție este ca o funcție matematică precum Sin (x). Există trei părți ale acestei funcții:
int aleatoriu (max. int)
Int spune ce tip de număr se returnează (de obicei int sau float). Random este numele funcției și (int max) spune că trecem într-un număr int. O putem folosi astfel:
zaruri int;
zar = aleator (6); / * returnează un număr aleatoriu între 1 și 6 * /
Linia:
returnare (rand ()% max) +1;
Pe pagina următoare: Generarea unei hărți de pornire aleatoare
04
din 05
Generarea unei hărți de pornire aleatoare
Acest cod de mai jos generează harta de pornire. Asta este arătat mai sus.
void GenMapSystems () {
int i, x, y;
for (x = 0; x for (y = 0; y layout [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Găsiți un spațiu gol pentru restul de 8 sisteme * /
pentru (i = 1; eu fac {
x = Aleator (5) -1;
y = aleator (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}
Generarea de sisteme este o problemă de adăugare a sistemelor jucătorului și adversarilor (la 0,0) și (4,4) și apoi adăugarea aleatorie a 8 sisteme în celelalte 23 de locații goale.
Codul folosește trei variabile int definite de linie
int i, x, y;
O variabilă este o locație în memorie care deține o valoare int. Variabilele x și y dețin coordonatele sistemelor și vor păstra o valoare în intervalul 0-4. Variabila i este utilizată pentru numărarea în bucle.
Pentru a plasa cele 8 sisteme aleatorii în grila de 5x5, trebuie să știm dacă o locație are deja un sistem și să împiedicăm ca altul să fie pus în aceeași locație. Pentru aceasta, utilizăm un simplu tablou bidimensional de caractere. Tipul char este un alt tip de variabilă în C și deține un singur caracter precum „B” sau „x”.
Amorsare pe tipuri de date în C
Tipul fundamental de variabile în C sunt int (numere întregi ca 46), char (un singur caracter ca „A”) și float (pentru reținerea numerelor cu punct flotant ca 3.567). Schițele [] sunt pentru listele de deținere a aceluiași element. Deci char [5] [5] definește o listă de liste; un tablou bidimensional de caractere. Gândiți-vă la el ca la 25 de piese Scrabble dispuse într-o grilă de 5 x 5.
Acum ne bucurăm!
Fiecare caracteristică este inițial setată într-un spațiu într-o buclă dublă folosind două pentru instrucțiuni. A for statement are trei părți. O inițializare, o parte de comparație și o schimbare.
for (x = 0; x for (y = 0; y layout [x] [y] = '';
}
- x = 0; Aceasta este partea de inițializare.
- X
- x ++. Aceasta este partea de schimbare. Se adaugă 1 la x.
Deci (pentru (x = 0; x
În interiorul buclei for (x este o buclă for y care face același lucru pentru y. Această buclă y se întâmplă pentru fiecare valoare X. Când X este 0, Y se va bucla de la 0 la 4, când X este 1, Y se va bucla și așa mai departe. Aceasta înseamnă că fiecare dintre cele 25 de locații din tabloul de aspect este inițializat într-un spațiu.
După bucla for, funcția InitSystem este apelată cu cinci parametri int. O funcție trebuie definită înainte de a fi apelată sau compilatorul nu va ști câți parametri ar trebui să aibă. InitSystem are acești cinci parametri.
Pe pagina următoare: Generarea unei hărți de pornire aleatoare continuă ...
05
din 05
Continuă generarea unei hărți de pornire aleatoare
Aceștia sunt parametrii pentru InitSystem.
- systemindex - o valoare de la 0 -9.
- x și y - coordonatele sistemului (0-4).
- numships - câte nave există la acest sistem.
- proprietar. Cine deține un sistem. 0 înseamnă jucător, 9 înseamnă inamic.
Deci linia InitSystem (0,0,0,50,0) inițializează sistemul 0 în locațiile x = -0, y = 0 cu 50 de nave către proprietarul 0.
C are trei tipuri de bucle, în timp ce buclele, pentru bucle și fac bucle și le folosim pentru și facem în funcția GenMapSystems. Aici trebuie să plasăm restul de 8 sisteme undeva în galaxie.
pentru (i = 1; eu fac {
x = Aleator (5) -1;
y = aleator (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}
În acest cod există două bucle cuibărite. Bucla exterioară este o instrucțiune pentru care numără variabila i de la o valoare inițială de 1 la o valoare finală de 8. Vom folosi i pentru a ne referi la sistem. Amintiți-vă că am inițializat deja sistemele 0 și 9, așa că acum inițiem sistemele 1-8.
Totul de la do {la timp (layout [x] [y] este a doua buclă. Sintaxa este face {ceva} în timp ce (condiția este adevărată); Deci, alocăm valori aleatorii la x și y, fiecare valoare în intervalul 0-4. Random (5) returnează o valoare în intervalul 1 la 5, scăzând 1 obține intervalul 0-4.
Nu dorim să punem două sisteme la aceleași coordonate, astfel încât această buclă caută o locație aleatoare care să aibă un spațiu în ea. Dacă există un sistem acolo, aspectul [x] [y] nu va fi un spațiu. Când apelăm InitSystem, aceasta pune o valoare diferită acolo. BTW! = Înseamnă că nu este egal cu și == înseamnă egal cu.
Când codul ajunge la InitSystem după timp (layout [x] [y]! = ''), X și y se referă cu siguranță la un loc în layout care are un spațiu în el. Deci putem să apelăm InitSystem și apoi să ocolim bucla pentru a găsi o locație aleatorie pentru următorul sistem până când toate cele 8 sisteme au fost plasate.
Primul apel către InitSystem stabilește sistemul 0 la locația 0,0 (partea stângă sus a grilei) cu 50 de flote și câștigat de mine. Cel de-al doilea apel inițializează sistemul 9 la locația 4,4 (dreapta jos) cu 50 de flote și este deținut de jucătorul 1. Vom analiza atent ce face InitSystem de fapt în următorul tutorial.
#defini
Aceste linii declară valori literale. Este obișnuit să le punem cu majuscule. Oriunde compilatorul vede MAXFLEETS, folosește valoarea 100. Schimbați-le aici și se aplică peste tot:
- #define WIDTH 80
- #define HEIGHT 50
- #define MAXLEN 4
- #define MAXFLEETS 100
- #define MAXSYSTEMS 10
- #define FIGHTMARKER 999
Concluzie
În acest tutorial, am acoperit variabile și utilizarea int, char și struct pentru a le grupa plus plus pentru a crea o listă. Apoi bucla simplă folosind pentru și face. Dacă examinați codul sursă, aceleași structuri sunt văzute timp după timp.
- pentru (i = 0; i
- pentru (i = 0; i
Tutorial Twowill uită-te la aspectele C menționate în acest tutorial.