当前位置:网站首页>C | Réalisation d'une version simple du déminage

C | Réalisation d'une version simple du déminage

2021-10-14 06:33:02 Ersansui

Préface

Insérer la description de l'image ici
Je crois que tout le monde a joué au dragueur de mines quand il était enfant?

À une époque où les réseaux ne sont pas développés,windowsLe système de jeu automatique de déminage est devenu beaucoup de gens souvenirs d'enfance.

Aujourd'hui, utilisonsC Language to realize the Easy version of the mine mine Miniclip Games !

Réalisation du jeu

Les idées que nous avons mises en œuvre sont les suivantes: :

1.Imprimer le menu au début du programme,Laissez le joueur choisir de commencer ou de quitter le jeu

2.Le joueur entre dans le jeu après avoir sélectionné le jeu

3.Après avoir décidé de gagner ou de perdre,Retour au menu

C'est la même chose que la dernière fois que j'ai joué aux échecs. , Commençons par créer trois fichiers différents , Pour faciliter la gestion et la maintenance du Code .

test.c Mise en œuvre du cadre général du jeu
game.c Mise en œuvre des fonctions liées au jeu
game.h Déclaration pour les fonctions liées au jeu

Si vous n'avez pas vu les jeux de go, , Vous pouvez cliquer sur le lien ci - dessous pour sauter ~

Mise en œuvre du jeu de go


test.c

Le fichier est mainMise en œuvre de la fonction,Est l'entrée du programme

Nous utilisons les options du menu , Vous pouvez choisir de commencer ou de quitter le jeu

Pour pouvoirswitchStatementcaseVous pouvez voir visuellement quelles fonctions les différentes options devraient correspondre,Nous avons défini une variable énumérée pour chaque option

do-whileDéclarations,Il est possible d'imprimer le menu une fois que le programme commence à s'exécuter, Permet aux joueurs de choisir

whileJugement conditionnel, Nous pouvons mettre les résultats de la sélection des joueurs ,Si oui0 C'est terminé. , Si non 0 Imprimez à nouveau le menu

srandL'appel de fonction est utilisé pour définir le point de départ de la génération de nombres aléatoires, Pour faciliter les appels ultérieurs rand Fonction pour définir au hasard la position du tonnerre

//test.c

//Contient le fichier d'en - tête,Réalisationgame.c Appel à la fonction 
#include"game.h"


//Définir les variables d'énumération, Options pour le menu correspondant 
enum Choose
{
    
	EXIT,
	PLAY
};

int main()
{
    
	int input = 0;
	srand((unsigned int)time(NULL));//Avec l'horodatage,Définir le point de départ de la génération de nombres aléatoires

	// Description des règles du jeu 
	howtoplay();

	// Le programme est exécuté une fois au début , Permet aux joueurs de choisir 
	do
	{
    
		menu();//Appelez la fonction menu
		scanf("%d", &input);

		switch (input)// Sélection du joueur correspondant , Et faire un jugement 
		{
    
		case PLAY:
			game();//Après avoir choisi de jouer,AppelezgameFonction pour jouer
			break;
		case EXIT:
			printf("Quitter le jeu\n");
			break;
		default:
			printf("Mauvais choix,Veuillez sélectionner à nouveau\n");
			break;

		}

	} while (input);//QuandinputPour0Heure, Sortir de la mauvaise voie ,Fin du programme;QuandinputNon0Heure, Les joueurs peuvent choisir à nouveau 



	return 0;
}

game.c

Ce fichier est utilisé pour implémenter gameToutes les fonctions liées au jeu appelées dans la fonction

L'idée générale est la suivante: :

1. Créer deux tableaux 2D ,Un(mine) Utilisé pour enregistrer la position de la foudre ,Un(show) Utilisé pour imprimer aux joueurs

2.Initialisation de deux tableaux 2D

3.Inmine Ray est défini dans le tableau en fonction de la difficulté prédéterminée

4.Imprimershow Le tableau et l'axe de vue correspondant pour la commodité du lecteur

5. Le joueur entre les coordonnées pour le déminage

