Utilice el lenguaje C para implementar el buscaminas (perfecto)

Tabla de contenido

1. Concepto de juego y diseño.

2. Implementación de código de varias funciones.

      1. Crea un menú (menú --menú)

      2. Implementación de la función principal.

      3. Crea un tablero de ajedrez e inicialízalo (inicialización-inicial)

      4. Imprima el tablero de ajedrez (imprimir-mostrar)

      5. Organizar la ubicación de la mina (acuerdo---depósito)

      6. Verificar si hay minas (verificar---verificar)

----Los nombres de los identificadores en este artículo están todos en inglés y expresan su significado, ¡lo que facilita la comprensión de los lectores! ------

3. Resumen del código

        1. archivo test.c

        2. archivo juego.c

        3. archivo juego.h


1. Cómo jugar

Cómo jugar al juego del buscaminas: Dado un tablero de ajedrez, podemos verificarlo de acuerdo con la posición de coordenadas que ingresamos. Podemos elegir si deseamos limpiar las minas. Si es así, marcar las minas. De lo contrario, continuar. Si hay minas en esa posición , no hemos limpiado las minas. Luego, al ser explotado, el juego termina; si no es una mina, el número de minas circundantes se mostrará en la posición. Si no hay minas alrededor de la posición, se mostrará un espacio en blanco. Se mostrará la pantalla. Al mismo tiempo, se determinará que la situación de las posiciones circundantes es la misma (aquí usamos recursividad para implementarlo); Continúe investigando-----El juego se gana cuando solo hay truenos. ¡a bordo!

   Ideas de diseño:

        1. Al crear y definir el tablero de ajedrez, imprimimos aquí un tablero de ajedrez de 9 * 9, ¡usando una matriz bidimensional!

        2. ¡Necesitamos crear dos tableros de ajedrez, uno para almacenar minas (información de fondo) y otro para almacenar información para detectar minas (tablero de ajedrez mostrado)!

        3. Al inicializar el tablero de ajedrez, todos los tableros que almacenan truenos almacenarán primero el carácter '0', y todos los tableros de ajedrez que se muestran almacenarán primero el carácter '*'.

        4. Organice el trueno: organizado aleatoriamente por la computadora: ¡use el carácter '1' para representar el trueno!

        5. Comprueba si hay minas: Depende de los jugadores juzgar por sí mismos: ¡usa el carácter '#' para indicar la marca!

2. Implementación de cada código de función.

 1. Crear menú------

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

2. Implementación de la función principal-----

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

3. Crea un tablero de ajedrez e inicialízalo----

      Cree dos matrices bidimensionales al crear:

#define ROW 9
#define COL 9

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

//创建存放雷的棋盘
char depositboard[ROWS][COLS] = { 0 };
//创建排查雷的棋盘
char checkboard[ROWS][COLS] = { 0 };

    Inicialización del tablero de ajedrez:

//初始化棋盘
initboard(depositboard, ROWS, COLS,'0');
initboard(checkboard, ROWS, COLS, '*');


//初始化棋盘
void initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}

4. Imprime el tablero de ajedrez-----

//打印棋盘
displayboard(depositboard, ROW, COL);
printf("\n");
displayboard(checkboard, ROW, COL);

//打印棋盘
void displayboard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i++)  
	{
		printf(" %d ",i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf(" %d ", i);
			for (j = 1; j <= col; j++)
			{
				printf(" %c ", board[i][j]);
			}
			printf("\n");
	}
}

5. Organizar la ubicación de la mina-----

//布置雷
depositray(depositboard, ROW, COL);
displayboard(depositboard, ROW, COL);

//布置雷
void depositray(char board[ROWS][COLS], int row, int col)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

6. Compruebe si hay minas-----

//排查雷
checkray(depositboard, checkboard, ROW, COL);

//算周围棋子数量
char raysum(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
		+ board[x][y - 1] + board[x][y + 1]
		+ board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1])-'0'*7;
}
//递归实现空白
int check(char board1[ROWS][COLS], char board2[ROWS][COLS], int x, int y,int* count)
{
	(*count)--;
	board2[x][y] = raysum(board1, x, y);
	int i = 0;
	int j = 0;
	if (board2[x][y] == '0')
	{
		board2[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			if (i >= 1 && i <= ROW)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (j >= 1 && j <= COL)
					{
						if (i != x || j != y || (i == x && j != y) || (i != x && j == y))
						{
							if(board2[i][j]=='*')
							check(board1, board2, i, j, count);
						}
					}
				}
			}
		}
	}
	return count;
}
//排查雷
void checkray(char board1[ROWS][COLS],char board2[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请排查->\n");
	int count =row*col- RAY;
	while (count)
	{
		int ray = 0;
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			printf("是否排雷?--1表示排雷--否则不排\n");
			scanf("%d", &ray);
			if (ray == 1)
			{
				system("cls");
				board2[x][y] = '#';
				displayboard(board2, ROW, COL);
			}
			else {
				if (board1[x][y] == '1')
				{
					printf("你已经被雷炸死了\n");
					displayboard(board1, ROW, COL);
					break;
				}
				else
				{
					system("cls");
					check(board1, board2, x, y, &count);
					displayboard(board2, ROW, COL);
				}
			}
		}
		else printf("输入非法,请重新输入->\n");
	}
	if (count == 0)
	{
		printf("恭喜你,扫雷成功!\n");
		displayboard(board1, ROW, COL);
	}
}

 Implementación de una función que cuenta el número de rayos circundantes durante este proceso----raysum()----

