Realiza el buscaminas principal

A través del aprendizaje de matrices bidimensionales y algunos conocimientos adquiridos previamente, se realiza el minijuego principal del buscaminas (9×9).

                                                                                                           
 

 toda la idea

menú menú (uno no es suficiente, otro)
Usa una matriz bidimensional para crear dos tableros de ajedrez (11×11), así que por qué no (9×9), el siguiente código tiene una explicación.
initboard inicializa el tablero de ajedrez (char/int)
4 diaplayboard imprime el tablero de ajedrez
5 setmine organiza las minas
6 findmine cuenta el número de minas alrededor de la
implementación de la función en game.c y la declaración de la función en game.h . Las llamadas a funciones y las implementaciones de funciones parciales se realizan en test.c.
Defina macros ROW, COL, ROWS, COLS para facilitar el cálculo.

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


1 Implementación del menú

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void menu()
{
	printf("*****************************\n");
	printf("******    1. play   *********\n");
	printf("******    0. exit   *********\n");
	printf("*****************************\n");

}


void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));//布置雷的时候使用(随机)
	do
	{
		menu();
		printf("请选择》\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}//switch用不惯的也可以用多条件if语句


	} while (input);
}

2.1  El primer tablero de ajedrez
se usa para almacenar la información de colocación de minas, las minas son '1', no las minas son '0', ¿por qué se deben colocar los caracteres '1' y '0'? miremos hacia abajo

2.2  El segundo tablero de ajedrez
Cada vez que el jugador da un paso, se utiliza para mostrar información sobre el número de minas alrededor. Ponga "*" en las coordenadas de las minas que no han sido remadas, y se mostrará el número de minas a su alrededor si las minas han sido remadas.

2.3  Selección del tablero de ajedrez ( char )
1 y 0 son originalmente números enteros, podemos considerar usar el tipo int para crear, pero dado que el tablero de ajedrez se imprimirá con una función más adelante, usaremos char como un todo. 1 y 0 se reemplazan por '0' y '1'.

 

 

Conectado a la creación del tablero de ajedrez anterior
Cuando ocurra la situación anterior, generaremos acceso fuera de los límites al calcular el número de minas circundantes. (11×11) puede evitar este problema.

3 Inicializa la placa 

Seleccione el tipo de carácter para inicializar el tablero de ajedrez, una función puede imprimir dos tableros de ajedrez

//test.c
initboard(mine, ROWS, COLS, '0');
initboard(show, ROWS, COLS, '*');
//game.c中的函数实现
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j]=set;
		}
	}
}

 4 Imprime el tablero de ajedrez

//test.c
displayboard(mine, ROW, COL);//这里我们打印棋盘是(9*9)
displayboard(show, ROW, COL);
//game.c
void displayboard(char board[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 ", board[i][j]);
		}
		printf("\n");
	}
}

 5 Colocar minas (al azar)

//game.h
#include<time.h>
#include<stdlib.h>

srand((unsigned int)time(NULL));//test.c
//game.c
void setmine(char mine[ROWS][COLS], int row, int col)
{
	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}

	}
}

 Después de diseñar el trueno, podemos llamar a la función de tablero de visualización para imprimir el tablero de ajedrez para verlo.

6 Encuentra minas ('0' y '1' solo necesitan convertir los números circundantes en números enteros y agregarlos al calcular el número de minas circundantes)

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-10)
	{
		printf("请输入要排查的坐标");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row&&y > 0 && y <= col)
		{
			if (mine[x][y] != '1')
			{
				int m =getmine(mine,x,y);//用来计算周围雷的数量
				show[x][y] = m+'0';//整型数字转换成字符数字
				displayboard(show, ROW, COL);
				win++;
			}
			else
			{
				printf("您被发往一趟去西天取经的航班,祝你旅途愉快\n");
				displayboard(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row*col - 10)
	{
		printf("你有当工兵的好天赋\n");
		displayboard(mine, ROW, COL);
	}
}

 conseguir el mío

int getmine(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类型,将字符数字转化为整型数字(减去字符0):eg:'1'-'0'=1(感兴趣的同学可以去查查ascall码表)
}

 Visualización completa del código

juego.h

#pragma once
#include<stdio.h>
#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 mind[ROWS][COLS], int row, int col);

void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);


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

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;
	int j = 0;
	
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j]=set;
		}
	}
}
void setmine(char mine[ROWS][COLS], int row, int col)
{
	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}

	}
}
int getmine(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类型,将字符数字转化为整型数字(减去字符0):eg:'1'-'0'=1(感兴趣的同学可以去查查ascall码表)
}
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-10)
	{
		printf("请输入要排查的坐标");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row&&y > 0 && y <= col)
		{
			if (mine[x][y] != '1')
			{
				int m =getmine(mine,x,y);
				show[x][y] = m+'0';
				displayboard(show, ROW, COL);
				win++;
			}
			else
			{
				printf("您被发往一趟去西天取经的航班,祝你旅途愉快\n");
				displayboard(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入\n");
		}
	}
	if (win == row*col - 10)
	{
		printf("你有当工兵的好天赋\n");
		displayboard(mine, ROW, COL);
	}
}


void displayboard(char board[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 ", board[i][j]);
		}
		printf("\n");
	}
}

 

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] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	initboard(mine, ROWS, COLS, '0');
	initboard(show, ROWS, COLS, '*');
	setmine(mine, ROW, COL);
	displayboard(mine, ROW, COL);
	displayboard(show, ROW, COL);

	
	findmine(mine, show, ROW, COL);
	
	
}

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


	} while (input);
}
int main()
{
	test();
	return 0;
}

Este es el final del contenido de hoy. Si crees que es útil para ti, dale me gusta y síguelo. Este también es mi primer blog. Tu apoyo será mi mayor motivación. Finalmente, gracias por mirar. Nos vemos la próxima vez.

                                                        

Supongo que te gusta

Origin blog.csdn.net/weixin_63451038/article/details/121479206
Recomendado
Clasificación