当前位置:网站首页>C réaliser des jeux de serpents gourmands
C réaliser des jeux de serpents gourmands
2022-07-04 06:04:00 【Vagues et pluie 123】
Les Jeux de serpents gourmands peuvent être considérés comme les lumières de nombreux jeux de petits amis,Aujourd'hui, on va l'utiliser ensembleCLangage Recovery Childhood Classic Games eating Snakes,Avant d'écrire ce jeu,J'ai besoin de savoireasyxConnaissance de la Bibliothèque graphique,Parce que c'est là que la fenêtre du jeu est fournie.
Cet article se concentre sur les fonctionnalités à réaliser lors de l'écriture de ce jeu,En plus, j'écrirai un autre article sur ce jeu communBUGEt ses solutions,.Si vous pouviez écrire la partie,Et s'accrocher à quelque choseBUGLes partenaires peuvent passer à un autre article,Il y a peut - être quelque chose que tu as rencontréBUG.
Réaliser le jeu du serpent gourmand,Nous devons d'abord mettre en place une fenêtre de jeu,UtilisationeasyxBibliothèque graphique,Mettre en place un classique640*480Taille de la fenêtre.La fenêtre est réglée,Ensuite, vous pouvez définir le serpent,Nous utilisons des structures pour définir le type de serpent,Analyser les données dont les serpents ont besoin,Nous devons d'abord savoir combien de temps ce serpent a,Pour faciliter le réglage de la longueur du serpent au début du jeu,Et les statistiques sur la longueur des serpents après la fin du jeu,Alors on va l'utiliser. int n Pour représenter la longueur du serpent.Le serpent doit se déplacer dans une direction,Donc nous devons aussi mettre en place unint direction Pour indiquer la direction dans laquelle le serpent se déplace,Parce qu'il n'y a que quatre directions,Et si on énumérait les quatre directions,La direction du mouvement du serpent est alors représentée par une variable énumérée
//Énumérer les directions
enum direction
{
up = 72,
down = 80,
left = 75,
right = 77
};
Deuxièmement, nous devons connaître les coordonnées de chaque section du corps du serpent , Pour que nous puissions déplacer le serpent à travers les coordonnées , Et dessiner le serpent sur la fenêtre , Parce que le corps du serpent a beaucoup de noeuds , Les coordonnées ont encore x , yDeux valeurs. Nous définissons les coordonnées individuellement comme des structures , Et chaque section du corps correspond à une coordonnée , Nous utilisons des tableaux pour représenter le corps
//Définir les coordonnées du serpent
struct coor
{
int x;
int y;
}coor;
Le serpent final est défini comme suit:
// Définir le type de données du serpent
struct snake
{
int n = 3;
direction site;
coor szb[NUM];
}snake;
//Parmi euxNUM Est la valeur maximale de ce tableau, c'est - à - dire la longueur maximale du corps du serpent ,Auto - DéfinitionDéfinir le type de serpent , Ensuite, nous initialisons le serpent comme suit: ,Écrivez une fonction d'initialisation, initsnake() Supposons que la longueur initiale du serpent soit 3, Direction à gauche, Les coordonnées sont
snake.n = 3;
snake.site = left;
snake.szb[0].x = 320;
snake.szb[0].y = 240;
snake.szb[1].x = 310;
snake.szb[1].y = 240;
snake.szb[2].x = 300;
snake.szb[2].y = 240; Une fois l'initialisation terminée, On va dessiner le serpent sur la fenêtre. ,Écris un Drawsnake() Fonctions,En fait, c'est un cycle, La longueur du serpent est la condition de jugement , Dessinez à partir des coordonnées de la tête de serpent , Dessinez un rectangle ou un cercle , Ici, j'utilise un rectangle
void Drawsnake()
{
for (int i = 0; i < snake.n; i++)
{
rectangle(snake.szb[i].x, snake.szb[i].y, snake.szb[i].x+10, snake.szb[i].y+10);
}
}Une fois le dessin terminé, Le serpent va bouger. ,C'est crucial., Comment faire bouger le serpent ,L'analyse montre, Le principe du mouvement du serpent est que les coordonnées de la tête du serpent changent constamment dans une direction , Le corps change avec la tête du serpent. , Les coordonnées redessinent le corps du serpent à chaque transformation , Parce que le processus est assez rapide , Nous utilisons la vitesse de traitement Sleep() Un peu plus tard , Pour former un taux de trame que nos yeux peuvent reconnaître , Pour voir les serpents se déplacer en continu. . Maintenant que vous changez constamment les coordonnées de la tête de serpent, , Et redessiner le corps du serpent , Alors mettez ces deux fonctions dans la boucle , Le Mouvement du serpent Movesnake().
int main()
{
initgraph(640, 480);
initgame();
while (ture)
{
cleardevice();
Movesnake();
Drawsnake();
Sleep(100);
}
}Comment faire pour que les coordonnées du serpent changent constamment dans une direction ? Ensuite, nous allons examiner attentivement Movesnake(), Nous devons d'abord déterminer dans quelle direction nous allons , Rappelez - vous quand vous définissez un serpent , Une variable de direction est définie siteOui., C'est utile maintenant. .Au moment de l'initialisation, Déplacer l'initialisation de cette variable vers la gauche , Et puis le programme a pris les coordonnées de la tête de serpent xDiminution10, C'est - à - dire qu'il a changé à gauche 10Pixels, Parce que dans la boucle ,Tant quesiteLa valeur de est constante, La tête du serpent se déplace à gauche. , Section 2 les coordonnées du corps se déplacent vers la position initiale de la tête de serpent , Les coordonnées des autres sections du corps se déplacent à tour de rôle vers les coordonnées du corps précédent , Cela permet au serpent de se déplacer , N'oubliez pas d'ajouter cleardevice()Fonctions, Effacer le dernier dessin .
switch (snake.site)
{
case up:
snake.szb[0].y-=10;
break;
case down:
snake.szb[0].y+=10;
break;
case left:
snake.szb[0].x-=10;
break;
case right:
snake.szb[0].x+=10;
break;
}
for (int i = snake.n - 1; i > 0; i--) // Remplacer les coordonnées de chaque section du corps du serpent par celles de la section précédente
{
snake.szb[i].x = snake.szb[i - 1].x;
snake.szb[i].y = snake.szb[i - 1].y;
}Une fois le mouvement du serpent terminé, , Ensuite, le serpent se déplace. , Changement de direction , Si le serpent ne change pas de direction, , C'est impossible de jouer , D'abord, la direction de la tête du serpent ne change que lorsque la touche de direction est enfoncée , Alors définissez d'abord une variable pour recevoir la clé de direction que nous avons pressée , Ensuite, cette clé directionnelle est assignée à la variable directionnelle de la tête de serpent , On va juste écrire un Chdirection()Fonction pour implémenter
void Chdirection()
{
char key;
key = _getch();
switch(key)
{
case up:
if (snake.site != down)
{
snake.site = up;
}
break;
case down:
if (snake.site != up)
{
snake.site = down;
}
break;
case left:
if (snake.site != right)
{
snake.site = left;
}
break;
case right:
if (snake.site != left)
{
snake.site = right;
}
break;
}
}Pourquoi ajouter if Et la Déclaration de jugement , En fait, c'est pour empêcher le serpent de tourner la tête , Ça ne correspond pas à la réalité , Tourner en rond dans l'affichage .

