Análisis del buscaminas en lenguaje C

Descripción de la función Buscaminas

• Utilice la consola para realizar el clásico juego de buscaminas
• El juego puede continuar jugando o salir del juego a través del menú
• El tablero del buscaminas es una cuadrícula de 9*9
• 10 minas están dispuestas aleatoriamente de forma predeterminada
• Las minas se pueden verificar
• Si el La ubicación no es una mina, se mostrarán los alrededores. ¿Cuántas minas
? Si la posición es una mina, mátala. El juego termina
. Descubre todas las minas excepto 10 minas. Si la mina se elimina con éxito, el juego termina.

interfaz del juego

inserte la descripción de la imagen aquí

Análisis y diseño de juegos.

Análisis de estructuras de datos.

Durante el proceso de limpieza de minas, la información de las minas colocadas y las minas detectadas debe almacenarse, por lo que necesitamos una determinada estructura de datos para almacenar esta información, por lo que necesitamos una matriz. Ya que estamos diseñando un tablero de ajedrez de 9*9 Entonces, primero que nada, pensaremos en la matriz bidimensional arr[9][9] de tipo char
. Al organizar las minas, agregamos la disposición a la tienda 1, y si no está organizada, a la tienda 2.
inserte la descripción de la imagen aquí
Después de organizar las minas, necesitamos limpiar las minas. Si cuando las coordenadas de entrada son (6, 3), necesitamos contar si hay minas alrededor. Si hay minas, necesitamos mostrar el número de minas. Pero hay
un problema. Si configuramos la entrada en arr[9][9] , debemos juzgar que cuando la posición de la matriz esté cerca de (7,9), la matriz se saldrá de los límites (a menos que escriba todas esas situaciones, que (Es un poco problemático )
, por lo que necesitamos expandir el rango de la matriz, es decir, la matriz configurada es arr[9+2][9+2]. Como se muestra en la figura siguiente, hemos organizado las minas en
inserte la descripción de la imagen aquí
el tablero de ajedrez. La información sobre minas y no minas en el tablero de ajedrez. Supongamos que después de verificar una determinada posición, esta coordenada no es una mina. Hay 1 mina alrededor de las coordenadas, entonces necesitamos registrar y almacenar el número de minas. detectados e imprimirlos como información de referencia importante para la remoción de minas.
Entonces, ¿dónde se almacena la información sobre el número de minas? Si se almacena en la matriz para colocar minas, la información de las minas y el número de minas pueden causar confusión y dificultades en la impresión.
Por lo tanto, no utilice números para la información sobre minas y no minas. Sólo use ciertos caracteres. Esto evitará conflictos. Sin embargo, si hay información sobre minas y no minas en el tablero de ajedrez, así como la información sobre el número de minas encontradas, será más confuso, no lo suficientemente conveniente.
entoncesEspecíficamente damos un tablero de ajedrez (correspondiente a una matriz de mina) para almacenar la información de la mina organizada, y luego damos otro tablero de ajedrez (correspondiente a otro espectáculo de matriz) para almacenar la información de la mina detectada. De esta manera, no interferirán entre sí. Organice las minas en el conjunto de minas, verifique si hay minas en el conjunto de minas, almacene los datos detectados en el conjunto de espectáculos e imprima la información del conjunto de espectáculos para referencia posterior para la resolución de problemas .
Al mismo tiempo, para mantener el misterio, la matriz show se inicializa con el carácter '*' al principio. Para mantener los tipos de las dos matrices consistentes, se puede usar el mismo conjunto de funciones. La matriz mine También se inicializa inicialmente con el carácter '0' y el diseño se cambia a '1'.

char mine[11][11] = {
    
    0};//⽤来存放布置好的雷的信息
char show[11][11] = {
    
    0};//⽤来存放排查出的雷的个数信息

Diseño de estructura de archivos

test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等

Implementación del código del juego Buscaminas.

juego.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define EASY_COUNT 10
#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);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

juego.c

Inicializar la matriz

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;
	}
}

Imprimir tablero de ajedrez

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	printf("********* 扫雷游戏 *********\n");
	for (i = 0; i <= col; i++)
	{
    
    
		if (0 < i && i <= col - 1)
			printf("——");
		else if (i == 0)
			printf(" ");
		else
			printf("——>x轴");
	}
	printf("\n");
	for (i = 0; i <= col; i++)
	{
    
    
		if (i == 0)
			printf("  0 ");
		else
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row+3; i++)
	{
    
    
		if (i <= row - 1)
			printf("|");
		else if (i == row)
			printf("|");
		else if (i == row + 1)
			printf("V\n");
		else if (i == row + 2)
			printf("y");
		else
			printf("轴\n");
		if (i <= row)
		{
    
    
			printf(" %d ", i);
			int j = 0;
			for (j = 1; j <= col; j++)
			{
    
    
				printf("%c ", board[i][j]);
			}
			printf("\n");
		}
	}
}

Diseñar minas

void SetMine(char board[ROWS][COLS], int row, int col)
{
    
    
	//布置10个雷
	//⽣成随机的坐标,布置雷
	int count = EASY_COUNT;
	while (count)
	{
    
    
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
    
    
			board[x][y] = '1';
			count--;
		}
	}
}

Cuenta el número de minas a tu alrededor.

int GetMineCount(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');
}

Determinación de los resultados de la investigación.

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[y][x] == '1')
			{
    
    
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
    
    
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetMineCount(mine, x, y);
				show[y][x] = '0' + count;
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
    
    
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
    
    
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

prueba.c

void menu()
{
    
    
	printf("***********************\n");
	printf("******* 1. play *******\n");
	printf("******* 0. exit *******\n");
	printf("***********************\n");
}
void game()
{
    
    
	char mine[ROWS][COLS];//存放布置好的雷
	char show[ROWS][COLS];//存放排查出的雷的信息
	//初始化棋盘
	//1. mine数组最开始是全'0'
	//2. show数组最开始是全'*'
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盘
	//DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	//1. 布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);
	//2. 排查雷
	FindMine(mine, show, ROW, COL);
}
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;
}

Supongo que te gusta

Origin blog.csdn.net/2301_79178723/article/details/132596545
Recomendado
Clasificación