6. Déterminer le choix du joueur , Invite le joueur Si Ray est sélectionné : Il a été tué. ;Sinon,Nombre de rayures imprimées dans la position choisie par le joueur avec la grille des neuf Palais centrée sur cette position


gameMise en œuvre de la fonction

Créer une taille de sélection de tableau , On ne va pas écrire en majuscules. , Pour ne pas mourir. , La modification ultérieure de la taille du tableau 2D n'est pas pratique

On peut être à l'arrière. game.hPassage moyendefine Pour définir la taille des lignes et des colonnes d'un tableau 2D

Attention!!!

Voici la taille du tableau que nous avons créé 11×11,Au lieu de9×9De
C'est parce que, Si nous choisissons la position sur le bord , Alors que nous parcourons le réseau des neuf Palais centré sur cet emplacement, , Le programme signale une erreur parce que le tableau est hors de portée
Donc nous faisons un tour dans un tableau bidimensionnel , Et initialiser tout , Évitez de franchir les limites lors de la traversée ultérieure de la grille des neuf palais.
Mais quand nous imprimons un tableau , N'imprimera pas l'anneau extérieur

game.La fonction principale est d'appeler chaque fonction pertinente dans un certain ordre pour réaliser l'ensemble du processus de jeu

void game()
{
    
	// Créer deux tableaux 2D 
	//mine Tableau utilisé pour enregistrer la position de la foudre 
	//show Tableau pour l'affichage graphique 
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

	// Initialisation des fonctions de tableau 2D 
	//mine Le paramètre de transfert du tableau est ‘0’
	//show Le paramètre de transfert du tableau est ‘*’
	Initboard(mine, ROWS, COLS,'0');
	Initboard(show, ROWS, COLS,'*');


	// Selon la difficulté ,Inmine Emplacement aléatoire du tonnerre dans le tableau 
	Setmine1(mine,show,ROWS,COLS);
	//Setmine(show, ROW, COL);

	//ImprimershowTableau
	//Printmine(mine, ROW, COL);
	Printmine(show, ROW, COL);

	// Fonction de déminage 
	Findmine(mine,show, ROW, COL);


}

Fonctions décrites par les règles du jeu

Cette fonction est utilisée pour imprimer les règles du jeu au début du programme

//Description du jeu
void howtoplay()
{
    
	printf("-------------------------------------------------------------------------\n");
	printf("1. Les joueurs doivent utiliser l'entrée du clavier pour sélectionner  \n");
	printf("2. Pour entrer les coordonnées, saisissez un nombre et appuyez sur Entrée \n");
	printf("3. Première ligne sélectionnée , Deuxième colonne de sélection \n");
	printf("4..Les numéros séquentiels à gauche et au - dessus permettent au joueur de savoir quelle ligne est la colonne\n");
	printf("5. Si l'emplacement sélectionné est sûr ,Le nombre de huit Grays autour de lui est imprimé à cet endroit\n");
	printf("6. La version actuelle ne peut pas agrandir une pièce à la fois , On ne peut choisir qu'un seul endroit sans Ray. \n");
	printf("7. Quand tous les endroits sûrs sont trouvés par le joueur , Gagnez le jeu. \n");
	printf("8. La difficulté actuelle est simple ,C'est tout.9Un Ray\n");
	printf("--------------------------------------------------------------------------\n");
	printf("\n");

}


Mise en œuvre de la fonction d'initialisation du vérificateur

Pour initialiser deux tableaux , Nous spécifions les éléments initialisés dans la fonction ,Si vous voulez initialiser un élément, passez - le directement à la fonction

//Initialiser la fonction
// Initialisation d'un tableau binaire basé sur un paramètre passé 
void Initboard(char mine[ROWS][COLS], int rows ,int cols,char ch)
{
    
	int i = 0;

	for (i = 0;i < rows;i++)
	{
    
		int j = 0;
		for (j = 0; j <cols; j++)
		{
    
			mine[i][j] = ch;

		}

	}

}

Réalisation de la fonction de génération aléatoire de Ray

On metmine Tableau passé à cette fonction ,La mise en place du tonnerre se fait au moyen de coordonnées générées au hasard

