Comment programmer des jeux en C. Tutorial One

01

sur 05

Introduction aux didacticiels de programmation de jeux

Ceci est le premier de plusieurs tutoriels de programmation de jeux en C pour les débutants complets. Au lieu de se concentrer sur l'enseignement de C, puis de montrer des exemples de programmes qu'ils enseignent en C en vous fournissant des programmes complets (par exemple des jeux) en C

Garder les choses simples

Le premier jeu de la série est une console (c'est-à-dire un jeu basé sur du texte appelé Star Empires). Star Empires est un jeu simple où vous devez capturer les 10 systèmes de la galaxie tout en empêchant votre adversaire IA de faire de même.

Vous commencez à posséder le système 0, tandis que votre ennemi possède le système 9. Les huit systèmes restants (1-8) commencent tous au neutre. Tous les systèmes démarrent dans un carré de 5 parsec x 5 parsec, donc aucun système n'est à plus de 6 parsecs. Les deux points les plus éloignés sont (0,0) et (4,4). Selon le théorème de Pythagore, la distance la plus éloignée de deux systèmes est la racine carrée ((4)

instagram viewer
2 + (4)2) qui est la racine carrée de 32 qui est d'environ 5,657.

Veuillez noter que ce n'est pas la version finale et sera modifiée. Dernière modification: 21 août 2011.

Tour par tour et en temps réel

Le jeu est au tour par tour et à chaque tour, vous donnez l'ordre de déplacer un nombre illimité de flottes de n'importe quel système que vous possédez vers un autre système. Si vous possédez plus d'un système, vous pouvez ordonner aux flottes de passer de tous vos systèmes au système cible. Cela se fait au prorata arrondi, donc si vous possédez trois systèmes (1, 2, 3) avec 20, 10 et 5 flottes présentes et vous commandez 10 flottes pour aller au système 4 puis 6 iront du système 1, 3 du système 2 et 1 du système 3. Chaque flotte se déplace de 1 parsec par tour.

Chaque tour dure 5 secondes, mais vous pouvez modifier la vitesse pour l'accélérer ou la ralentir en changeant le 5 de cette ligne de code en 3 ou 7 ou tout ce que vous choisissez. Recherchez cette ligne de code:

onesec = horloge () + (5 * CLOCKS_PER_SEC);

Tutoriel de programmation C

Ce jeu a été programmé et suppose que vous ne connaissez aucune programmation C. J'introduirai les fonctionnalités de programmation C dans ce tutoriel et les deux ou trois prochains tutoriels au fur et à mesure de leur progression. Tout d'abord, vous aurez besoin d'un compilateur pour Windows. En voici deux gratuits:

  • Essayer CC386
  • Ou Visual C ++ 2010 Express

L'article CC386 vous guide à travers la création d'un projet. Si vous installez ce compilateur, il vous suffit de charger le programme Hello World comme décrit, de copier et coller le code source sur l'exemple, de l'enregistrer, puis d'appuyer sur F7 pour le compiler et l'exécuter. De même, l'article Visual C ++ 2010 crée un programme Hello World. Remplacez-le et appuyez sur F7 pour construire Star Empires., F5 pour l'exécuter.

Sur la page suivante - Faire fonctionner Star Empires

02

sur 05

Faire fonctionner Star Empires

Faire fonctionner Star Empires

Nous devons stocker des informations sur les flottes et les systèmes du jeu. Une flotte est un ou plusieurs navires ayant l'ordre de passer d'un système à un autre. Un système stellaire est un certain nombre de planètes mais est plus une entité abstraite dans ce jeu. Nous devons conserver les informations suivantes pour une flotte.

  • Système d'origine (1-10).
  • Système de destination (1-10)
  • Combien de navires (1-Many)
  • Tourne pour arriver
  • À qui appartient cette flotte? 0 = joueur, 9 = ennemi

Nous utiliserons une structure en C pour tenir ceci:

struct flotte {
int fromsystem;
int tosystem;
int tours;
int Fleetsize;
int propriétaire;
};

