01
af 05
Introduktion til tutorials til programmering af spil
Dette er den første af flere spil, der programmerer tutorials i C til komplette begyndere. I stedet for at koncentrere sig om at undervise i C og derefter vise eksempler på programmer, lærer de C ved at give dig komplette programmer (dvs. spil) i C
Hold det enkelt
Det første spil i serien er en konsol (dvs. tekstbaseret spil kaldet Star Empires). Star Empires er et simpelt spil, hvor du skal fange alle 10 systemer i Galaxy, mens du stopper din AI-modstander med at gøre det samme.
Du begynder at eje System 0, mens din fjendes eget system 9. De resterende otte systemer (1-8) starter alle neutrale. Alle systemer starter inden for en 5 parsec x 5 parsec-firkant, så intet system er mere end 6 parsecs fra hinanden. De længste to punkter er (0,0) og (4,4). Ved Pythagoras teorem er den længste afstand fra hinanden af to systemer kvadratroten ((4)2 + (4)2) som er kvadratroden på 32, som er omkring 5.657.
Bemærk, at dette ikke er den endelige version og vil blive ændret. Sidste ændring: 21. august 2011.
Turbaseret og realtid
Spillet er turbaseret, og hver tur du giver ordrer om at flytte et hvilket som helst antal flåder fra ethvert system du ejer til ethvert andet system. Hvis du ejer mere end et system, kan du bestille fleets at flytte fra alle dine systemer til målsystemet. Dette gøres pro rata afrundet, så hvis du ejer tre systemer (1,2,3) med 20, 10 og 5 flåder til stede og du bestiller 10 flåder til system 4, så går 6 fra system 1, 3 fra system 2 og 1 fra system 3. Hver flåde bevæger sig 1 parsec pr. Tur.
Hver tur varer 5 sekunder, selvom du kan ændre hastigheden for at fremskynde den eller sænke den ved at ændre 5 i denne kodelinie til 3 eller 7 eller hvad du end vælger. Se efter denne kodelinje:
onesec = ur () + (5 * CLOCKS_PER_SEC);
C Programmeringsvejledning
Dette spil er blevet programmeret og antager, at du ikke kender nogen C-programmering. Jeg introducerer C-programmeringsfunktioner i denne og de næste to eller tre tutorials, når de skrider frem. Men først skal du bruge en compiler til Windows. Her er to gratis:
- Prøve CC386
- Eller Visual C ++ Express 2010
CC386-artiklen leder dig gennem oprettelse af et projekt. Hvis du installerer den kompilator, er det eneste, du skal gøre, at indlæse Hello World-programmet som beskrevet, kopiere og indsætte kildekoden over eksemplet, gemme det og derefter trykke på F7 for at kompilere det og køre det. Ligeledes skaber Visual C ++ 2010-artiklen et hej verdensprogram. Overskriv det og tryk på F7 for at opbygge Star Empires., F5 for at køre det.
På næste side - At få Star Empires til at virke
02
af 05
At få Star Empires arbejde
At få Star Empires arbejde
Vi er nødt til at gemme information om flåder og systemer i spillet. En flåde er et eller flere skibe med en ordre om at flytte fra det ene system til det andet. Et stjernesystem er et antal planeter, men er mere en abstrakt enhed i dette spil. Vi skal have følgende oplysninger til en flåde.
- Oprindelsessystem (1-10).
- Destinationssystem (1-10)
- Hvor mange skibe (1-mange)
- Vender sig til Arrive
- Hvem flåde er det? 0 = Spiller, 9 = fjende
Vi bruger en struktur i C til at holde dette:
strukturflåde {
int fromsystem;
int tosystem;
int svinger;
int fleetsize
int ejer
};
En struktur er en samling af data, i dette tilfælde 5 numre, som vi manipulerer som et. Hvert nummer har et navn, fx fra system, tosystem. Disse navne er variable navne i C og kan have understregninger som dette, men ikke mellemrum. I C er tal enten heltal; hele tal som 2 eller 7 kaldes disse ints, eller tal med decimaler som 2,5 eller 7,333, og disse kaldes floats. I hele Star Empires bruger vi kun floats én gang. I en kodestykke, der beregner afstanden mellem to steder. Hvert andet nummer er et int.
Så flåde er navnet på en datastruktur, der indeholder fem int-variabler. Nu er det for en flåde. Vi ved ikke, hvor mange flåder vi har brug for, så vi afsætter generøs plads til 100 ved hjælp af en matrix. Tænk på en struktur som et spisebord med plads til fem personer (ints). En matrix er som en lang række middagsborde. 100 borde betyder, at det kan rumme 100 x 5 personer.
Hvis vi faktisk serverede de 100 middagsborde, ville vi have brug for at vide, hvilket bord der var, og det gør vi ved at nummerere. I C tæller vi altid elementer af arrays der starter ved 0. Det første middagsbord (flåde) er nummer 0, det næste er 1 og det sidste er 99. Jeg kan altid huske, at det var, hvor mange middagsborde er denne tabel fra starten? Den første er i starten, så er 0 sammen.
Sådan erklærer vi flåderne (dvs. vores middagsborde).
strukturflådeflåde [100];
Læs dette fra venstre mod højre. Strukturflåde refererer til vores struktur til at indeholde en flåde. Navnflåderne er det navn, vi giver alle flåderne, og [100] fortæller os, at der er 100 x strukturflåde i flådevariablen. Hver int optager 4 placeringer i hukommelsen (kaldet bytes), så en flåde besætter 20 byte og 100 flåder er 2000 byte. Det er altid en god ide at vide, hvor meget hukommelse vores program har til at have sine data.
I struktflåden har hver ints et heltal. Dette nummer er gemt i 4 byte, og området er fra -2,147.483.647 til 2.147.483.648. Det meste af tiden bruger vi mindre værdier. Der er ti systemer, så både fra system og tosystem vil have værdier 0 til 9.
På næste side: Systemer og tilfældige numre
03
af 05
Om systemer og tilfældige numre
Hvert af de neutrale systemer (1-8) starter med 15 skibe (et nummer, jeg pluk ud af luften!) Til at starte med, og de to andre (dit: system 0 og din computermodstander på system 9) har 50 skibe hver. Hver tur øges antallet af skibe ved et system med 10% afrundet. Så efter en omgang, hvis du ikke flytter dem, bliver dine 50 til 55, og hvert af de neutrale systemer har 16 (15 + 1,5 afrundet). Bemærk, at flåder, der flytter til et andet system, ikke stiger i antal.
At øge antallet af skibe på denne måde kan virke lidt underligt, men jeg har gjort det for at holde spillet i bevægelse. Snarere end at rod denne tutorial med for meget om designbeslutninger, skrev jeg en separat artikel om designbeslutningerne fra Star Empires.
Implementeringssystemer
I starten skal vi generere alle systemer og sætte dem på kortet, med maksimalt et system ind hver placering, da der er 25 placeringer på vores 5 x 5 net, vil vi have ti systemer og 15 tomme placeringer. Vi genererer dem ved hjælp af funktionen GenMapSystems (), som vi ser på på næste side.
Et system gemmes i en struktur med følgende 4 felter, der alle er int.
strukt system {
int x, y;
int numfleets;
int ejer
};
Galaksen (alle 10 systemer) er gemt i en anden matrix ligesom med flåder, medmindre vi har 10 systemer.
struktursystemgalakse [10];
Tilfældige tal
Alle spil har brug for tilfældige tal. C har en indbygget funktion rand (), der returnerer et tilfældigt int. Vi kan tvinge dette ind i et interval ved at give det maksimale antal ind og bruge% -operatøren. (Modulus). Dette er ligesom aritemisk ur, medmindre vi i stedet for 12 eller 24 passerer et int-nummer kaldet max.
/ * returnerer et tal mellem 1 og max * /
int Tilfældig (int max) {
afkast (rand ()% max) +1;
}
Dette er et eksempel på en funktion, der er et stykke kode indpakket inde i en container. Den første linje her, der starter / * og slutter * / er en kommentar. Den siger, hvad koden gør, men ignoreres af kompilatoren, der læser C-instruktionerne og omdanner dem til instruktioner, som computeren forstår og kan udføre meget hurtigt.
- Spekulerer på hvad en kompilator er? Læs Hvad er en kompilator? (Genstand)
En funktion er som en matematisk funktion såsom Sin (x). Der er tre dele til denne funktion:
int Tilfældig (int max)
Int'en siger, hvilken type nummer det returnerer (normalt int eller float). Tilfældig er funktionens navn og (int max) siger, at vi indtaster et int-nummer. Vi bruger måske det sådan:
int terninger;
terninger = Tilfældig (6); / * returnerer et tilfældigt tal mellem 1 og 6 * /
Linjen:
afkast (rand ()% max) +1;
På næste side: Generering af et tilfældigt startkort
04
af 05
Generering af et tilfældigt startkort
Denne kode nedenfor genererer startkortet. Det er det vist ovenfor.
ugyldigt 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);
/ * Find et tomt rum til de resterende 8 systemer * /
for (i = 1; jeg gør {
x = Tilfældig (5) -1;
y = Tilfældig (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}
Generering af systemer er et spørgsmål om at tilføje spilleren og modstanderens systemer (ved 0,0) og (4,4) og derefter tilfældigt tilføje 8 systemer i de resterende 23 tomme placeringer.
Koden bruger tre int-variabler defineret af linjen
int i, x, y;
En variabel er en placering i hukommelsen, der har en int-værdi. Variablerne x og y indeholder systemernes koordinater og har en værdi i området 0-4. Variablen i bruges til at tælle i løkker.
For at placere de 8 tilfældige systemer i 5x5-rutenettet skal vi vide, om et sted allerede har et system og forhindre, at et andet placeres på det samme sted. Til dette bruger vi en simpel to-dimensionel række af tegn. Type char er en anden type variabel i C og har et enkelt tegn som 'B' eller 'x'.
Primer på datatyper i C.
Den grundlæggende type variabler i C er int (heltal som 46), char (et enkelt tegn som 'A') og float (for at holde tal med et flydende punkt som 3.567). Arrays [] er til at holde lister over det samme element. Så char [5] [5] definerer en liste over lister; et todimensionelt array af chars. Tænk på det som 25 Scrabble stykker arrangeret i et 5 x 5 gitter.
Nu sløjfer vi!
Hver tegn indstilles oprindeligt til et mellemrum i en dobbelt sløjfe ved hjælp af to til udsagn. A for statement har tre dele. En initialisering, en sammenligningsdel og en ændringsdel.
for (x = 0; x for (y = 0; y layout [x] [y] = '';
}
- x = 0; Dette er initialiseringsdelen.
- x
- x ++. Dette er ændringsdelen. Det tilføjer 1 til x.
Altså (for (x = 0; x
Inde i for (x-loop er en for y-sløjfe, der gør det samme for y. Denne y-loop sker for hver værdi af X. Når X er 0, vil Y sløjfe fra 0 til 4, når X er 1, Y vil loop og så videre. Dette betyder, at hver af de 25 placeringer i layoutarrayen initialiseres til et mellemrum.
Efter for-loop kaldes funktionen InitSystem med fem int-parametre. Der skal defineres en funktion, før den kaldes, ellers vil kompilatoren ikke vide, hvor mange parametre den skal have. InitSystem har disse fem parametre.
På næste side: Generering af et tilfældigt startkort fortsætter ...
05
af 05
Generering af et tilfældigt startkort fortsætter
Dette er parametrene til InitSystem.
- systemindex - en værdi fra 0 til 9.
- x og y - koordinater for systemet (0-4).
- numships - hvor mange skibe der er ved dette system.
- ejer. Hvem ejer et system. 0 betyder spilleren, 9 betyder fjenden.
Så linjen InitSystem (0,0,0,50,0) initialiserer system 0 på placeringer x = -0, y = 0 med 50 skibe til ejer 0.
C har tre typer loop, mens loops, til loops og do loops, og vi bruger til og gør i funktionen GenMapSystems. Her skal vi placere de resterende 8 systemer et sted i galaksen.
for (i = 1; jeg gør {
x = Tilfældig (5) -1;
y = Tilfældig (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}
Der er to indlejrede sløjfer i denne kode. Den ydre sløjfe er en for sætning, der tæller i-variablen fra en startværdi på 1 til en slutværdi på 8. Vi bruger i til at henvise til systemet. Husk, at vi allerede har initialiseret system 0 og 9, så nu initialiserer vi systemer 1-8.
Alt fra do {til mens (layout [x] [y] er den anden loop. Det er syntaks er at gøre {noget} mens (betingelse er sand); Så vi tildeler tilfældige værdier til x og y, hver værdi i området 0-4. Tilfældig (5) returnerer en værdi i området 1 til 5, subtraktion 1 får intervallet 0-4.
Vi ønsker ikke at placere to systemer på de samme koordinater, så denne løkke leder efter et tilfældigt sted, der har et rum i det. Hvis der er et system der, er layoutet [x] [y] ikke et mellemrum. Når vi kalder InitSystem, sætter det en anden værdi der. BTW! = Betyder ikke lig med og == betyder lig med.
Når koden når InitSystem efter et stykke tid (layout [x] [y]! = ''), Henviser x og y bestemt til et sted i layoutet, der har et mellemrum i det. Så vi kan ringe til InitSystem og derefter gå rundt for loop for at finde et tilfældigt sted for det næste system, indtil alle 8 systemer er placeret.
Det første opkald til InitSystem indstiller system 0 på placering 0,0 (øverste venstre hjørne af gitteret) med 50 flåder og vundet af mig. Det andet opkald initialiserer system 9 på placering 4,4 (nederst til højre) med 50 flåder, og det ejes af spiller 1. Vi ser nærmere på, hvad InitSystem faktisk gør i den næste tutorial.
#Definere
Disse linjer erklærer bogstavelige værdier. Det er sædvanligt at sætte dem med store bogstaver. Overalt hvor compileren ser MAXFLEETS, bruger den værdien 100. Skift dem her, og det gælder overalt:
- #definer WIDTH 80
- #definér HØJDE 50
- #definér MAXLEN 4
- #definer MAXFLEETS 100
- #definer MAXSYSTEMS 10
- #definér FIGHTMARKER 999
Konklusion
I denne tutorial har vi dækket variabler og brugen af int, char og struktur til at gruppere dem plus array for at oprette en liste. Derefter enkel looping ved hjælp af for og gør. Hvis du undersøger kildekoden, ses de samme strukturer gang på gang.
- for (i = 0; i
- for (i = 0; i
Tutorial Twowill se på aspekter af C, der er nævnt i denne tutorial.