C语言之扫雷

还记得之前上课无聊就会扫雷,现在我们也可以自己写一个了。在这里我依旧分了三个文件写扫雷头文件game.h源文件game.c和测试文件 test.h。在代码后边我都有详细的注释,不会的宝宝可以看。
首先是头文件game.h
#ifndef _GAME_H_
#define _GAME__H_

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

#define ROW 10
#define COL 10
#define COUNT 10

void menu();//菜单
void game();//游戏函数
void set_mines(char board[ROW][COL], int row, int col);//布雷函数
int get_mines(int x, int y);//检测周围八个区域的雷数
void print_display(char board[ROW][COL], int row, int col);//玩家雷盘
void print_mine(char board[ROW][COL], int row, int col);//设计者雷盘
void open_mine(int x, int y );//展开函数
int sweep_mine();//扫雷函数
int count_show(char board[ROW][COL], int row, int col);//判断周围雷个位数

#endif

测试文件test.c


#include"game.h"
int main()
{
	srand((unsigned long)time(NULL));
	int input = 0;
	menu();
	do
	{
		printf("请输入选项:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			exit(0);
			break;
		default:
			printf("输入有误,请重新输入\n:");
			break;
		}
		menu();
	} while (input);
	system("pause");
	return 0;
}
然后就是源文件了game.c

game.c

先定义了两个数组分别是玩家的雷盘数组和设计者的的雷盘数组并且打印菜单

#include"game.h"
char show_mine[ROW][COL] = { 0 };
char real_mine[ROW][COL] = { 0 };
void menu()
{
	printf("************************************\n");
	printf("*************** 1.play *************\n");
	printf("*************** 0.exit *************\n");
	printf("************************************\n");
}


打印玩家雷盘和设计者雷盘

void print_display(char board[ROW][COL], int row, int col)//打印玩家棋盘
{
	int i = 0;
	int j = 0;
	printf("0 ");
	for (i = 1; i < COL - 1; i++)//打印横标
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 1; i < COL - 1; i++)//打印竖标
	{
		printf("%d ", i);
		for (j = 1; j < ROW - 1; j++)
		{
			printf("%c|", show_mine[i][j]);//玩家棋盘数组
		}
		printf("\n");
	}

	printf("\n");
}
void print_mine(char board[ROW][COL], int row, int col)//打印设计者棋盘
{
	int i = 0;
	int j = 0;
	printf("0 ");
	for (i = 1; i < COL - 1; i++)///打印横标
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <COL - 1; i++)//打印竖标
	{
		printf("%d ", i);
		for (j = 1; j < ROW - 1; j++)
		{
			printf("%c ", real_mine[i][j]);
		}
		printf("\n");
	}

	printf("\n");
}

给设计者布雷

void set_mines(char board[ROW][COL], int row, int col)//给设计者棋盘布雷
{
	int x = 0;
	int y = 0;
	int count = COUNT;

	while (count)//布雷
	{
		x = rand() % ROW;//产生随机数
		y = rand() % COL;
		if ((x >= 1 && x <= ROW - 2) && (y >= 1 && y <= COL - 2))//产生棋盘坐标范围内的坐标
		{
			if (real_mine[x][y] == '0')//找到不是雷的地方布雷
			{

				real_mine[x][y] = '1';
				count--;
			}
		}
	}
}

计算周围八个区域雷的数目