Une structure est une collection de données, dans ce cas 5 nombres que nous manipulons comme un seul. Chaque numéro a un nom, par exemple fromsystem, tosystem. Ces noms sont des noms de variables en C et peuvent avoir des traits de soulignement comme_ceci mais pas des espaces. En C, les nombres sont soit entiers; des nombres entiers comme 2 ou 7 sont appelés des entiers, ou des nombres avec des parties décimales comme 2,5 ou 7,3333 et ce sont des flottants. Dans l'ensemble de Star Empires, nous n'utilisons les flotteurs qu'une seule fois. Dans un morceau de code calculant la distance entre deux endroits. Tout autre nombre est un entier.

Donc, flotte est le nom d'une structure de données contenant cinq variables int. Maintenant, c'est pour une flotte. Nous ne savons pas combien de flottes nous devrons détenir, nous allons donc allouer de l'espace généreux pour 100 en utilisant un tableau. Pensez à une structure comme à une table de dîner avec de la place pour cinq personnes (pouces). Un tableau est comme une longue rangée de tables de dîner. 100 tables signifie qu'il peut contenir 100 x 5 personnes.

Si nous servions réellement ces 100 tables de dîner, nous aurions besoin de savoir quelle table était laquelle et nous le faisons en numérotant. En C, nous numérotons toujours les éléments des tableaux à partir de 0. La première table de dîner (flotte) est le numéro 0, la suivante est 1 et la dernière est 99. Je m'en souviens toujours comme étant combien de tables de dîner est cette table depuis le début? Le premier est au début, donc 0 le long.

C'est ainsi que nous déclarons les flottes (c'est-à-dire nos tables de dîner).

structurer les flottes de flottes [100];

Lisez ceci de gauche à droite. La flotte Struct se réfère à notre structure pour détenir une flotte. Le nom des flottes est le nom que nous donnons à toutes les flottes et [100] nous dit qu'il y a 100 x struct flotte dans la variable des flottes. Chaque int occupe 4 emplacements en mémoire (appelés octets), donc une flotte occupe 20 octets et 100 flottes est de 2000 octets. C'est toujours une bonne idée de savoir de combien de mémoire notre programme a besoin pour contenir ses données.

Dans la flotte struct, chacun des entiers possède un nombre entier. Ce nombre est stocké sur 4 octets et la plage est comprise entre -2 147 483 647 et 2 147 483 648. La plupart du temps, nous utilisons des valeurs plus petites. Il existe dix systèmes, donc fromsystem et tosystem contiendront les valeurs 0 à 9.

Sur la page suivante: Systèmes et nombres aléatoires

03

sur 05

À propos des systèmes et des nombres aléatoires

