Juego Buscaminas (nivel principiante) lenguaje c

Hola a todos, mi nombre es sy. Hoy les traeré el juego buscaminas (nivel principiante). Al igual que el juego de ajedrez de tres piezas, el juego buscaminas también es un pequeño proyecto que los principiantes en lenguaje C deberían probar. El proyecto involucra dos- matrices dimensionales El uso de definiciones de macros, llamadas a funciones, uso de declaraciones de bucle de selección de ramas, etc., también es muy interesante de jugar, ¡echemos un vistazo! ~

Primero, introduzcamos las reglas y la estructura del juego del buscaminas. Creo que todos han jugado al juego del buscaminas cuando eran niños. El juego básico del buscaminas es una matriz cuadrada de 9 * 9. Se almacenan 10 minas al azar en la matriz, y el jugador selecciona aleatoriamente una coordenada. Para comprobar si hay minas, si las coordenadas seleccionadas no son minas, se mostrará el número total de minas en las ocho ubicaciones circundantes en esa posición. Si la posición seleccionada son minas, se mostrará el jugador.

Asesinado por una bomba. El pequeño juego que escribimos hoy es implementar una matriz cuadrada de buscaminas de 9 * 9, y el entorno de uso es Visual Studio 2019.


 

A continuación describimos el proceso de implementación según algunos códigos de bloque:

1. Menú de funciones del menú Imprimir()

Esta función utiliza la instrucción de rama de cambio para seleccionar. Utilice la función scanf para ingresar un número y pasarlo a la expresión de la variable de selección de cambio. Si el jugador ingresa '1', ingresará al juego. Si selecciona '0', saldrá del juego. Si selecciona otros números, se mostrará un error de selección. Inicie la selección nuevamente.

void menu()
{
	printf("***************************************\n");
	printf("********** 请选择是否开始游戏:**********\n");
	printf("***********  1.开始游戏  **************\n");
	printf("***********  0.退出游戏  **************\n");
	printf("***************************************\n");
}

2. Implementar la función de proceso del juego juego () 

Después de seleccionar '1', ingrese esta función. Definimos dos matrices bidimensionales de tipo personaje, tablero y espectáculo. La matriz del tablero es responsable de organizar las minas en el fondo, y la matriz del espectáculo se muestra al jugador, y junto con la matriz del tablero, completa la tarea de detectar minas. Aquí, las macros se utilizan para definir las filas y columnas de dos matrices bidimensionales, y se definen dos conjuntos de macros. Entre ellas, un conjunto de FILAS y COLS se utilizan principalmente para inicializar la matriz cuadrada. Podemos ver que las filas y las columnas de FILAS y COLS representan 11*11, que es para evitar que las coordenadas crucen el límite cuando se busquen minas en el futuro (como se muestra en la figura siguiente, 1, 2 y 3 cruzarán el límite). La función InitBoard inicializa dos matrices cuadradas, pasando los dos caracteres '0' y '*' respectivamente y usando el parámetro char ret para recibirlos, de modo que una función pueda definir dos matrices cuadradas. La función DispalyBoard imprime y muestra la matriz de espectáculos, la función SetMine organiza las minas y la función FingMine soluciona problemas de las minas.

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void game()
{
	char board[ROWS][COLS];
	char show[ROWS][COLS];
	InitBoard(board, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(board, ROW, COL);
	//排查雷
	FindMine(board, show, ROW, COL);
}

3. Función principal

En la función principal, srand((unsigned int)time(NULL)) inicializa la semilla de la función aleatoria. Aquí tomamos el tiempo como semilla aleatoria. Dado que el tiempo cambia constantemente, se pueden generar diferentes valores aleatorios. Después de eso, nuestro La computadora organiza el trueno al azar. La implementación de valores consiste en generar una semilla de tiempo a través del generador de valores aleatorios srand () y luego usar rand () para generar un número aleatorio. Aquí unsigned int es un tipo de conversión forzada, lo que significa forzar la semilla del parámetro a un tipo entero sin signo. Generalmente usamos el valor de retorno de tiempo (NULL) como semilla para inicializar el valor inicial de rand (). Usamos el bucle do... while() para ejecutarlo una vez antes de juzgar.

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

A continuación implementamos la implementación específica del bloque de funciones:

1. Utilice la función InitBoard() para inicializar las dos matrices cuadradas.

Utilice un bucle for para recorrer la matriz bidimensional. Tenga en cuenta que las filas y columnas son 11*11 durante la inicialización para evitar coordenadas fuera de los límites en el futuro. ret se utiliza para recibir caracteres entrantes. La siguiente imagen muestra la matriz de la placa inicializada a '0'

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

2. Utilice la función DisplayBoard() para mostrar e imprimir la matriz bidimensional.

Para facilitar mejor que el jugador ingrese las coordenadas, usamos un bucle for para imprimir las coordenadas horizontales y verticales, y luego imprimimos la matriz cuadrada que el jugador ve para que seleccione el punto de desminado.

void DisplayBoard(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= row; i++)//打印横坐标
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i <=row; i++)
	{
		printf(" %d ", i);//打印竖坐标
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", show[i][j]);//遍历打印‘*’
		}
		printf("\n");
	}
}

3. Utilice la función SetMine() para organizar minas.

