Entrez vite ! ! ! Apprenez étape par étape à manger des serpents

1. Cadre général

Insérer la description de l'image ici
C'est le même que le jeu écrit précédemment. Le cadre général est comme ceci (il y a un bref répertoire). Nous encapsulons principalement la fonction play().
Puisque nous avons référencé notre propre fichier d'en-tête "game.h", nous pouvons mettre les instructions de prétraitement des fonctions de bibliothèque que nous souhaitons référencer dans le fichier d'en-tête "game.h".
Si vous faites attention, vous constaterez que le tableau que nous avons défini est composé de 20 lignes et 40 colonnes, car lorsque nous avons conçu la carte, la carte était entourée de « - » et de « | ». Vous pouvez constater que ce dernier est deux fois plus long. Pour former une carte carrée, le nombre de lignes doit être le double du nombre de colonnes.

2. Initialisation de la carte

Insérer la description de l'image ici
C'est l'initialisation du tableau. Si nous voulons imprimer '-', alors stocker 1 dans le tableau. De même, '|' stocke 2 dans le tableau et stocke 0 dans d'autres positions. La tête de serpent est 3 et la nourriture est 4. 0 1 2 3 4 est stocké dans le tableau ici pour faciliter l'impression de la carte plus tard. Lorsque nous parcourons le tableau, nous imprimons « - » lorsque nous rencontrons 1, imprimons un espace lorsque nous rencontrons 0, et ainsi de suite.

3. Impression de cartes

Insérer la description de l'image ici
Comme mentionné ci-dessus, 1 représente « - », 2 représente « | », 0 représente l'espace, 3 représente la tête de serpent et 4 représente la nourriture.

4. Le mouvement des serpents

Insérer la description de l'image ici
Le mouvement du serpent est en fait un effet visuel. Si nous changeons continuellement les coordonnées de la tête du serpent puis effaçons l'écran, nous obtiendrons l'effet de mouvement.
Deux fonctions sont également introduites ici :
1. kbhit : (Fichier d'en-tête : conio) Sa fonction est de renvoyer une valeur vraie lorsque des données sont saisies. Lorsque nous jouons avec Snake, si la direction du corps du serpent ne change pas, il continuera d'avancer, ce qui est lié au kbhit.
Insérer la description de l'image ici
Si nous ne la saisissons pas, il ne saisira pas cette déclaration.

2. getch : (Fichier d'en-tête : conio) Cette fonction n'a pas besoin d'appuyer sur Entrée lors de la lecture des données, elle terminera automatiquement l'étape suivante. Si nous utilisons getchar ici, ce sera très embarrassant. Nous devons toujours appuyer sur Entrée lors de la saisie un personnage. , sinon le serpent ne bougerait pas.
Insérer la description de l'image ici
Nous saisissons wsad à partir du clavier, qui est converti en attribuant différentes valeurs à la direction, de sorte que les coordonnées de la tête du serpent changent. Certaines personnes ici peuvent se demander pourquoi deux instructions switch sont utilisées, une pour recevoir ch et une pour recevoir la direction, car lorsque nous n'entrons pas wsad, le serpent se déplacera dans une direction. C'est parce que nous avons défini une variable de direction au début et lui a attribué la valeur initiale.

5. Comment allonger progressivement le corps du serpent

Insérer la description de l'image ici
C'est à ce moment-là que les coordonnées de la tête de notre serpent coïncident avec les coordonnées de la nourriture, nous réinitialisons les coordonnées de la nourriture et obtenons un score de +1 ; et notre décompte est également lié à la longueur du corps du serpent. Ce
Insérer la description de l'image ici
code n'est peut-être pas facile à comprendre, sa fonction est d'attribuer la coordonnée précédente dans la structure à la coordonnée suivante.
Insérer la description de l'image ici
Ici, vous pouvez voir que lorsque notre tête de serpent continue d'avancer, le corps du serpent avancera également, mais nous devons nettoyer la dernière section du corps du serpent.
Insérer la description de l'image ici

6. Affichage du code final

// 
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
void initmap(int arr[20][40]);
void printmap(int arr[20][40]);
void playmap(int arr[20][40]);

jeu.c

// 
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
typedef struct Snake
{
	int x;
	int y;
}S;
	S snake[800] = { {15,20} };
	int arr[20][40] = { 0 };
	int food_x = 2;
	int food_y = 6;
	int count = 0;
	int i = 0;
void initmap(int arr[20][40])
{
	int i = 0;
	int j = 0;
	
	for (i = 0; i < 20; i++)
	{
		for (j = 0; j < 40; j++)
		{
			if (0 == i || 19 == i)//1,-,    2,|,      0,打印空格    3,打印蛇头'*'
				arr[i][j] = 1;
			if (0 == j || 39 == j)
				arr[i][j] = 2;
		}
	}
}
void printmap(int arr[20][40])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 20; i++)
	{
		for (j = 0; j < 40; j++)
		{
			switch (arr[i][j])
			{
			case 1:printf("-"); break;
			case 2:printf("|"); break;
			case 0:printf(" "); break;
			case 3:printf("*"); break;
			case 4:printf("$"); break;
			}
		}
		printf("\n");
	}
}
void playmap(int arr[20][40])
{
	int direction = 1;
	while (1)
	{
		arr[food_x][food_y] = 4;
		arr[snake[count].x][snake[count].y] = 0;//最后一节不断消失
		char ch = 0;
		if (_kbhit())
		{
			ch = _getch();
			switch (ch)
			{
			case 'w':direction = 1 ;break;
			case 's':direction = 2; break;
			case 'a':direction = 3; break;
			case 'd':direction = 4; break;
			default:break;
			}
		}
		for (i = count; i > 0; i--)
		{
			snake[i].x = snake[i - 1].x;
			snake[i].y = snake[i - 1].y;
			arr[snake[i].x][snake[i].y] = 3;
		}
		switch (direction)
		{
			case 1:snake[0].x--; break;
			case 2:snake[0].x++; break;
			case 3:snake[0].y--; break;
			case 4:snake[0].y++; break;
			default:break;
		}
		arr[snake[0].x][snake[0].y] = 3;
		Sleep(50);
		system("cls");
			
		if (snake[0].x == 0 || snake[0].x == 19 || snake[0].y == 0 || snake[0].y == 39)
			exit(0);
		if (snake[0].x == food_x && snake[0].y == food_y)
		{
				
			arr[food_x][food_y] = 0;
			food_x = rand() % 18+1;
			food_y = rand() % 38+1;
			arr[food_x][food_y] = 4;
			count++;
				
				
		}
		printmap(arr);
		printf("\ncount=%d",count);
			
	}
}

test.c

// 
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play ***************\n");
	printf("*********** 0.exit ***************\n");
	printf("**********************************\n");
}
void play()
{
	int snake_x = 10;
	int snake_y = 15;
	int arr[20][40]={0};
	initmap(arr);
	printmap(arr);
	playmap(arr);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:play(); break;
		case 2:printf("退出游戏\n"); break;
		default:printf("输入错误,请重新输入\n"); break;
		}
	} while (input);
	return 0;
}

Merci d'avoir regardé! ! !

Je suppose que tu aimes

Origine blog.csdn.net/Djsnxbjans/article/details/126271124
conseillé
Classement