Linguagem C (varredor de minas)


insira a descrição da imagem aqui

processo de desenvolvimento

  • Preparação
  • Mostrar resultados

Preparação:
insira a descrição da imagem aqui
game.h um arquivo de cabeçalho –> declara a função
test.c como o arquivo principal
game.c como o arquivo de implementação da função

Mostrar resultados
insira a descrição da imagem aqui
insira a descrição da imagem aqui

ideia de desenvolvimento

  • interface de menu

  • Impressão da interface do jogo (matriz bidimensional)

  • geração aleatória de trovão

  • Desminagem (e avaliação do número de minas ao redor)

  • condição de vitória

A ideia geral é assim, vamos analisar passo a passo

interface de menu

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

aqui temos que continuar Receber entrada do usuário, quando for 1, entre no jogo, quando for 0, saia do programa
pense diretamente no julgamento da declaração condicional, aqui usamos switch

Contínuo : Após o usuário terminar o jogo, o menu pode ser impresso novamente para o usuário escolher

Esta operação é obviamente a parte central do projeto, colocada emfunção principaldentro

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

Impressão da interface do jogo

Claro, uma matriz bidimensional é usada aqui, mas temos que considerar se ela pode alcançar o efeito de desminagem desinformada se apenas uma matriz for usada.
Claro, um array não é possível, então temos que criarduas matrizes,
um é real e o outro é mostrado ao usuário

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

Aqui temos que pensar primeiro, se o array for 9×9, quando estiver na borda, vaifora dos limites
Podemos criar um array de 11×11, do qual não usamos o mais externo, apenas definimos como valor padrão

#define ROW 9
#define COL 9

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

Inicialização do mapa

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

Nossa função InitBoard é:

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

impressão 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");
}

geração aleatória de trovão

É fácil pensarmos que se trata de gerar números aleatórios e alterar os valores dos elementos de seu array.
É issofunção srand()

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

Função gerada aleatoriamente:

Definimos EASY_COUNT (o número de minas) no arquivo de cabeçalho

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

Campo Minado e determina as condições de vitória

Campo Minado
Deixe o usuário inserir uma coordenada e julgar seu valor

  • Se a coordenada no show array for *, a coordenada foi apagada
  • Se a coordenada na matriz da mina for 1, ela não será bombardeada pela mina
  • Caso contrário, determine quantas minas existem no array de minas e exiba o número nas coordenadas do array show

Determinar se as coordenadas devem ser inseridas repetidamente

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

O código com falha é muito simples, apenas um julgamento

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

A função de julgar quantas minas existem é
insira a descrição da imagem aqui

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

A função de toda a operação é

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

integração de código

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

game.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);
	}
}

jogo.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);

Acho que você gosta

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