Chacun des systèmes neutres (1-8) commence par 15 navires (un nombre que j'ai choisi dans les airs!) Pour commencer et les deux autres (le vôtre: système 0 et votre adversaire informatique au système 9) ont 50 navires chacun. À chaque tour, le nombre de navires dans un système augmente de 10% arrondi au minimum. Donc, après un tour si vous ne les déplacez pas, vos 50 deviendront 55 et chacun des systèmes neutres aura 16 (15 + 1,5 arrondis). Notez que les flottes se déplaçant vers un autre système n'augmentent pas en nombre.

Augmenter le nombre de navires de cette façon peut sembler un peu étrange, mais je l'ai fait pour que le jeu continue. Plutôt que d'encombrer ce tutoriel avec trop de décisions de conception, j'ai écrit un article séparé sur les décisions de conception de Star Empires.

Systèmes d'implémentation

Au début, nous devons générer tous les systèmes et les mettre sur la carte, avec un maximum d'un système dans chaque emplacement, comme il y a 25 emplacements sur notre grille 5 x 5, nous aurons dix systèmes et 15 vides Emplacements. Nous les générons en utilisant la fonction GenMapSystems () que nous verrons à la page suivante.

Un système est stocké dans une structure, avec les 4 champs suivants qui sont tous int.

système de structure {
int x, y;
int numfleets;
int propriétaire;
};

La galaxie (tous les 10 systèmes) est stockée dans un autre réseau comme avec les flottes, sauf que nous avons 10 systèmes.

galaxie du système struct [10];

Nombres aléatoires

Tous les jeux ont besoin de nombres aléatoires. C a une fonction intégrée rand () qui retourne un int aléatoire. Nous pouvons forcer cela dans une plage en passant le nombre maximum dans et en utilisant l'opérateur%. (Module). C'est comme l'arithmétique de l'horloge, sauf qu'au lieu de 12 ou 24, nous passons un nombre entier appelé max.

/ * renvoie un nombre compris entre 1 et max * /
int Aléatoire (int max) {
return (rand ()% max) +1;
}

Ceci est un exemple de fonction qui est un morceau de code enveloppé dans un conteneur. La première ligne ici qui commence / * et fin * / est un commentaire. Il indique ce que fait le code mais est ignoré par le compilateur qui lit les instructions C et les convertit en instructions que l'ordinateur comprend et peut exécuter très rapidement.

  • Vous vous demandez ce qu'est un compilateur? Lis Qu'est-ce qu'un compilateur? (Article)

Une fonction est comme une fonction mathématique telle que Sin (x). Cette fonction comprend trois parties:

int Aléatoire (int max)

L'int indique le type de nombre qu'il renvoie (généralement int ou float). Aléatoire est le nom de la fonction et (int max) indique que nous transmettons un nombre entier. Nous pourrions l'utiliser comme ceci:

int dés;
dés = aléatoire (6); / * renvoie un nombre aléatoire compris entre 1 et 6 * /

La ligne:

return (rand ()% max) +1;

Sur la page suivante: Génération d'une carte de départ aléatoire

04

sur 05

Génération d'une carte de départ aléatoire

Carte de Star Empires

Ce code ci-dessous génère la carte de départ. C'est cela montré ci-dessus.

void GenMapSystems () {
int i, x, y;
pour (x = 0; x pour (y = 0; disposition y [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Trouvez un espace vide pour les 8 systèmes restants * /
pour (i = 1; je fais {
x = aléatoire (5) -1;
y = aléatoire (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}

Générer des systèmes consiste à ajouter les systèmes du joueur et des adversaires (à 0,0) et (4,4), puis à ajouter au hasard 8 systèmes dans les 23 emplacements vides restants.

Le code utilise trois variables int définies par la ligne

int i, x, y;

Une variable est un emplacement en mémoire qui contient une valeur int. Les variables x et y contiennent les coordonnées des systèmes et contiendront une valeur dans la plage 0-4. La variable i est utilisée pour compter en boucles.

Pour placer les 8 systèmes aléatoires dans la grille 5x5, nous devons savoir si un emplacement a déjà un système et empêcher qu'un autre ne soit placé au même endroit. Pour cela, nous utilisons un simple tableau bidimensionnel de caractères. Le type char est un autre type de variable en C et contient un seul caractère comme «B» ou «x».

Introduction aux types de données en C

Les types fondamentaux de variables en C sont int (entiers comme 46), char (un seul caractère comme 'A') et float (pour contenir des nombres avec virgule flottante comme 3,567). Les tableaux [] sont destinés à contenir des listes du même élément. Donc char [5] [5] définit une liste de listes; un tableau bidimensionnel de caractères. Pensez-y comme 25 morceaux de Scrabble disposés dans une grille 5 x 5.

Maintenant, nous bouclons!

Chaque caractère est initialement défini sur un espace dans une double boucle en utilisant deux instructions for. Une déclaration for comporte trois parties. Une initialisation, une partie de comparaison et une partie de changement.

pour (x = 0; x pour (y = 0; disposition y [x] [y] = '';
}

  • x = 0; Ceci est la partie d'initialisation.
  • X
  • x ++. Ceci est la partie changement. Il ajoute 1 à x.

Donc (pour (x = 0; x

À l'intérieur de la boucle for (x se trouve une boucle for y qui fait de même pour y. Cette boucle y se produit pour chaque valeur de X. Lorsque X est 0, Y bouclera de 0 à 4, lorsque X est 1, Y bouclera et ainsi de suite. Cela signifie que chacun des 25 emplacements du tableau de disposition est initialisé dans un espace.

Après la boucle for, la fonction InitSystem est appelée avec cinq paramètres int. Une fonction doit être définie avant d'être appelée, sinon le compilateur ne saura pas combien de paramètres elle doit avoir. InitSystem a ces cinq paramètres.

Sur la page suivante: La génération d'une carte de départ aléatoire se poursuit ...

05

sur 05

La génération d'une carte de départ aléatoire se poursuit

Ce sont les paramètres d'InitSystem.

  • systemindex - une valeur de 0 à 9.
  • coordonnées x et y du système (0-4).
  • numships - combien de navires il y a dans ce système.
  • propriétaire. À qui appartient un système. 0 signifie le joueur, 9 signifie l'ennemi.

Ainsi, la ligne InitSystem (0,0,0,50,0) initialise le système 0 aux emplacements x = -0, y = 0 avec 50 navires au propriétaire 0.

C a trois types de boucles, tandis que les boucles, pour les boucles et les boucles do et nous utilisons pour et faisons dans la fonction GenMapSystems. Ici, nous devons placer les 8 systèmes restants quelque part dans la galaxie.

pour (i = 1; je fais {
x = aléatoire (5) -1;
y = aléatoire (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}

Il y a deux boucles imbriquées dans ce code. La boucle extérieure est une instruction for qui compte la variable i d'une valeur initiale de 1 à une valeur finale de 8. Nous utiliserons i pour faire référence au système. N'oubliez pas que nous avons déjà initialisé les systèmes 0 et 9, alors maintenant nous initialisons les systèmes 1-8.

Tout, du do {au while (layout [x] [y] est la deuxième boucle. Sa syntaxe est do {quelque chose} while (la condition est vraie); Nous attribuons donc des valeurs aléatoires à x et y, chaque valeur dans la plage 0-4. Random (5) renvoie une valeur comprise entre 1 et 5, la soustraction de 1 donne la plage 0-4.

Nous ne voulons pas mettre deux systèmes aux mêmes coordonnées, donc cette boucle recherche un emplacement aléatoire qui contient un espace. S'il y a un système, la disposition [x] [y] ne sera pas un espace. Lorsque nous appelons InitSystem, cela met une valeur différente ici. BTW! = Signifie non égal à et == signifie égal à.

Lorsque le code atteint l'InitSystem après while (layout [x] [y]! = ''), X et y se réfèrent définitivement à un endroit dans la disposition qui contient un espace. Nous pouvons donc appeler InitSystem puis faire le tour de la boucle for pour trouver un emplacement aléatoire pour le prochain système jusqu'à ce que les 8 systèmes aient été placés.

Le premier appel à InitSystem met en place le système 0 à l'emplacement 0,0 (en haut à gauche de la grille) avec 50 flottes et gagné par moi. Le deuxième appel initialise le système 9 à l'emplacement 4,4 (en bas à droite) avec 50 flottes et il appartient au joueur 1. Nous verrons de près ce que fait réellement InitSystem dans le prochain tutoriel.

#définir

Ces lignes déclarent des valeurs littérales. Il est d'usage de les mettre en majuscules. Partout où le compilateur voit MAXFLEETS, il utilise la valeur 100. Modifiez-les ici et cela s'applique partout:

  • #define WIDTH 80
  • #define HEIGHT 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #define FIGHTMARKER 999

Conclusion

Dans ce didacticiel, nous avons couvert les variables et l'utilisation de int, char et struct pour les regrouper plus tableau pour créer une liste. Puis boucle simple en utilisant for et do. Si vous examinez le code source, les mêmes structures sont visibles à maintes reprises.

  • pour (i = 0; i
  • pour (i = 0; i

Tutoriel Twowill examinera les aspects de C mentionnés dans ce tutoriel.

instagram story viewer