【C】Juego de Buscaminas del Reino del Idioma C

①Prólogo

Buscaminas es un juego apto para todas las edades.
El juego consiste en organizar aleatoriamente un cierto número de minas en una matriz cuadrada de 9×9 (principiante), 16×16 (intermedio), 16×30 (avanzado) o de tamaño personalizado (principiante). ) (10 para intermedio, 40 para intermedio y 99 para avanzado). Luego, los jugadores giran los bloques uno por uno para encontrar todas las minas como objetivo final del juego. Si el jugador da vuelta un bloque que contiene una mina, el juego termina.
Después de comprender cómo se juega, pensemos en cómo implementarlo en lenguaje C. (Tome 9*9 como ejemplo)

Insertar descripción de la imagen aquí

② Pasos de implementación del juego

1. Crear un menú menú
2. Definir dos matrices de tipo char mine[ ] y show[ ] La
matriz mine se usa para almacenar información de posición de la mina, y la matriz show se usa para almacenar información sobre la cantidad de minas alrededor de las que no son mías. posiciones.
3. Inicialice la mina a la derecha y muestre los conjuntos.
El conjunto de minas se inicializa con el carácter 0 y el conjunto de espectáculos se inicializa con el carácter *.
4. Organice la mina y almacene la información en el conjunto de minas. La posición de la mina cambia del carácter 0 al carácter 1.
5. Eliminación de minas
6. Imprimir matriz

1.Hacer menú menú

La interfaz del menú es como el menú que te entrega el camarero en un restaurante. Puedes elegir según el contenido del menú.
Selecciona 1 para iniciar el juego; selecciona 0 para finalizar el juego.

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

2. Realizar la remoción de minas en varias filas y columnas

Primero, crearemos dos matrices de tipo char, mine[ ] y show[ ]. La
matriz mine se usa para almacenar la información de ubicación de las minas, y la matriz show se usa para almacenar información sobre la cantidad de minas alrededor de ubicaciones que no son minas.

    char mine[9][9] = {
    
     0 };
	char show[9][9] = {
    
     0 };

Pero como queremos lograr una remoción de minas de varias filas y columnas, y para la conveniencia de modificar el número de filas, columnas y minas en el futuro, también podríamos usar
la definición de macro #define

#define ROW 9//行
#define COL 9//列
#define LANDMINE 10//雷的个数

Y para la conveniencia de buscar información posterior sobre la posición no mía (por ejemplo, las dos filas y dos columnas más externas de la matriz 9*9 tienen menos de 8 posiciones a su alrededor, por lo que mientras busca información alrededor de la posición no mía posición más adelante, también es necesario determinar las posiciones circundantes. Si está fuera de los límites), también puede agregar dos filas y dos columnas que No es necesario juzgar si las posiciones circundantes de una determinada posición están fuera de los límites).

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

Efecto:
Insertar descripción de la imagen aquí

3.Inicialización

Después de definir las dos matrices, inicialícelas.
La matriz mine se inicializa con los caracteres 0, la matriz show se inicializa con los caracteres * y set se usa para recibir los caracteres 0 y *.

    Initiate_board(mine, ROWS, COLS, '0');
	Initiate_board(show, ROWS, COLS, '*');
void Initiate_board(char mine[ROWS][COLS], int rows, int cols, char set)
{
    
    
	int i, j;
	for (i = 0; i < rows; i++)
		for (j = 0; j < cols; j++)
			mine[i][j] = set;
}

4. Diseñar minas

	Set_mine(mine, ROW, COL);

1. Tenga en cuenta que las minas de diseño solo se usan en el área azul claro 9 * 9 en la imagen de arriba y no en el área azul oscuro, por lo que al pasar parámetros, se pasan las filas y columnas originales fila y columna en lugar de agregando dos filas Dos columnas de filas y columnas

2. Organizar n minas significa generar n coordenadas aleatorias diferentes que cumplan con los requisitos, por lo que se debe usar la función rand (), y la premisa de uso es usar la función srand (), por lo que para generar n coordenadas aleatorias, entonces Debe llamar a srand((unsigned int)time(NULL)) una vez en la función principal ;