//算周围棋子数量
char raysum(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
		+ board[x][y - 1] + board[x][y + 1]
		+ board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1])-'0'*7;
}

En este proceso se implementa una función que extiende recursivamente el área ---check()---

//递归实现空白
int check(char board1[ROWS][COLS], char board2[ROWS][COLS], int x, int y,int* count)
{
	(*count)--;
	board2[x][y] = raysum(board1, x, y);
	int i = 0;
	int j = 0;
	if (board2[x][y] == '0')
	{
		board2[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			if (i >= 1 && i <= ROW)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (j >= 1 && j <= COL)
					{
						if (i != x || j != y || (i == x && j != y) || (i != x && j == y))
						{
							if(board2[i][j]=='*')
							check(board1, board2, i, j, count);
						}
					}
				}
			}
		}
	}
	return count;
}

3. Resumen del código

  1. archivo test.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 depositboard[ROWS][COLS] = { 0 };
	//创建排查雷的棋盘
	char checkboard[ROWS][COLS] = { 0 };

	//初始化棋盘
	initboard(depositboard, ROWS, COLS,'0');
	initboard(checkboard, ROWS, COLS, '*');
	//打印棋盘
	/*displayboard(depositboard, ROW, COL);
	printf("\n");*/
	displayboard(checkboard, ROW, COL);
	printf("\n");
	//布置雷
	depositray(depositboard, ROW, COL);
	displayboard(depositboard, ROW, COL);
	//排查雷
	checkray(depositboard, checkboard, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择->\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

2. 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;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}
//打印棋盘
void displayboard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i++)  
	{
		printf(" %d ",i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf(" %d ", i);
			for (j = 1; j <= col; j++)
			{
				printf(" %c ", board[i][j]);
			}
			printf("\n");
	}
}
//布置雷
void depositray(char board[ROWS][COLS], int row, int col)
{
	int count = RAY;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
//算周围棋子数量
char raysum(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
		+ board[x][y - 1] + board[x][y + 1]
		+ board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1])-'0'*7;
}
//递归实现空白
int check(char board1[ROWS][COLS], char board2[ROWS][COLS], int x, int y,int* count)
{
	(*count)--;
	board2[x][y] = raysum(board1, x, y);
	int i = 0;
	int j = 0;
	if (board2[x][y] == '0')
	{
		board2[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			if (i >= 1 && i <= ROW)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (j >= 1 && j <= COL)
					{
						if (i != x || j != y || (i == x && j != y) || (i != x && j == y))
						{
							if(board2[i][j]=='*')
							check(board1, board2, i, j, count);
						}
					}
				}
			}
		}
	}
	return count;
}
//排查雷
void checkray(char board1[ROWS][COLS],char board2[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请排查->\n");
	int count =row*col- RAY;
	while (count)
	{
		int ray = 0;
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			printf("是否排雷?--1表示排雷--否则不排\n");
			scanf("%d", &ray);
			if (ray == 1)
			{
				system("cls");
				board2[x][y] = '#';
				displayboard(board2, ROW, COL);
			}
			else {
				if (board1[x][y] == '1')
				{
					printf("你已经被雷炸死了\n");
					displayboard(board1, ROW, COL);
					break;
				}
				else
				{
					system("cls");
					check(board1, board2, x, y, &count);
					displayboard(board2, ROW, COL);
				}
			}
		}
		else printf("输入非法,请重新输入->\n");
	}
	if (count == 0)
	{
		printf("恭喜你,扫雷成功!\n");
		displayboard(board1, ROW, COL);
	}
}

3. archivo juego.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9

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

#define RAY 2
//初始化棋盘
void initboard(char board[ROWS][COLS], int row, int col, char ret);
//打印棋盘
void displayboard(char board[ROWS][COLS], int row, int col);
//布置雷
void depositray(char board[ROWS][COLS], int row, int col);
//排查雷
void checkray(char board1[ROWS][COLS],char board2[ROWS][COLS], int row, int col);

Jeje, tómate tu tiempo, paso a paso, no te preocupes, piensa bien, si este artículo te ha inspirado, dame un "tres en uno con un clic"

Bueno, eso es todo, ¡adiós!

Supongo que te gusta

Origin blog.csdn.net/m0_71676870/article/details/130597547
Recomendado
Clasificación