Attention!!!

Voici le paramètre.rowEtcol Les paramètres sont transmis en fonction de la taille du tableau 2D dans le jeu
Ce n'est pas la taille d'un cercle plus grand.
Parce que nous avons placé ray , Il suffit de mettre Ray à la taille réelle ( Cette version est 9×9) Dans un tableau bidimensionnel de
Le cercle extérieur n'a pas besoin d'être placé.
Sinon, il y aura une erreur lors de la traversée ultérieure de la grille des neuf Palais

Ici, je définit les caractères 1Pour Ray, Caractères originaux 0 Pour la sécurité

void Setmine1(char mine[ROWS][COLS],int row, int col)
{
    
	int count = SIMPLE_MODE;
	while (count)
	{
    
		int i = rand()%9 + 1;
		int j = rand()%9 + 1;

		if (mine[i][j] == '0')
		{
    
			mine[i][j] = '1';
			count--;
		}

	}

}

Mise en œuvre de la fonction Print Array

//Imprimer la fonction
//Pour imprimershowTableau, Et imprime les coordonnées des lignes et des colonnes , Facile à choisir pour les joueurs 
void Printmine(char board[ROWS][COLS], int row, int col)
{
    
	int i = 0;
	printf("\n");
	printf(" ");// Permet aux coordonnées des colonnes de correspondre *Aligner
	for (i = 1; i <= col; i++)
	{
    
		if (i <= 9)
			printf("%d ", i);// Lorsque le nombre de coordonnées est un nombre de chiffres , Un espace supplémentaire occupe la position 
		else
			printf("%d ", i);// Lorsque le nombre de coordonnées est à deux chiffres , Moins d'espace 
	}
	printf("\n");
	printf(" ");// Que la ligne de division sous les coordonnées de la colonne soit *Aligner

	for (i = 1; i <= col; i++)
	{
    
		printf("---");//Un chiffre+ Deux espaces ou deux chiffres +Un espace, Donc ici, trois courtes lignes horizontales sont utilisées pour aligner 
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
    
		int j = 0;
		if (i <= 9)
			printf("%d |", i);// Le nombre de coordonnées de ligne à un chiffre est aligné avec deux espaces 
		else
			printf("%d |", i);// Le nombre de coordonnées de ligne à deux chiffres est aligné avec un espace 
		for (j = 1; j <= col; j++)
		{
    

			printf("%c ", board[i][j]);//Avec un seul caractère+ Deux courtes lignes horizontales pour aligner les trois courtes lignes horizontales ci - dessus 
		}
		printf("\n");
	}

	printf("\n");
	printf("\n");


}

ModifiermineMise en œuvre des fonctions du tableau

void Setmine2(char show[ROWS][COLS], int x, int y, int ret)
{
    
	show[x][y] = ret + '0';

}

Réalisation de la fonction de processus de déminage

