[Langage C] Jeu de démineur

1. Règles du jeu

1. Dans la petite grille de 9*9, choisissez une coordonnée (grille) arbitrairement. Après sélection, si la coordonnée de la mine n'est pas cliqué, le nombre sera affiché (indiquant combien de mines sont autour). Si la mine est cliqué, le jeu est terminé

Dépannage

  • Si cette position n'est pas une mine, calculez combien de mines il y a dans les 8 coordonnées autour de cette position, et affichez le nombre de mines
  • Si c'est le mien, ça explose et c'est game over
  • Si vous trouvez toutes les mines, vous gagnez et le jeu est terminé
  • Lien: Démineur version Web

Démineur 01

2. Après la sélection, comme indiqué sur la figure

Démineur 02

3. Le cas d'être touché par une mine

Démineur 03

2. Logique du code

  1. conception de menus de jeu
  2. Concevez des champs de mines et disposez les mines au hasard
  3. Dépannage

3. Réalisation du jeu

1. Conception du menu du jeu

//test.c
#include "game.h"
void game() 
{
    
    
	printf("扫雷\n");
}
void menu() 
{
    
    
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
    
    
	int input = 0;
	do 
	{
    
    
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
    
    
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
					
		}
		
	} while (input);
	return 0;
}

menu

2. Concevez des champs de mines et disposez les mines au hasard

(1) Pose de champs de mines

Définir un tableau bidimensionnel 9*9, 0 signifie pas de tonnerre, 1 signifie tonnerre

04

Cependant, afin d'éviter que le chiffre 1 (le nombre de mines) affiché au joueur ne coïncide avec la mine 1, choisissez donc * pour enterrer les mines

Parce que le déminage consiste à balayer les 8 zones environnantes, vous rencontrerez le problème du balayage hors limites

05
Par conséquent, il devient un tableau bidimensionnel de 11*11
insérez la description de l'image ici
pour définir l'échiquier

//test.c 中的 game()
void game() 
{
    
    
	char mine[ROWS][COLS] = {
    
    0};//放置雷的数组
	char show[ROWS][COLS] = {
    
    0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	DisplayBoard(mine, ROW, COL);
	InitBoard(show,ROWS,COLS,'*');
	DisplayBoard(show, ROW, COL);

}
//game.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
    
    
		for (j = 0; j < cols;j++)
		{
    
    
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
    
    
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
    
    
		printf("%d ",i);//打印列标
	}
	printf("\n");
	for (i = 1; i <= row; i++) 
	{
    
    
		printf("%d ",i);//打印行标
		for (j = 1; j <= col;j++)
		{
    
    
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
	
}
//game.h
#include <stdio.h>

#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);
void DisplayBoard(char board[ROWS][COLS], int row, int col);

insérez la description de l'image ici

(2) Disposer les mines

Générez aléatoirement du tonnerre ici.
Le caractère 0 signifie que ce n'est pas le mien. Le caractère 1 signifie le tonnerre

//game.c
void SetMine(char mine[ROWS][COLS], int row, int col) 
{
    
    
	int count = Easy_count;
	while (count) 
	{
    
    
		int x = rand() % row + 1;//生成坐标1-9
		int y = rand() % col + 1;
		if (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
    
    
			mine[x][y] = '1';
			count--;
		}		
	}
}

06

3. Vérifiez le mien

Entrez les coordonnées de la mine à vérifier, si c'est une mine, alors GAME OVER!, si ce n'est pas une mine, il affichera combien de mines se trouvent autour de la coordonnée

//game.c
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
    
    
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + 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("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
    
    
			//选中雷
			if (mine[x][y] =='1') 
			{
    
    
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
    
    
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);
				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
    
    
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
    
    
		printf("恭喜您,排雷成功!\n");
	}
}

Coordonnées environnantes du déminage

x-1, y-1 x-1, y x-1,y+1
x, y - 1 x,y x,y+1
x+1,y-1 x+1,y x+1,y+1

La situation lorsque la mine est terminée (80 mines sont installées ici (pour tester le succès du déminage), donc une seule mine est sûre)
07

le mien, c'est game over
insérez la description de l'image ici

4. Code source

jeu.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9

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

#define Easy_count 10

//初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//显示
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

test.c

#include "game.h"
void game() 
{
    
    
	char mine[ROWS][COLS] = {
    
    0};//放置雷的数组
	char show[ROWS][COLS] = {
    
    0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');	
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine,ROW,COL);
	//排查雷
	FindMine(mine,show,ROW,COL);

}
void menu() 
{
    
    
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
    
    
	int input = 0;
	srand((unsigned int )time(NULL));//设置随机数种子
	do 
	{
    
    
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
    
    
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;		
		}
	} while (input);
	return 0;
}

jeu.c


#include "game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
    
    
		for (j = 0; j < cols;j++)
		{
    
    
			board[i][j] = set;
		}
	}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
    
    
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
    
    
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1; i <= row; i++) 
	{
    
    
		printf("%d ",i);
		for (j = 1; j <= col;j++)
		{
    
    
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
	
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col) 
{
    
    
	int count = Easy_count;
	while (count) 
	{
    
    
		int x = rand() % row + 1;//生成坐标1-9
		int y = rand() % col + 1;
		if (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
    
    
			mine[x][y] = '1';
			count--;
		}
	}
}
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
    
    
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + 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("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
    
    
			//选中雷
			if (mine[x][y] =='1') 
			{
    
    
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
    
    
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);

				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
    
    
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
    
    
		printf("恭喜您,排雷成功!\n");
	}
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_72505850/article/details/132086672
conseillé
Classement