当前位置:网站首页>C langue pour le déminage

C langue pour le déminage

2021-10-14 07:13:21 - Non.

Un.,Introduction au déminage

《Déminage》C'est un jeu de puzzle populaire,À1992Émis en.Le but du jeu est de trouver toutes les grilles non - Ray dans les plus brefs délais en fonction des nombres qui apparaissent dans les grilles de clic,En même temps, évitez de marcher sur le tonnerre.,Marcher sur un tonnerre, c'est perdre tout. La version la plus originale du déminage remonte à 1973 Un article de l'année s'appelle “Carré”Le jeu de.Bientôt.,“Carré” A été transformé en jeu “Rlogic”.In“Rlogic”- Oui., La tâche du joueur est US Marine Corps Membres de l'équipe, Tracer une route sûre sans mines pour le Centre de commandement , Si les routes sont bloquées par des mines, on perd. .Deux ans plus tard,Tom!· Anderson est là. “Rlogic” Et j'ai inventé le jeu. “Mines terrestres”, C'est ainsi que le jeu moderne de déminage a pris forme. 1981Année, Robert de Microsoft · Dur et Carter. · Deux ingénieurs de Johnson Windows3.1 Le jeu est chargé sur le système , Ce n'est que lorsque le jeu de déminage a été officiellement lancé dans le monde entier. . Le jeu est joué dans un 9*9(Primaire),16*16(Niveau intermédiaire),16*30(Senior), Ou une quantité aléatoire de mines dans une matrice de blocs de taille personnalisée ( Primaire 10- Oui., Niveau intermédiaire 40- Oui., Niveau supérieur 99- Oui.). Les joueurs retournent les carrés un par un , Le but ultime du jeu est de trouver toutes les mines. . S'il y a une mine dans le carré ouvert par le joueur ,Alors le jeu est terminé.

2.,Les règles

Parwindows XP Déminage autonome winmine.exePar exemple( D'autres versions du jeu de déminage sont similaires ). La zone de jeu comprend des champs de mines 、 Compteur de mines ( En haut à gauche , Enregistrement du nombre de mines restantes ) Et minuteur ( En haut à droite , Enregistrer le temps de jeu ), Nombre aléatoire de mines posées dans des champs de mines rectangulaires de taille déterminée ( Primaire 9*9Un carré10Un Ray, Niveau intermédiaire 16*16Un carré40Un Ray, Niveau supérieur 16*30Un carré99Un Ray, Les niveaux personnalisés peuvent définir eux - mêmes la taille et le nombre de champs de mines , Mais la taille du champ de mines ne doit pas dépasser 24*30),Le joueur doit trouver rapidement tous les carrés dans le champ de mines qui ne sont pas des mines,Et pas de mines terrestres.

Les opérations de base du jeu incluent un clic gauche (Left Click)、Clic droit(Right Click)、Double - clic(Chording)Trois. Où la touche gauche est utilisée pour ouvrir la grille sécurisée , Faire avancer le jeu ; Clic droit pour marquer une mine , À l'appui du jugement , Ou se préparer pour le prochain double - clic ; Double - cliquez sur une mine autour d'un nombre lorsque le marquage est terminé , C'est l'équivalent d'un clic gauche sur tous les carrés non ouverts autour d'un nombre :

Clic gauche: Appuyez sur le bouton gauche sur la boîte qui ne juge pas ray , Vous pouvez ouvrir la boîte . Si le nombre apparaît sur la boîte , Le nombre représente son environnement 3×3 Nombre de mines dans la zone (En général8Une grille., Pour les blocs latéraux 5Une grille., Pour les blocs d'angle 3Une grille.. Donc le plus grand nombre de mines est 8); Si la case est vide (équivalent à0), Vous pouvez ouvrir Récursivement les blocs adjacents à l'espace ; Si la foudre tombe ,Alors le jeu est terminé.

Clic droit: Appuyez sur le bouton droit de la boîte jugée mine , Peut marquer une mine ( Afficher comme un petit drapeau rouge ). Répéter une ou deux opérations pour décoder ( Si coché dans le menu Jeu “Marquage(?)”, Deux opérations sont nécessaires pour annuler le marquage ).

Double - clic: Appuyez sur les touches gauche et droite pour compléter le double - clic . L'opération est valide lorsque le nombre de mines marquées autour d'une position double - clique est égal au nombre de positions , L'équivalent d'un clic gauche sur tous les carrés non ouverts autour du nombre . Le double - clic n'est pas valable lorsque la mine n'est pas entièrement marquée . S'il y a une mine mal marquée autour des chiffres ,Alors le jeu est terminé, Une mine mal marquée affichera “ ×”.

 Trois, Conception de chaque module

3.1 Génération de menus et initialisation partielle des modules

La génération de menus est traitée de la manière la plus simple possible , L'initialisation de certains modules est également conçue en fonction des exigences spécifiques. .

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

}

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//Initialisation du échiquier
	InitBoard(mine, ROWS, COLS, '0');//'0'
	InitBoard(show, ROWS, COLS, '*');//'*'

	//Lay ray;
	SetMine(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);

	//Déminage
	FindMine(mine, show, ROW, COL);

}