// Fonction de déminage 
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
    
	int x = 0;
	int y = 0;
	int count = 0;// Utilisé pour enregistrer le nombre de Gray dans les neuf Palais 
	int amount = row * col - SIMPLE_MODE;// Nombre d'emplacements sûrs non éclairés enregistrés 

	while (1)
	{
    
		printf("Veuillez saisir les coordonnées:>\n");
		scanf("%d %d", &x, &y);

		//if Instruction utilisée pour déterminer si les coordonnées saisies par le joueur sont correctes 
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    

			
			if (mine[x][y] == '1')
			{
    
				printf("\n");
				printf("C'est dommage,Tu as été tué.\n");
				printf("\n");
				return;// Il a été tué et est revenu directement. , Quitter la fonction 
				
			}
			else
			{
    
				//else Il faut aussi déterminer si l'emplacement n'a pas été choisi. ‘0’Emplacement
				// A été sélectionné et remplacé par ‘#’Emplacement
				if (mine[x][y] == '0')
				{
    
					mine[x][y] = '#';//Mettre les caractères0Lire comme suit:‘#’, Il est pratique de déterminer si l'emplacement est sélectionné à plusieurs reprises par la suite. 
					amount--;// Moins un des emplacements sûrs , Quand il est tombé à zéro , Le joueur n'est pas encore sorti parce qu'il a été tué 
							 // Le joueur a terminé le déminage. 

					// Définir de nouvelles coordonnées ,Pour le coin supérieur gauche de la grille des neuf Palais centré sur les coordonnées choisies par le joueur,
					// Utilisé pour parcourir le tableau pour compter le nombre de Gray dans les neuf Palais 
					int i = x - 1;
					int j = y - 1;

					for (i = x - 1; i <= x + 1; i++)
					{
    
						for (j = y - 1; j <= y + 1; j++)
						{
    
							if (mine[i][j] == '1')
							{
    
								count++;// Utilisé pour enregistrer le nombre de Gray dans les neuf Palais 
							}
						}
					}
					Setmine2(show, x, y, count);// Changez le nombre de tonnerres retournés dans le réseau de neuf Palais showTableau
												//Permet au joueur de choisir la position pour montrer combien de tonnerres il y a autour
					count = 0;// Réinitialiser à chaque modification réussie 0, Sinon, la quantité s'accumulera 
					Printmine(show, ROW, COL);// Modifié showTableau imprimé
					if (!amount)//QuandamountPour0Heure, Indique que le joueur a réussi le déminage , Renvoie la fonction de sortie 
					{
    
						printf(" Félicitations pour le déminage. !\n");
						printf("\n");
						return;
					}

				}
				else if (mine[x][y] == '#')
				{
    
					printf(" L'emplacement a été vérifié ,Veuillez sélectionner à nouveau\n");
				}
				

			}

		}
		else
		{
    
			printf("\n");
			printf("Erreur d'entrée,Veuillez saisir à nouveau:>\n");// Si le joueur a mal saisi les coordonnées , Permet aux joueurs de choisir à nouveau 
			printf("\n");
		}
	}

}

ModifiershowMise en œuvre des fonctions du tableau

Nombre retourné en parcourant le réseau des neuf Palais ,Allez.show Caractère correspondant à la position dans la fonction 0 Modifier pour correspondre à la forme de caractère du nombre , Pour que le joueur sache combien de tonnerres il y a autour , Parce que la fonction d'impression utilise %c Forme de caractère pour , Donc vous devez convertir les nombres en caractères

void Setmine2(char show[ROWS][COLS], int x, int y, int ret)
{
    
	show[x][y] = ret + '0';

}

game.cRésumé

Résumons les codes ci - dessus. ,Les partenaires qui veulent expérimenter peuvent copier directement le code ci - dessous

#include"game.h"


//Description du jeu
void howtoplay()
{
    
	printf("-------------------------------------------------------------------------\n");
	printf("1. Les joueurs doivent utiliser l'entrée du clavier pour sélectionner  \n");
	printf("2. Pour entrer les coordonnées, saisissez un nombre et appuyez sur Entrée \n");
	printf("3. Première ligne sélectionnée , Deuxième colonne de sélection \n");
	printf("4..Les numéros séquentiels à gauche et au - dessus permettent au joueur de savoir quelle ligne est la colonne\n");
	printf("5. Si l'emplacement sélectionné est sûr ,Le nombre de huit Grays autour de lui est imprimé à cet endroit\n");
	printf("6. La version actuelle ne peut pas agrandir une pièce à la fois , On ne peut choisir qu'un seul endroit sans Ray. \n");
	printf("7. Quand tous les endroits sûrs sont trouvés par le joueur , Gagnez le jeu. \n");
	printf("8. La difficulté actuelle est simple ,C'est tout.9Un Ray\n");
	printf("--------------------------------------------------------------------------\n");
	printf("\n");

}


//Fonctions de menu
void menu()
{
    
	printf("***************************\n");
	printf("******* 1. play *******\n");
	printf("******* 0. exit *******\n");
	printf("***************************\n");
	printf("\n");
}