En fait..., On peut faire demi - tour. ,C'est très intéressant, Comme un train. ,Ha Ha!,Si ça vous intéresse, essayez..
Le problème du virage est réglé. , Mais comment le Programme sait - il quand tourner ? Parce que ce programme est en boucle , Ajoutons une phrase de jugement. ,Aveckbhit() Fonction pour détecter si le joueur a appuyé sur la touche , Renvoie True si pressé , Entrez la fonction de direction , Et à l'intérieur pour décider où se tourner , Faux sans pression , Ne pas entrer dans la fonction de direction .
int main()
{
initgraph(640, 480);
initgame();
while (ture)
{
cleardevice();
Movesnake();
Drawsnake();
Sleep(100);
if ( kbhit() )
{
Chdirection();
}
}
}Le petit serpent peut courir , Ensuite, on mangera. , Comment l'effet de la nourriture peut - il être réalisé? ?Encore une fois, Nous devons définir un type de données pour les aliments , D'abord, les coordonnées de la nourriture. , Deuxièmement, l'état actuel de la nourriture. , A - t - on mangé ou non? , On va utiliser boolVariables
// Définir le type de données pour les aliments
struct food
{
int x;
int y;
bool state;
}food;Ensuite, nous retournons à la fonction d'initialisation , Définissez l'état du premier aliment ,Défini comme suit:true, Ça veut dire qu'on a mangé , Pourquoi est - ce réglé pour être mangé? ,Je t'expliquerai plus tard,Nous avons continué à écrireCreatefood(), Pour créer de la nourriture , Est d'attacher des valeurs aléatoires aux coordonnées de la nourriture , Les valeurs aléatoires sont utilisées pour générer des graines , Une fois que nous avons créé un aliment , Ce moment de création , Besoin de changer l'état de la nourriture false, Indique qu'il n'a pas été mangé .
void Creatfood()
{
while (1)
{
food.x = rand() % 62 * 10;
food.y = rand() % 46 * 10;
if (food.x >= 20 && food.y >= 20)
{
food.state = false;
break;
}
}
}
// Ici, j'ajoute des boucles pour ne pas que la nourriture arrive au point limite Quand la nourriture sera - t - elle produite? , C'est l'état de la nourriture. true Ça veut dire quand on est mangé. , C'est pour ça qu'au début, on met l'état de la nourriture à true, C'est de créer un aliment pour commencer. . Encore une fois, utilisez une déclaration de jugement.
int main()
{
initgraph(LENGTH, WIDTH);
initgame();
while (1)
{
if (food.state)
{
Creatfood();
}
cleardevice();
Movesnake();
Drawsnake();
Drawfood();
Sleep(100);
EndBatchDraw();
if (_kbhit())
{
Chdirection();
}
}
La nourriture a été créée , C'est la dernière étape. , C'est le processus de réalisation de la nourriture. , Écrivez un Eatfood(), Quand les coordonnées de la tête de serpent coïncident avec celles de la nourriture, on peut manger , Puis l'état de la nourriture change true, La longueur du serpent plus 1.
void Eatfood()
{
if (snake.szb[0].x == food.x && snake.szb[0].y == food.y)
{
snake.n++;
food.state = true;
}
}C'est tout., La simple cupidité du serpent est terminée. , Il y a aussi un dessin de la nourriture , C'est assez simple , Faites - le vous - mêmes. .
int main()
{
initgraph(LENGTH, WIDTH);
initgame();
while (1)
{
if (food.state)
{
Creatfood();
}
cleardevice();
Movesnake();
Drawsnake();
Drawfood();
Eatfood();
Sleep(100);
if (_kbhit())
{
Chdirection();
}
}
getchar();
}边栏推荐
- 如何获取el-tree中所有节点的父节点
- Overview of relevant subclasses of beanfactorypostprocessor and beanpostprocessor
- 注释与注解
- Actual cases and optimization solutions of cloud native architecture
- 接地继电器DD-1/60
- Error CVC complex type 2.4. a: Invalid content beginning with element 'base extension' was found. Should start with one of '{layoutlib}'.
- LayoutManager布局管理器:FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout、BoxLayout
- ANSYS command
- How to expand all collapse panels
- My NVIDIA developer journey - optimizing graphics card performance
猜你喜欢

One click filtering to select Baidu online disk files

How to get the parent node of all nodes in El tree

Win10 clear quick access - leave no trace

AWT introduction

Json Web token - jwt vs. Traditional session login Authentication

A little understanding of GSLB (global server load balance) technology

剑指 Offer II 038. 每日温度

QT get random color value and set label background color code

1480. Dynamic sum of one-dimensional array

win10清除快速访问-不留下痕迹
随机推荐
buuctf-pwn write-ups (8)
C语言练习题(递归)
FRP intranet penetration, reverse proxy
js arguments参数使用和详解
buuctf-pwn write-ups (8)
Gridview出现滚动条,组件冲突,如何解决
分布式CAP理论
19. Framebuffer application programming
lightroom 导入图片灰色/黑色矩形 多显示器
Notes and notes
How to avoid JVM memory leakage?
Detectron: train your own data set -- convert your own data format to coco format
JS get the attribute values nested in the object
Webrtc quickly set up video call and video conference
Detectron:训练自己的数据集——将自己的数据格式转换成COCO格式
JS arguments parameter usage and explanation
Accidentally deleted the data file of Clickhouse, can it be restored?
Kubernets first meeting
How much computing power does transformer have
(4) Canal multi instance use