Lenguaje C (buscaminas)


inserte la descripción de la imagen aquí

proceso de desarrollo

  • Preparación
  • Mostrar resultados

Preparación:
inserte la descripción de la imagen aquí
game.h un archivo de encabezado -> declara la función
test.c como el archivo principal
game.c como el archivo de implementación de la función

Mostrar resultados
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

ideas de desarrollo

  • interfaz de menú

  • Impresión de interfaz de juego (matriz bidimensional)

  • engendro aleatorio de truenos

  • Desminado (y juzgando el número de minas alrededor)

  • condición de victoria

La idea general es así, analicémosla paso a paso

interfaz de menú

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

aqui hay que seguir Recibir entrada del usuario, cuando sea 1, ingrese al juego, cuando sea 0, salga del programa,
piense directamente en el juicio de declaración condicional, aquí usamos el interruptor

Continuo : después de que el usuario termina el juego, el menú se puede imprimir nuevamente para que el usuario elija

Esta operación es, por supuesto, la parte central del proyecto, situada enfunción principaladentro

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("退出游戏");
			break;
		default:
			printf("输入有误!!!");
			break;
		}
	} while (input);

	return 0;
}

Impresión de la interfaz del juego.

Por supuesto, aquí se usa una matriz bidimensional, pero tenemos que considerar si puede lograr el efecto de desminado desinformado si solo se usa una matriz.
Por supuesto, una matriz no es posible, por lo que tenemos que creardos matrices,
uno es real y el otro se muestra al usuario

	char mine[ROWS][COLS] = {
    
     0 };//存放布置好的雷的信息
	char show[ROWS][COLS] = {
    
     0 };//存放排查出雷的信息

Aquí tenemos que pensarlo primero. Si la matriz es de 9 × 9, cuando esté en el borde, seráfuera de los límites
Podemos crear una matriz de 11 × 11, de los cuales no usamos el más externo, solo establecemos como valor predeterminado

#define ROW 9
#define COL 9

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

Inicialización del mapa

	//mine 数组在没有布置雷的时候全为 0
	InitBoard(mine, ROWS, COLS, '0');
	//show 数组在没有排查雷的时候全为 *
	InitBoard(show, ROWS, COLS, '*');

Nuestra función InitBoard es:

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