//Initialiser la fonction
// Initialisation d'un tableau binaire basé sur un paramètre passé 
void Initboard(char mine[ROWS][COLS], int rows ,int cols,char ch)
{
    
	int i = 0;

	for (i = 0;i < rows;i++)
	{
    
		int j = 0;
		for (j = 0; j <cols; j++)
		{
    
			mine[i][j] = ch;

		}

	}

}



// Définir la fonction de Ray 
// Coordonnées des mines générées au hasard ,Et placémineDans le tableau
void Setmine1(char mine[ROWS][COLS],int row, int col)
{
    
	int count = SIMPLE_MODE;
	while (count)
	{
    
		int i = rand()%9 + 1;
		int j = rand()%9 + 1;

		if (mine[i][j] == '0')
		{
    
			mine[i][j] = '1';
			count--;
		}

	}

}

void Setmine2(char show[ROWS][COLS], int x, int y, int ret)
{
    
	show[x][y] = ret + '0';

}

//Imprimer la fonction
//Pour imprimershowTableau, Et imprime les coordonnées des lignes et des colonnes , Facile à choisir pour les joueurs 
void Printmine(char board[ROWS][COLS], int row, int col)
{
    
	int i = 0;
	printf("\n");
	printf(" ");// Permet aux coordonnées des colonnes de correspondre *Aligner
	for (i = 1; i <= col; i++)
	{
    
		if (i <= 9)
			printf("%d ", i);// Lorsque le nombre de coordonnées est un nombre de chiffres , Un espace supplémentaire occupe la position 
		else
			printf("%d ", i);// Lorsque le nombre de coordonnées est à deux chiffres , Moins d'espace 
	}
	printf("\n");
	printf(" ");// Que la ligne de division sous les coordonnées de la colonne soit *Aligner

	for (i = 1; i <= col; i++)
	{
    
		printf("---");//Un chiffre+ Deux espaces ou deux chiffres +Un espace, Donc ici, trois courtes lignes horizontales sont utilisées pour aligner 
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
    
		int j = 0;
		if (i <= 9)
			printf("%d |", i);// Le nombre de coordonnées de ligne à un chiffre est aligné avec deux espaces 
		else
			printf("%d |", i);// Le nombre de coordonnées de ligne à deux chiffres est aligné avec un espace 
		for (j = 1; j <= col; j++)
		{
    

			printf("%c ", board[i][j]);//Avec un seul caractère+ Deux courtes lignes horizontales pour aligner les trois courtes lignes horizontales ci - dessus 
		}
		printf("\n");
	}

	printf("\n");
	printf("\n");


}



// Fonction de déminage 
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
    
	int x = 0;
	int y = 0;
	int count = 0;// Utilisé pour enregistrer le nombre de Gray dans les neuf Palais 
	int amount = row * col - SIMPLE_MODE;// Nombre d'emplacements sûrs non éclairés enregistrés 

	while (1)
	{
    
		printf("Veuillez saisir les coordonnées:>\n");
		scanf("%d %d", &x, &y);

		//if Instruction utilisée pour déterminer si les coordonnées saisies par le joueur sont correctes 
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    

			
			if (mine[x][y] == '1')
			{
    
				printf("\n");
				printf("C'est dommage,Tu as été tué.\n");
				printf("\n");
				return;// Il a été tué et est revenu directement. , Quitter la fonction 
				
			}
			else
			{
    
				//else Il faut aussi déterminer si l'emplacement n'a pas été choisi. ‘0’Emplacement
				// A été sélectionné et remplacé par ‘#’Emplacement
				if (mine[x][y] == '0')
				{
    
					mine[x][y] = '#';//Mettre les caractères0Lire comme suit:‘#’, Il est pratique de déterminer si l'emplacement est sélectionné à plusieurs reprises par la suite. 
					amount--;// Moins un des emplacements sûrs , Quand il est tombé à zéro , Le joueur n'est pas encore sorti parce qu'il a été tué 
							 // Le joueur a terminé le déminage. 

					// Définir de nouvelles coordonnées ,Pour le coin supérieur gauche de la grille des neuf Palais centré sur les coordonnées choisies par le joueur,
					// Utilisé pour parcourir le tableau pour compter le nombre de Gray dans les neuf Palais 
					int i = x - 1;
					int j = y - 1;

					for (i = x - 1; i <= x + 1; i++)
					{
    
						for (j = y - 1; j <= y + 1; j++)
						{
    
							if (mine[i][j] == '1')
							{
    
								count++;// Utilisé pour enregistrer le nombre de Gray dans les neuf Palais 
							}
						}
					}
					Setmine2(show, x, y, count);// Changez le nombre de tonnerres retournés dans le réseau de neuf Palais showTableau
												//Permet au joueur de choisir la position pour montrer combien de tonnerres il y a autour
					count = 0;// Réinitialiser à chaque modification réussie 0, Sinon, la quantité s'accumulera 
					Printmine(show, ROW, COL);// Modifié showTableau imprimé
					if (!amount)//QuandamountPour0Heure, Indique que le joueur a réussi le déminage , Renvoie la fonction de sortie 
					{
    
						printf(" Félicitations pour le déminage. !\n");
						printf("\n");
						return;
					}

				}
				else if (mine[x][y] == '#')
				{
    
					printf(" L'emplacement a été vérifié ,Veuillez sélectionner à nouveau\n");
				}
				

			}

		}
		else
		{
    
			printf("\n");
			printf("Erreur d'entrée,Veuillez saisir à nouveau:>\n");// Si le joueur a mal saisi les coordonnées , Permet aux joueurs de choisir à nouveau 
			printf("\n");
		}
	}

}




