[C Language Foundation 7 - Array (3) Buscaminas]


prefacio

A continuación, este artículo repasa los conocimientos adquiridos anteriormente, tomando como ejemplo el juego del buscaminas.


1. ¿Qué es el barrido de minas?

Enciclopedia de Baidu : "Buscaminas" es un popular juego de rompecabezas, lanzado en 1992. El objetivo del juego es descubrir todas las cuadrículas que no son mías en el menor tiempo de acuerdo con los números que aparecen en las cuadrículas en las que se hizo clic y, al mismo tiempo, evitar pisar el trueno, pisar un trueno perderá todo el juego. .
inserte la descripción de la imagen aquí

2. Marco del programa

El marco general del programa se puede adaptar del de la sección anterior, y este marco también se puede utilizar como forma general.

2.1 Función principal

int main()
{
    
    
	int input = 0;
	srand((unsigned int)time(NULL));//产生随机数
	do
	{
    
    
		menu();//菜单提示
		printf("请输入 ==> ");//输入1或0,
		scanf("%d", &input);
		switch (input)//根据输入选择是否玩游戏
		{
    
    
		case 1:
			game();//玩游戏的具体实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}

2.2 Menú de funciones

Muestra el menú de avisos para recordar al jugador, 1 es para jugar el juego, 0 es para salir del juego

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

2.3 Juego de funciones

matriz mía , inicializada con el carácter '0'

  • La matriz de minas va seguida de 10 minas, la posición con minas está representada por el carácter '1' y la posición sin minas sigue siendo el carácter '0'
  • Las ubicaciones de 10 minas se generan aleatoriamente.

Array show , inicializado con caracteres '*'

  • El carácter '*' es para bloquear la posición donde se genera la mina, para que el jugador no pueda verla
  • El show array pone información sobre minas alrededor de coordenadas específicas en el tablero de ajedrez.
  • Si hay minas alrededor de las coordenadas, el número de minas se contará y se mostrará en esta coordenada.
void game()
{
    
    
	printf("开始玩游戏!\n");
	//扫雷游戏的实现
	//mine数组是用来存放布置好的雷的信息
	//就10个雷在什么位置
	char mine[ROWS][COLS] = {
    
     0 };//'0'
	//show数组是用来存放排查出的雷的信息
	//坐标周围有几个雷
	char show[ROWS][COLS] = {
    
     0 };//'*'

	//初始化棋盘
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	//打印棋盘
	//show_board(mine, ROW, COL);//全是字符'0'
	//show_board(mine, ROW, COL);//全是'*'
	//布置雷
	set_mine(mine, ROW, COL);//雷的数组
	//show_board(mine, ROW, COL);这是显示10个雷在哪里
	show_board(show, ROW, COL);//输出*暂时掩盖雷在哪里
	//排查雷
	find_mine(mine, show, ROW, COL);

	
}

2.3.2 Función init_board

El parámetro de inicialización init_board es para inicializar el tablero de ajedrez para que todo el tablero de ajedrez muestre los caracteres '0' y '*'

//初始化棋盘    参数:行数 列数  行数 列数 字符0或* 
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
    
    //set表示初始化传进来的字符是0 还是 *
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
    
    
		for (j = 0; j < cols; j++)
		{
    
    
			arr[i][j] = set;
		}
	}
}

2.3.3 Función show_board

show_board es para mostrar el tablero de ajedrez, puede ver la información de las minas en el tablero de ajedrez, así como el estado específico del tablero de ajedrez durante el barrido de minas posterior

//展示棋盘
void show_board(char arr[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 ", arr[i][j]);//打印棋盘每个元素
		}
		printf("\n");
	}
	printf("------------扫雷------------\n");
}

2.3.4 Función set_mine

La función set_mine organiza las minas, que generarán minas al azar en 10 posiciones de coordenadas en el tablero de ajedrez.

//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
    
    
	int count = EASY_COUNT;//布置10个雷
	int x = 0;//行坐标
	int y = 0;//列坐标
	while (count)//直到10个雷布置完成,退出循环
	{
    
    
		x = rand() % row + 1;//取模是0-8,加1就是1-9
		y = rand() % col + 1;
		if (mine[x][y] == '0')//是空的,就放雷,否则重新随机产生坐标位置
		{
    
    
			mine[x][y] = '1';//布置雷
			count--;
		}
	}
}

2.3.5 Función buscar_mina

La función find_mine es para buscar minas. Cada vez que el jugador limpia una mina, primero ingresa una coordenada y luego juzga si el carácter en la coordenada es 1:

  • 1 es mio, el juego termino
  • No 1, cuente el número de minas en 8 posiciones alrededor de las coordenadas y muéstrelas en las coordenadas en forma de caracteres
//排查雷
void find_mine(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)//在1-9的坐标范围内
		{
    
    
			if (mine[x][y] == '1')//确定坐标为字符'1',就是雷
			{
    
    
				printf("很遗憾,被炸死了\n");
				show_board(mine, ROW, COL);//显示所有雷的位置
				break;
			}
			else//不是字符1,坐标就不是雷,显示坐标周围有雷的个数
			{
    
    
				int count = get_mine_count(mine, x, y);//函数计算类的个数
				show[x][y] = count + '0';//周围有雷的个数+'0'就转换成字符了
				show_board(show, ROW, COL);//打印出来,每次扫雷后的棋盘
				win++;//扫了一次雷就++
			}
		}
		else//超过坐标范围
		{
    
    
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)//扫雷次数==9*9-10 71次就结束
	{
    
    
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);//显示雷的信息
	}
}

2.3.6 Función get_mine_count

La función get_mine_count cuenta el número de minas:

  • El carácter '1' significa que hay un trueno, el carácter '0' significa que no, y '1'-'0' es el número 1, que representa 1 trueno.
  • Agregue los caracteres en las 8 coordenadas alrededor de las coordenadas - 8 * '0', el resultado es el número de minas, que es un número entero
//统计坐标周围有雷的个数
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
    
    //坐标周围的8个地方减去'0',再相加的个数就是类的个数
	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. Archivo de encabezado.h

#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 //10个雷的个数
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void show_board(char arr[ROWS][COLS], int row, int col);
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);

4. Juega el juego

Los resultados de ejecución se muestran en la siguiente figura, que básicamente satisface las funciones del juego.
inserte la descripción de la imagen aquí

El código completo está en gitee:

C Language Foundation 7 - Array (3) Código completo de Buscaminas


Resumir

Este artículo solo cubre los juegos de barrido de minas más básicos. Después de aprender conocimientos más complejos más adelante, los juegos de barrido de minas se pueden mejorar. La idea general de escritura del juego del buscaminas se puede realizar con referencia al juego de tres piezas.

El conocimiento relacionado con los arreglos básicamente ha terminado, y el próximo artículo comienza a aprender el conocimiento relacionado con los operadores.

Supongo que te gusta

Origin blog.csdn.net/taibudong1991/article/details/123906619
Recomendado
Clasificación