01
av 05
Introduksjon til opplæringen for programmering av spill
Dette er den første av flere spill som programmerer opplæringsprogrammer i C for komplette nybegynnere. I stedet for å konsentrere deg om å undervise i C, så viser du eksempler på programmer de lærer C ved å gi deg komplette programmer (dvs. spill) i C
Holder det enkelt
Det første spillet i serien er en konsoll (dvs. tekstbasert spill kalt Star Empires). Star Empires er et enkelt spill der du må fange opp alle 10 systemene i Galaxy mens du stopper AI-motstanderen å gjøre det samme.
Du begynner å eie System 0, mens fiendens eget system 9. De resterende åtte systemene (1-8) starter alle nøytrale. Alle systemene starter i løpet av en 5 parsec x 5 parsec-kvadrat, så intet system er mer enn 6 parsecs fra hverandre. De lengste to poengene er (0,0) og (4,4). Med Pythagoras teorem er den lengste avstand fra hverandre fra to systemer kvadratroten ((4)2 + (4)2) som er kvadratroten på 32 som er omtrent 5,657.
Vær oppmerksom på at dette ikke er den endelige versjonen og vil bli endret. Siste endring: 21. august 2011.
Turnbasert og sanntid
Spillet er turbasert og hver tur gir du ordre om å flytte et hvilket som helst antall flåter fra ethvert system du eier til et hvilket som helst annet system. Hvis du eier mer enn ett system, kan du bestille flåter å flytte fra alle systemene dine til målsystemet. Dette gjøres pro rata avrundet, så hvis du eier tre systemer (1,2,3) med 20, 10 og 5 flåter til stede og du bestiller 10 Fleets til å gå til system 4 så vil 6 gå fra system 1, 3 fra system 2 og 1 fra system 3. Hver flåte beveger seg 1 parsec per tur.
Hver sving varer 5 sekunder, selv om du kan endre hastigheten for å øke hastigheten eller senke den ved å endre 5 i denne kodelinjen til 3 eller 7 eller hva du enn velger. Se etter denne kodelinjen:
onesec = klokke () + (5 * CLOCKS_PER_SEC);
C Programmeringsveiledning
Dette spillet har blitt programmert og forutsetter at du ikke kjenner noen C-programmering. Jeg skal introdusere C-programmeringsfunksjoner i denne og de neste to-tre opplæringsprogrammene når de skrider frem. Først selv om du trenger en kompilator for Windows. Her er to gratis:
- Prøve CC386
- Eller Visual C ++ 2010 Express
CC386-artikkelen leder deg gjennom å lage et prosjekt. Hvis du installerer den kompilatoren, er alt du trenger å gjøre å laste inn Hello World-programmet som beskrevet, kopiere og lime inn kildekoden over eksemplet, lagre den og deretter trykke på F7 for å kompilere den og kjøre den. På samme måte skaper Visual C ++ 2010-artikkelen et hei-program. Overskriv det og trykk F7 for å bygge Star Empires., F5 for å kjøre det.
På neste side - Gjør Star Empires Work
02
av 05
Gjør Star Empires Work
Gjør Star Empires Work
Vi må lagre informasjon om flåter og systemer i spillet. En flåte er ett eller flere skip med ordre om å gå fra et system til et annet. Et stjernesystem er et antall planeter, men er mer en abstrakt enhet i dette spillet. Vi må ha følgende informasjon for en flåte.
- Opprinnelsessystem (1-10).
- Destinasjonssystem (1-10)
- Hvor mange skip (1-mange)
- Vender seg til å komme
- Hvem flåte er det? 0 = Spiller, 9 = fiende
Vi vil bruke en struktur i C for å holde dette:
strukturflåte {
int fromsystem;
int tosystem;
int svinger;
int fleetsize;
int eier;
};
En struktur er en samling av data, i dette tilfellet 5 tall som vi manipulerer som ett. Hvert nummer har et navn, f.eks. Fra system, tosystem. Disse navnene er variable navn i C og kan ha understrekinger som_dette, men ikke mellomrom. I C er tall enten heltall; hele tall som 2 eller 7 kalles disse, eller tall med desimaler som 2,5 eller 7,333 og disse kalles flyter. I hele Star Empires bruker vi bare flottører en gang. I en kodebit som beregner avstanden mellom to steder. Hvert annet nummer er et int.
Så flåten er navnet på en datastruktur som inneholder fem int-variabler. Nå er det for en flåte. Vi vet ikke hvor mange flåter vi trenger å ha, så vi tildeler raus plass til 100 ved hjelp av en matrise. Tenk på en struktur som et middagsbord med plass til fem personer (ints). En matrise er som en lang rekke middagsbord. 100 bord betyr at den kan inneholde 100 x 5 personer.
Hvis vi faktisk serverte de 100 middagsbordene, måtte vi vite hvilket bord som var hvilket, og vi gjør dette ved å nummerere. I C teller vi alltid elementer av matriser som begynner på 0. Det første middagsbordet (flåten) er nummer 0, det neste er 1 og det siste er 99. Jeg husker det alltid som hvor mange middagsbord er dette bordet fra starten av? Den første er i starten, så er 0 med.
Slik erklærer vi flåtene (dvs. middagsbordene våre).
strukturflåteflåter [100];
Les dette fra venstre til høyre. Strukturflåte refererer til strukturen vår for å holde en flåte. Navneflåtene er navnet vi gir til alle flåtene og [100] forteller oss at det er 100 x strukturflåter i flåtenes variabel. Hver int har 4 steder i minnet (kalt byte), slik at en flåte okkuperer 20 byte og 100 flåter er 2000 byte. Det er alltid en god idé å vite hvor mye minne programmet vårt trenger for å oppbevare dataene.
I struktflåten har hver av ints et heltallstall. Dette tallet er lagret i 4 byte, og området for dette er fra -2 1447 483 647 til 2 147 473 648. Det meste av tiden bruker vi mindre verdier. Det er ti systemer, så både fra system og tosystem vil holde verdiene 0 til 9.
På neste side: Systemer og tilfeldige tall
03
av 05
Om systemer og tilfeldige tall
Hvert av de nøytrale systemene (1-8) starter med 15 skip (et nummer jeg plukket ut av luften!) Til å begynne med, og de to andre (ditt: system 0 og datamaskinmotstanderen på system 9) har 50 skip hver. Hver tur øker antall skip ved et system med 10% avrundet. Så etter en sving hvis du ikke flytter dem, blir 50 dine 55 og hvert av nøytralsystemene har 16 (15 + 1,5 avrundet). Merk at flåter som flytter til et annet system ikke øker i antall.
Å øke antall skip på denne måten kan virke litt rart, men jeg har gjort det for å holde spillet i bevegelse. I stedet for å tøffe denne opplæringen med for mye designbeslutninger, skrev jeg en egen artikkel om designvedtakene til Star Empires.
Implementeringssystemer
I starten må vi generere alle systemene og sette dem på kartet, med maksimalt ett system i hvert sted, ettersom det er 25 lokasjoner på vårt 5 x 5 nett, vil vi ha ti systemer og 15 tomme steder. Vi genererer dem ved å bruke funksjonen GenMapSystems () som vi ser på på neste side.
Et system er lagret i en struktur, med følgende 4 felt som alle er int.
strukt system {
int x, y;
int numfleets;
int eier;
};
Galaksen (alle 10 systemene) er lagret i en annen gruppe akkurat som med flåter, bortsett fra at vi har 10 systemer.
strukt system galakse [10];
Tilfeldige tall
Alle spill trenger tilfeldige tall. C har en innebygd funksjon rand () som returnerer et tilfeldig int. Vi kan tvinge dette til et område ved å gi det maksimale antallet inn og bruke% -operatøren. (Modulus). Dette er som en aritematisk klokke, bortsett fra at i stedet for 12 eller 24 passerer vi et int-tall som heter maks.
/ * returnerer et tall mellom 1 og maks * /
int Tilfeldig (int maks) {
avkastning (rand ()% maks) +1;
}
Dette er et eksempel på en funksjon som er et kodestykke pakket inn i en container. Den første linjen her som starter / * og slutt * / er en kommentar. Den sier hva koden gjør, men blir ignorert av kompilatoren som leser C-instruksjonene og konverterer dem til instruksjoner som datamaskinen forstår og kan utføre veldig raskt.
- Lurer du på hva en kompilator er? Lese Hva er en kompilator? (Artikkel)
En funksjon er som en matematisk funksjon som Sin (x). Det er tre deler til denne funksjonen:
int Tilfeldig (int maks)
Intet sier hvilken type nummer det returnerer (vanligvis int eller float). Tilfeldig er navnet på funksjonen og (int maks) sier at vi sender inn et int-tall. Vi kan bruke den slik:
int terninger;
terninger = Tilfeldig (6); / * returnerer et tilfeldig tall mellom 1 og 6 * /
Linjen:
avkastning (rand ()% maks) +1;
På neste side: Genererer et tilfeldig startkart
04
av 05
Genererer et tilfeldig startkart
Denne koden nedenfor genererer startkartet. Det er det som er vist ovenfor.
ugyldig 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);
/ * Finn et tomt rom for de resterende 8 systemene * /
for (i = 1; jeg gjør {
x = Tilfeldig (5) -1;
y = Tilfeldig (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}
Generating Systems handler om å legge til spilleren og motstandernes systemer (på 0,0) og (4,4) og deretter tilfeldig legge til 8 systemer på de resterende 23 tomme stedene.
Koden bruker tre int-variabler definert av linjen
int i, x, y;
En variabel er et sted i minnet som har en int-verdi. Variablene x og y har koordinatene til systemene og vil ha en verdi i området 0-4. Variabelen i brukes til å telle i løkker.
For å plassere de 8 tilfeldige systemene i 5x5-rutenettet må vi vite om et sted allerede har et system og forhindre at et annet blir plassert på samme sted. For dette bruker vi et enkelt todimensjonalt utvalg av tegn. Type char er en annen type variabel i C og har et enkelt tegn som 'B' eller 'x'.
Grunning på datatyper i C.
Den grunnleggende typen variabler i C er int (heltall som 46), røye (et enkelt tegn som 'A') og flyt (for å holde tall med flytende punkt som 3.567). Arrays [] er for å holde lister over samme element. Så char [5] [5] definerer en liste over lister; et todimensjonalt utvalg av karer. Tenk på det som 25 Scrabble stykker arrangert i et 5 x 5 rutenett.
Nå sløyfer vi!
Hver røyte er opprinnelig satt til et mellomrom i en dobbel sløyfe ved å bruke to for utsagn. A for statement har tre deler. En initialisering, en sammenligningsdel og en endringsdel.
for (x = 0; x for (y = 0; y layout [x] [y] = '';
}
- x = 0; Dette er initialiseringsdelen.
- x
- x ++. Dette er endringsdelen. Det legger til 1 til x.
Altså (for (x = 0; x
Inne i for (x-loop er en for y-loop som gjør det samme for y. Denne y-sløyfen skjer for hver verdi av X. Når X er 0, vil Y sløyfe fra 0 til 4, når X er 1, vil Y sløyfe og så videre. Dette betyr at hver og en av de 25 plasseringene i layoutoppstillingen initialiseres til et mellomrom.
Etter for-loopen kalles funksjonen InitSystem med fem int-parametere. En funksjon må defineres før den ringes, ellers vil ikke kompilatoren vite hvor mange parametere den skal ha. InitSystem har disse fem parametrene.
På neste side: Genererer et tilfeldig startkart fortsetter ...
05
av 05
Generering av et tilfeldig startkart fortsetter
Dette er parameterne til InitSystem.
- systemindex - en verdi fra 0 til 9.
- x og y - koordinater for systemet (0-4).
- numships - hvor mange skip det er med dette systemet.
- Eieren. Hvem eier et system. 0 betyr spilleren, 9 betyr fienden.
Så InitSystem (0,0,0,50,0) initialiserer system 0 på lokasjoner x = -0, y = 0 med 50 skip til eier 0.
C har tre typer løkker, mens løkker, for løkker og gjør løkker, og vi bruker for og gjør i funksjonen GenMapSystems. Her må vi plassere de resterende 8 systemene et sted i galaksen.
for (i = 1; jeg gjør {
x = Tilfeldig (5) -1;
y = Tilfeldig (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}
Det er to nestede løkker i denne koden. Den ytre sløyfen er en for setning som teller opp variabelen i fra en begynnelsesverdi på 1 til en sluttverdi på 8. Vi bruker i for å referere til systemet. Husk at vi allerede har initialisert system 0 og 9, så nå initialiserer vi system 1-8.
Alt fra do {til stund (layout [x] [y] er den andre sløyfen. Det er syntaks er å gjøre {noe} mens (betingelsen er sann); Så vi tildeler tilfeldige verdier til x og y, hver verdi i området 0-4. Tilfeldig (5) returnerer en verdi i området 1 til 5, ved å trekke fra 1 får området 0-4.
Vi ønsker ikke å plassere to systemer på de samme koordinatene, så denne sløyfen leter etter et tilfeldig sted som har et mellomrom. Hvis det er et system der, vil oppsettet [x] [y] ikke være et mellomrom. Når vi kaller InitSystem, setter det en annen verdi der. BTW! = Betyr ikke lik og == betyr lik.
Når koden når InitSystem etter en gang (layout [x] [y]! = ''), Viser x og y definitivt til et sted i layout som har et mellomrom i seg. Så vi kan ringe InitSystem og deretter gå rundt for loop for å finne et tilfeldig sted for neste system til alle de 8 systemene er plassert.
Den første samtalen til InitSystem setter opp system 0 på plassering 0,0 (øverst til venstre på nettet) med 50 flåter og vunnet av meg. Den andre samtalen initialiserer system 9 på plassering 4,4 (nede til høyre) med 50 flåter, og det eies av spiller 1. Vi vil se nærmere på hva InitSystem faktisk gjør i neste opplæring.
#definere
Disse linjene erklærer bokstavelige verdier. Det er vanlig å sette dem med store bokstaver. Overalt hvor kompilatoren ser MAXFLEETS, bruker den verdien 100. Endre dem her, og det gjelder overalt:
- #definer WIDTH 80
- #definere HØYDE 50
- #definere MAXLEN 4
- #definer MAXFLEETS 100
- #define MAXSYSTEMS 10
- #definere FIGHTMARKER 999
Konklusjon
I denne opplæringen har vi dekket variabler og bruk av int, char og struct for å gruppere dem pluss array for å lage en liste. Så enkel sløyfe ved å bruke for og gjøre. Hvis du undersøker kildekoden, blir de samme strukturene sett gang på gang.
- for (i = 0; i
- for (i = 0; i
Opplæring Twowill se på aspekter ved C som er nevnt i denne opplæringen.