void game()
{
    
	// Créer deux tableaux 2D 
	//mine Tableau utilisé pour enregistrer la position de la foudre 
	//show Tableau pour l'affichage graphique 
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

	// Initialisation des fonctions de tableau 2D 
	//mine Le paramètre de transfert du tableau est ‘0’
	//show Le paramètre de transfert du tableau est ‘*’
	Initboard(mine, ROWS, COLS,'0');
	Initboard(show, ROWS, COLS,'*');


	// Selon la difficulté ,Inmine Emplacement aléatoire du tonnerre dans le tableau 
	Setmine1(mine,ROWS,COLS);
	//Setmine(show, ROW, COL);

	//ImprimershowTableau
	//Printmine(mine, ROW, COL);
	Printmine(show, ROW, COL);

	// Fonction de déminage 
	Findmine(mine,show, ROW, COL);


}

game.h

.Ce fichier d'en - tête permet de connecter deux fichiers sources et contient les fichiers de bibliothèque nécessaires

Il réalise également la taille du tableau 2D et la difficulté de jeu ( Nombre de Ray )Macro - définition pour, Faciliter la modification ultérieure de la taille du tableau et de la difficulté du jeu

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// Définition de la taille du tableau binaire dans le jeu 
#define ROW 9
#define COL 9

//Créer un tableau bidimensionnel est en fait un cercle plus grand que la taille du jeu, Évitez de traverser le réseau des neuf palais. 
#define ROWS 11
#define COLS 11


#define SIMPLE_MODE 9// Définir le nombre de Ray pour contrôler la difficulté du jeu 

void howtoplay();
void menu();
void game();

Conclusion

C'est bon., Voici le partage d'aujourd'hui

Les gars qui veulent l'expérience peuvent créer unC Ingénierie linguistique , Et créer deux fichiers source et un fichier d'en - tête , Copiez le code source correspondant , Je peux l'expérimenter. , Il peut être modifié au besoin.

Par exemple:: Après avoir choisi de jouer , Vous pouvez choisir la difficulté , Redimensionner un tableau 2D ,Choisissez un endroit sûr pour agrandir un morceau, etc

La dernière chose à dire

La création n'est pas facile,J'espère que tout le monde peut faire quelque chose de bien、Commentaires、Avant、Attention à un dragon!

Votre soutien est ma plus grande motivation pour créer!!

En raison de mes capacités limitées,En cas d'erreur,J'espère que la correction!!

S'il y a une meilleure façon ou une meilleure idée,Les commentaires sont les bienvenus~

Insérer la description de l'image ici

版权声明
本文为[Ersansui]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211013211538521q.html

随机推荐