void Set_mine(char mine[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	while (i < LANDMINE)
	{
    
    
		int x = rand() % row + 1;//使得x的范围在1--row
		int y = rand() % col + 1;//使得y的范围在1--col
		if (mine[x][y] == '0')
		{
    
    
			mine[x][y] = '1';
			i++;
		}
	}
}

5. Imprimir matriz

	Display_board(mine, ROW, COL);

Al imprimir una matriz , solo se imprime el área azul claro en la figura anterior y no es necesario imprimir el área azul oscuro. Por lo tanto, al pasar parámetros , se pasan las filas y columnas originales fila y columna , en lugar de agregar dos filas y dos columnas filas y cols.

Para que podamos saber rápidamente en qué fila y columna se encuentra una determinada posición, podemos utilizar el siguiente código

void Display_board(char mine[ROWS][COLS], int row, int col)
{
    
    
	int i, j;
	printf("\n----------扫雷----------\n");
	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 ", mine[i][j]);//打印数组
		printf("\n");
	}
	printf("----------扫雷----------\n");
	printf("\n");
}

Representación:
Insertar descripción de la imagen aquí

6. Comience a desminar

Primero ingrese una coordenada y determine si la posición es una mina en el conjunto de minas (es decir, si la posición es el carácter 1). Si es así, aparecerá el mensaje "Desafortunadamente, lo mataron", si no, encuentre cuántas personas circundantes posiciones que hay .mine, y pasar el número de minas a la posición correspondiente del show array

	Search_mine(mine, show, ROW, COL);
int Search_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    
    
	int x, y;
	int i = 0;
	while (i < ROW * COL - LANDMINE)//ROW * COL - LANDMINE表示非雷的个数
	{
    
    
		printf("请输入想要查找的位置:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (mine[x][y] == '1')//踩到炸弹后,直接退出循环
			{
    
    
				printf("\n很遗憾,您被炸死了\n");
				Display_board(mine, ROW, COL);
				break;
			}
			else if (show[x][y] != '*')
			{
    
    
				printf("该位置已排雷,请重新输入:\n");
			}
			else
			{
    
    
				int count = landmine_count(mine, x, y);//landmine_count()函数在下面介绍
				show[x][y] = count + '0';//使得该位置的数字几变成字符几
				Display_board(show, ROW, COL);
				i++;
			}
		}
		else
		{
    
    
			printf("输入错误,请重新输入\n");
		}
	}
	if (i == ROW * COL - LANDMINE)//当数组中的非雷位置全都排出,即为排雷成功
	{
    
    
		printf("\n恭喜你,扫雷成功\n");
		Display_board(mine, ROW, COL);
	}
}

7. función landmine_count()

Debido a que la matriz de minas tiene todos los caracteres 0 o 1, y el carácter n menos el carácter 0 = número n, el número de minas es la suma de los caracteres en las 8 posiciones alrededor de la posición menos 8*carácter 0

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

③Implementación de código modular

1.texto.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 };
	//初始化
	Initiate_board(mine, ROWS, COLS, '0');
	Initiate_board(show, ROWS, COLS, '*');
	//Display_board(mine, ROW, COL);
	Display_board(show, ROW, COL);
	//布置雷
	Set_mine(mine, ROW, COL);
	Display_board(mine, ROW, COL);
	//扫雷
	Search_mine(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;
}

2.juego.h

#pragma once

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

#define LANDMINE 10

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

//初始化
void Initiate_board(char mine[ROWS][COLS], int rows, int cols, char set);
//打印
void Display_board(char mine[ROWS][COLS], int row, int col);
//布置雷
void Set_mine(char mine[ROWS][COLS], int row, int col);
//扫雷
int Search_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);


3.juego.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

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

void Display_board(char mine[ROWS][COLS], int row, int col)
{
    
    
	int i, j;
	printf("\n----------扫雷----------\n");
	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 ", mine[i][j]);
		printf("\n");
	}
	printf("----------扫雷----------\n");
	printf("\n");
}

void Set_mine(char mine[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	while (i < LANDMINE)
	{
    
    
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
    
    
			mine[x][y] = '1';
			i++;
		}
	}
}

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

int Search_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    
    
	int x, y;
	int i = 0;
	while (i < ROW * COL - LANDMINE)
	{
    
    
		printf("请输入想要查找的位置:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (mine[x][y] == '1')
			{
    
    
				printf("\n很遗憾,您被炸死了\n");
				Display_board(mine, ROW, COL);
				break;
			}
			else if (show[x][y] != '*')
			{
    
    
				printf("该位置已排雷,请重新输入:\n");
			}
			else
			{
    
    
				int count = landmine_count(mine, x, y);
				show[x][y] = count + '0';
				Display_board(show, ROW, COL);
				i++;
			}
		}
		else
		{
    
    
			printf("输入错误,请重新输入\n");
		}
	}
	if (i == ROW * COL - LANDMINE)
	{
    
    
		printf("\n恭喜你,扫雷成功\n");
		Display_board(mine, ROW, COL);
	}
}

Supongo que te gusta

Origin blog.csdn.net/qq_75000174/article/details/132045526
Recomendado
Clasificación