impresión de mapas

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    
    
	int i = 0, j = 0;
	printf("-----------扫雷游戏--------------\n");
	//打印上面0~9注释
	for (j = 0; j <= col; j++)
	{
    
    
		printf("%d ", j);
	}
	
	printf("\n");
	for (i = 1; i <= row; i++)
	{
    
    
		printf("%d ", i); //打印竖着1~9的注释
		for (j = 1; j <= col; j++)
		{
    
    
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----------扫雷游戏--------------\n");
}

engendro aleatorio de truenos

Es fácil para nosotros pensar que se trata de generar números aleatorios y cambiar los valores de los elementos de su matriz.
Eso es todofunción srand()

	//设置随机数的起始
	srand((unsigned int)time(NULL));

Función generada aleatoriamente:

Definimos EASY_COUNT (el número de minas) en el archivo de cabecera

void SetMine(char board[ROWS][COLS], int row, int col)
{
    
    
	int count = EASY_COUNT;
	//横纵坐标1~9
	while (count)
	{
    
    
		int d = rand() % row + 1;
		int c = rand() % col + 1;

		//随机生成十个雷,雷:1
		if (board[d][c] == '0')
		{
    
    
			board[d][c] = '1';
			count--;
		}
	}
}

Buscaminas y determina las condiciones de victoria.

Dragaminas
Deje que el usuario ingrese una coordenada y juzgue su valor

  • Si la coordenada en la matriz show es *, la coordenada se ha borrado
  • Si la coordenada en la matriz de minas es 1, no podrá ser bombardeada por la mía.
  • De lo contrario, determine cuántas minas hay en la matriz de minas y muestre el número en las coordenadas de la matriz de visualización

Determinar si ingresar coordenadas repetidamente

			if (show[x][y] != '*')
			{
    
    
				printf("该坐标已经排查过了,请重新输入:>\n");
			}

El código fallido es muy simple, solo un juicio.

				if (mine[x][y] == '1')	//是雷
				{
    
    
					printf("被炸死咯\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}

La función de juzgar cuántas minas hay alrededor es
inserte la descripción de la imagen aquí

int get_mine_count(char board[ROWS][COLS], int x, int y)
{
    
    
	return (board[x - 1][y] +
		board[x - 1][y - 1] +
		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]- 8*'0');
}

La función de toda la operación es

void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
    
    
	int x = 0, y = 0;
	int a = 0, b = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数
	{
    
    
		printf("请输入排查的坐标:>\n");
		scanf("%d %d", &a, &b);
		x = a + 1;
		y = b + 1;

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (show[x][y] != '*')
			{
    
    
				printf("该坐标已经排查过了,请重新输入:>\n");
			}
			else
			{
    
    
				if (mine[x][y] == '1')	//是雷
				{
    
    
					printf("被炸死咯\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}
				else //不是雷         '0'-'0'=0     '1'-'0'=1  字符->整型   
								// ASCII码值分别为 '1':49     '0':48
				{
    
    
					int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷
					show[x][y] = count + '0';//转换成数字字符
					//printf("%c\n", count + '0');
					DisplayBoard(show, ROW, COL);
					win++;
				}
			}
		}
		else
		{
    
    
			printf("输入坐标错误,请重新输入:>\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
    
    
		printf("恭喜你,扫雷成功!!!\n");
		DisplayBoard(mine, ROW, COL);
	}
}

integración de código

prueba.c

#include "game.h"

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

void game()
{
    
    
	char mine[ROWS][COLS] = {
    
     0 };//存放布置好的雷的信息
	char show[ROWS][COLS] = {
    
     0 };//存放排查出雷的信息
	//初始化数组的内容为指定内容
	//mine 数组在没有布置雷的时候全为 0
	InitBoard(mine, ROWS, COLS, '0');
	//show 数组在没有排查雷的时候全为 *
	InitBoard(show, ROWS, COLS, '*');

	//DisplayBoard(mine,ROW, COL);
	//设置雷
	SetMine(mine, ROW, COL);
	//展示
	DisplayBoard(show, ROW, COL);
	//排雷
	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("退出游戏");
			break;
		default:
			printf("输入有误!!!");
			break;
		}
	} while (input);

	return 0;
}

juego.c

#include "game.h"

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

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

void SetMine(char board[ROWS][COLS], int row, int col)
{
    
    
	int count = EASY_COUNT;
	//横纵坐标1~9
	while (count)
	{
    
    
		int d = rand() % row + 1;
		int c = rand() % col + 1;

		//随机生成十个雷,雷:1
		if (board[d][c] == '0')
		{
    
    
			board[d][c] = '1';
			count--;
		}
	}
}

int get_mine_count(char board[ROWS][COLS], int x, int y)
{
    
    
	return (board[x - 1][y] +
		board[x - 1][y - 1] +
		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]- 8*'0');
}


void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
    
    
	int x = 0, y = 0;
	int a = 0, b = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数
	{
    
    
		printf("请输入排查的坐标:>\n");
		scanf("%d %d", &a, &b);
		x = a + 1;
		y = b + 1;

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (show[x][y] != '*')
			{
    
    
				printf("该坐标已经排查过了,请重新输入:>\n");
			}
			else
			{
    
    
				if (mine[x][y] == '1')	//是雷
				{
    
    
					printf("被炸死咯\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}
				else //不是雷         '0'-'0'=0     '1'-'0'=1  字符->整型   
								// ASCII码值分别为 '1':49     '0':48
				{
    
    
					int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷
					show[x][y] = count + '0';//转换成数字字符
					//printf("%c\n", count + '0');
					DisplayBoard(show, ROW, COL);
					win++;
				}
			}
		}
		else
		{
    
    
			printf("输入坐标错误,请重新输入:>\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
    
    
		printf("恭喜你,扫雷成功!!!\n");
		DisplayBoard(mine, ROW, COL);
	}
}

juego.h

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

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10  //雷


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[ROW][COL],char show[ROW][COL], int row, int col);

Supongo que te gusta

Origin blog.csdn.net/weixin_72138633/article/details/130956795
Recomendado
Clasificación