Realícelo en la matriz del tablero, defina las coordenadas xey, use una macro para asignar el número de truenos al conteo del contador y use un bucle while.x=rand()%row+1 significa que x organiza aleatoriamente los truenos entre 1 y 9. La abscisa (rand()%5 significa que el número generado aleatoriamente es 0~4, y se necesita +1 para organizar la mina en una matriz cuadrada de 9*9). La declaración if determina si las coordenadas apuntadas por x e y son los caracteres '0' (lo que significa que está vacío), puedes almacenar minas, contarlas hasta que disminuya a cero y el ciclo se detenga. La siguiente imagen muestra cómo organizar 10 minas.

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = MINE_COUNT;//计数器
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//赋值字符‘1’
		}
		count--;//布置完一个雷减一
	}
}

4. Utilice la función FindMine() para solucionar problemas de minas

Pase el tablero de matriz bidimensional y muestre. Solo necesita verificar 9 * 9 para las filas y columnas. Dado que las coordenadas deben verificarse continuamente, se usa un bucle while. Win resta el número de truenos de las filas restantes. y columnas. Ingrese al bucle e ingrese las coordenadas requeridas a buscar, si las coordenadas están dentro del rango legal y si el contenido de coordenadas especificado es '1', se imprimirá la información sobre la muerte. En este momento, el Se debe mostrar la matriz cuadrada del tablero donde están dispuestas las minas. Si no es '1', entonces las minas no fueron pisadas. , muestra el número total de minas en las ocho ubicaciones circundantes en esta posición (la función GetMineCount() es utilizado aquí para calcular), asigne el valor de retorno del cálculo a c y muestre los números de caracteres (expresados ​​en ASCII, el número de carácter debe ser el número mismo + Carácter '0'), gane + 1 después de verificar una posición. Si las coordenadas ingresadas son ilegales, se mostrará volver a ingresar; si el número de victorias es igual al número total de matrices cuadradas, el número de minas, esto demuestra que el desminado fue exitoso.

void FindMine(char board[ROWS][COLS],char show[ROWS][COLS],int row, int col)
{
	int win = 0;
	while (win<row*col-MINE_COUNT)
	{
		int x = 0;
		int y = 0;
		printf("请输入要查找的坐标:\n");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(board, ROW, COL);
				break;
			}
			else
			{
				//如果没有碰到雷,则计算它周围的雷个数
				int c = GetMineCount(board, x, y);
				show[x][y] = c + '0';//在当前处显示周围雷的个数
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
			break;
		}
		if (win == row * col - MINE_COUNT)
		{
			printf("恭喜你,排雷成功\n");
			DisplayBoard(board, ROW, COL);
		}
	}
}

5. Utilice la función GetMineCount() para calcular el número de minas alrededor de las coordenadas seleccionadas. 

'0'-'0'=0; '1'-'0'=1; por lo tanto, para comprobar las 8 coordenadas circundantes, es necesario restar ocho caracteres de '0'. En la imagen de abajo, después de ingresar las coordenadas de 3 5, se muestra 2, lo que significa que hay dos minas alrededor.

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

El código se muestra a continuación en archivos separados:

archivo prueba.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("***************************************\n");
	printf("********* 请选择是否开始游戏:**********\n");
	printf("***********  1.开始游戏  **************\n");
	printf("***********  0.退出游戏  **************\n");
	printf("***************************************\n");
}
void game()
{
	char board[ROWS][COLS];
	char show[ROWS][COLS];
	InitBoard(board, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(board, ROW, COL);
	//排查雷
	FindMine(board, show, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

archivo juego.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS],int rows,int cols,char ret)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}
void DisplayBoard(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= row; i++)//打印横坐标
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i <=row; i++)
	{
		printf(" %d ", i);//打印竖坐标
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", show[i][j]);//遍历打印‘*’
		}
		printf("\n");
	}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = MINE_COUNT;//计数器
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//赋值字符‘1’
		}
		count--;//布置完一个雷减一
	}
}
void FindMine(char board[ROWS][COLS],char show[ROWS][COLS],int row, int col)
{
	int win = 0;
	while (win<row*col-MINE_COUNT)
	{
		int x = 0;
		int y = 0;
		printf("请输入要查找的坐标:\n");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(board, ROW, COL);
				break;
			}
			else
			{
				//如果没有碰到雷,则计算它周围的雷个数
				int c = GetMineCount(board, x, y);
				show[x][y] = c + '0';//在当前处显示周围雷的个数
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
			break;
		}
		if (win == row * col - MINE_COUNT)
		{
			printf("恭喜你,排雷成功\n");
			DisplayBoard(board, ROW, COL);
		}
	}
}
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
	return board[x - 1][y] + board[x - 1][y - 1] +
		board[x][y - 1] + board[x + 1][y - 1] +
		board[x + 1][y] + board[x + 1][y + 1] +
		board[x][y + 1] + board[x - 1][y + 1] - 8 * '0';
}

archivo juego.h

#pragma once
#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_COUNT 10
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ret);
void DisplayBoard(char show[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);

¡Gracias a todos por leer! ¡Bienvenidos a todos los grandes y amigos para que brinden sugerencias y soporte técnico en el área de comentarios ~! !

 

Supongo que te gusta

Origin blog.csdn.net/m0_74475605/article/details/131955233
Recomendado
Clasificación