Te llevará a darte cuenta del juego principal de búsqueda de minas - [Lenguaje C]

 Tabla de contenido

1. La idea de la realización del juego buscaminas.

Nota 1 

Nota 2 

2. La función realiza la función de búsqueda de minas.

2.1 Inicializar el tablero de ajedrez

2.2 Mostrar el tablero de ajedrez

2.3 Poniendo Trueno

2.4 Detección de minas

2.5 Devuelve el número de minas cercanas

3. Código fuente

3.1 juego.h

3.2 juego.c 

3.3 prueba.c


1. La idea de la realización del juego buscaminas.



Nota 1 

Aquí tomamos un tablero de ajedrez de 9*9 (que contiene 10 minas) para lograr (aquí también puedes personalizar el tamaño del tablero y la cantidad de minas

"Usamos "0" aquí para indicar que no es mío, y "1" para indicar que es mío"

! ! ! ——>Esta configuración es realmente beneficiosa, y se refleja en 2.5 (reflejada en la función de devolver el número de minas)


Nota 1: Cuando estamos jugando, hacemos clic en un asiento al azar, y mostrará cuántas de las 8 posiciones cercanas a esta posición son mías. Si se implementa la matriz bidimensional en este momento, habrá los siguientes problemas:

1. Si la ubicación en la que hicimos clic no es una mina, y solo una de las 8 ubicaciones cercanas es una mina, entonces queremos indicar que solo hay una mina cerca de esta ubicación, y debemos asignar esta ubicación a 1

2. Pero hay un problema en este momento: cuando mostramos el tablero de ajedrez después de barrer las minas una vez, dado que a esta posición se le asigna un valor de 1, el jugador no puede juzgar si esta posición es una mina o el número de minas.


En este momento, usamos el siguiente método para resolver ✌: use dos matrices bidimensionales para lograr

Una matriz bidimensional almacena minas y la otra matriz bidimensional almacena la información verificada.


Nota 2 

Aquí usamos una matriz bidimensional de 9*9 para mostrar la matriz, pero en este momento, si verificamos las dos filas y las dos columnas en el borde de la matriz bidimensional, cuando accedemos, el subíndice de la matriz aparecerá aparecer fuera de los límites


✌> En este momento, podemos definir directamente la matriz bidimensional de 11*11 para resolverlo muy bien



2. La función realiza la función de búsqueda de minas.

2.1 Inicializar el tablero de ajedrez

Nota: Aquí se deben inicializar dos matrices

           》Inicializamos la matriz de minas - almacenamos minas - todo a "0"

           》Inicializamos la matriz de espectáculos, almacenamos la información de detección de minas, todo en "✳" para mantener el tablero de ajedrez misterioso

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//这里的set可以自定义
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

2.2 Mostrar el tablero de ajedrez

Optimizar la visualización del tablero de ajedrez:

La fila superior del tablero de ajedrez —> imprime el número de columna

La primera fila del tablero de ajedrez —> imprime el número de fila

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int  i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}


2.3 Poniendo Trueno

Genere subíndices aleatorios de matriz bidimensional, organice 10 minas

Aquí tenemos que usar tres funciones para generar números aleatorios: rand, srand, time

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

2.4 Detección de minas

En la función de verificar minas, necesitamos implementar una función que devuelva cuántas minas hay en esta posición : GetMineCount

Después de devolver el valor, después de verificar las minas, muestra el número de minas cerca de esta posició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[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有几个雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

2.5 Devuelve el número de minas cercanas

Agregue un conocimiento: los caracteres se almacenan en valor ASCII en la memoria


"" 0 ", " 1 ", " 2 " corresponden a ASCII respectivamente 48, 49, 50 "

En este momento, hay conversiones mutuas entre números y caracteres.

1. > Número 2 + "0" = 2+48=50 ——> "2" número a carácter

2. > "2" - "0" = 2 caracteres a números

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	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. Código fuente

3.1 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);

3.2 juego.c 

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

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

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int  i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

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

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	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');
}


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

3.3 prueba.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];//存放布置好的雷
	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;
}

Lo que Xiaoyu implementó aquí es una versión simple de barrido de minas, sin la función recursiva, ¡y Xiaoyu lo mejorará después de que lo aprenda!

Si cree que el artículo es bueno, espero su enlace triple de un clic. Su aliento es la fuente de motivación para mi creación. ¡Trabajemos juntos y nos vemos en la cima! ! !

Supongo que te gusta

Origin blog.csdn.net/qq_58286439/article/details/130707564
Recomendado
Clasificación