3.2Initialisation du échiquier

Parce que le nombre de mines cliquées lors du déminage est le nombre de mines dans les huit grilles environnantes , Les bords du jeu sont conçus pour doubler la taille globale .

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
			for (j = 0; j < cols; j++)
			{
				board[i][j] = set;
			}
	}
}

 3.2Afficher le échiquier

Afficher le échiquier et le dessin séparé pour le déminage , Réduire la redondance , Avant le début du déminage “*” Au lieu de grilles invisibles .

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("--------------------------------\n");
	for (i = 0; i <= 9; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("---------------------------------\n");

 3.3 Définir le nombre de tonnerres et trouver le nombre de tonnerres

Le nombre de Ray détermine la Facilité du jeu , Le blogueur a conçu dix ray , Pour le mode le plus simple

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');
}

3.4Déminage

Le déminage est la clé du jeu , C'est aussi une difficulté de conception. , Nous choisissons en recherchant le nombre de tonnerres dans les huit treillis environnants , Génération aléatoire de la position du tonnerre ,Avec“0” Représente Wu Lei ,Avec“1” Ray. , Pour écraser la conception précédente “*”.

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("Veuillez saisir les coordonnées à vérifier:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("C'est dommage,Tu as été tué.\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf(" Coordonnées illégales ,Re - Input\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("Félicitations pour,Déminage réussi\n");
		DisplayBoard(mine, ROW, COL);
	}
}

 

Quatre,Code complet

4.1game.h


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

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

//Initialisation du échiquier
void InitBoard(char board[ROWS][COLS], int rows,int cols, char set);

//Afficher le échiquier
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//Lay ray
void SetMine(char board[ROWS][COLS], int row, int col);

// J'ai trouvé Ray. 
int GetMineCount(char mine[ROWS][COLS], int x, int y);

//Déminage
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

4.2text.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 game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//Initialisation du échiquier
	InitBoard(mine, ROWS, COLS, '0');//'0'
	InitBoard(show, ROWS, COLS, '*');//'*'

	//Lay ray;
	SetMine(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);

	//Déminage
	FindMine(mine, show, ROW, COL);

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("Veuillez sélectionner:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("Quitter le jeu\n");
			break;
		default:
			printf("Erreur de sélection,Re - Select\n");
			break;
		}
	} while (input);
	return 0;
}

 4.3game.c


#include "game.h"

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
			for (j = 0; j < cols; j++)
			{
				board[i][j] = set;
			}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("--------------------------------\n");
	for (i = 0; i <= 9; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("---------------------------------\n");
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("Veuillez saisir les coordonnées à vérifier:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("C'est dommage,Tu as été tué.\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf(" Coordonnées illégales ,Re - Input\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("Félicitations pour,Déminage réussi\n");
		DisplayBoard(mine, ROW, COL);
	}
}

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

随机推荐