int get_mines(int x, int y)//检测周围八个区域的雷数
{
	int count = 0;
	if (real_mine[x - 1][y - 1] == '1')
		count++;
	if (real_mine[x - 1][y] == '1')
		count++;
	if (real_mine[x - 1][y + 1] == '1')
		count++;
	if (real_mine[x][y - 1] == '1')
		count++;
	if (real_mine[x][y + 1] == '1')
		count++;
	if (real_mine[x + 1][y - 1] == '1')
		count++;
	if (real_mine[x + 1][y] == '1')
		count++;
	if (real_mine[x + 1][y + 1] == '1')
		count++;
	return count;
}
展开坐标周围八个区域雷的数目
void open_mine(int x, int y)//展开坐标周围雷的数目
{
	
	show_mine[x - 1][y - 1] = get_mines(x - 1, y - 1) + '0';//显示该座标周围的雷数


	show_mine[x - 1][y] = get_mines(x - 1, y) + '0';//显示该座标周围的雷数


	show_mine[x - 1][y + 1] = get_mines(x - 1, y + 1) + '0';//显示该座标周围的雷数


	show_mine[x][y - 1] = get_mines(x, y - 1) + '0';//显示该座标周围的雷数


	show_mine[x][y + 1] = get_mines(x, y + 1) + '0';//显示该座标周围的雷数


	show_mine[x + 1][y - 1] = get_mines(x + 1, y - 1) + '0';//显示该座标周围的雷数


	show_mine[x + 1][y] = get_mines(x + 1, y) + '0';//显示该座标周围的雷数


	show_mine[x + 1][y + 1] = get_mines(x + 1, y + 1) + '0';//显示该座标周围的雷数


}

判断雷的个数

int count_show(char board[ROW][COL], int row, int col)//判断周围雷个位数,当周围i个数为0时玩家赢
{
	int count = 0;
	int i = 0;
	int j = 0;
	for (i = 1; i < col; i++)
	{
		for (j = 1; j < col - 1; j++)
		{
			if (show_mine[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}
现在就是扫雷中的最重要的一步了,扫雷
int sweep_mine(char board[ROW][COL], int row, int col)//扫雷,踩到雷返回1,没踩返回零
{
	int x = 0;
	int y = 0;
	int count = 0;
	printf("请输入扫雷坐标:>>");
	scanf("%d %d", &x, &y);
	if ((x >= 1 && x <= ROW - 2) && (y >= 1 && y <= COL - 2))//判断坐标是否合法
	{
		if (real_mine[x][y] == '0')//没踩到雷
		{
			int ch = count_show(board, x, y);
			show_mine[x][y] = '0';//不是雷,该坐标显示0
			open_mine(x, y);
			if (count_show(board, ROW, COL) == COUNT)//判断未知区域的雷的个数,个数为雷数时玩家赢
			{
				print_mine(board, ROW, COL);
				printf("赢了!!\n\n");
				return 0;
			}
		}
		else if (real_mine[x][y] == '1')
		{
			return 1;
		}
	}
	else
	{
		printf("输入有误,请重新输入:>>");
	}
	return 0;//没踩到雷
}

最后一步就是game()函数了


void game()
{
	int ret = 0;
	char board[ROW][COL];
	memset(real_mine, '0', ROW *COL);//初始化雷盘
	memset(show_mine, '*', ROW *COL);
	
	set_mines(board, ROW, COL);//给设计者棋盘盘布雷
	print_mine(board, ROW, COL);//打印设计者棋盘
	printf("\n");
	//print_display(board, ROW, COL);//打印玩家棋盘

	if (count_show(board, ROW, COL) == COUNT)//一步赢棋
	{
		print_mine(board, ROW, COL);
		printf("赢了!\n\n");
		return;
	}
	print_display(board, ROW, COL);//打印玩家棋盘

	while (1)//循环扫雷
	{
		ret = sweep_mine(board, ROW, COL);//将扫雷函数的返回值付给ret
		if (count_show(board, ROW, COL) == COUNT)//判断周围雷数是否和布的雷的数目相同
		{
			print_mine(board, ROW, COL);
			printf("赢了!\n\n");
			break;
		}

		if (ret)//判断是否踩到雷
		{
			printf("被炸死了???\n\n");
			print_mine(board, ROW, COL);//查看雷的分布
			break;

		}
		print_display(board, ROW, COL);//打印玩家棋盘
	}
}
到这里整个扫雷函数就结束了。


猜你喜欢

转载自blog.csdn.net/qq_40955824/article/details/80203075