用c语言实现简易c语言扫雷游戏

cpp 复制代码
void test(void)
{
	int input = 0;
	
	do
	{
		menu();
		printf("请选择: >");
		scanf("%d", &input);
		switch (input)
		{
			menu();
			case 1:
				printf("扫雷\n");
				game();
				break;
			case 2:
				printf("退出游戏\n");
				break;
			default:
				printf("输入错误,请重新输入");
				break;
		}
	} while (input);//0退出游戏


}
int main(void)
{

	test();
	return 0;
}

1、主函数及游戏开始结束的界面设计

cpp 复制代码
void menu()
{
	printf("*************************\n");
	printf("*******  1:开始游戏      *******\n");
	printf("*******  0:退出游戏      *******\n");
	printf("*************************\n");

}

2、菜单函数

cpp 复制代码
void game()
{
	char mine[ROWS][COLS] = { 0 };//存雷
	char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息

	//初始化棋盘   尽量设计成一样的
	InitBoard(mine,ROWS, COLS,'0');
    
	InitBoard(show,ROWS, COLS,'*');//调试时打印该表,玩的时候可以不打印

	//打印棋盘
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);//棋盘雷信息
	//排查雷
	FindMine(mine, show, ROW, COL);


}

3、游戏模块

头文件参数封装

cpp 复制代码
#define ROW 9        //棋盘显示区域
#define COL 9

#define ROWS ROW + 2//棋盘宽度
#define COLS COL + 2

#define EASY_COUNT 20//雷的数量


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 mine[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col);

初始化棋盘 尽量设计成一样的

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

打印棋盘

cpp 复制代码
void DisplayBoard(char board[ROWS][COLS], int row, int col)//实际显示的棋盘区域
{
	int i = 0;
	for (i = 0;i <= col;i++)
	{
		printf("%d ", i);//打印行列
	}
	printf("\n");

	for (i = 1;i <= row;i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1;j <= col;j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}

}

布置雷

cpp 复制代码
//布置雷是在棋盘上随机的找10个坐标
//x范围1~9
//y范围1~9
void SetMine(char mine[ROWS][COLS], int row, int col)
{ 
	int count = EASY_COUNT;//80个雷
	int x = 0;
	int y = 0;
	srand((unsigned int)time(NULL));//随机数清空
	while (count)
	{
		x = rand() % row + 1;//防止出界
		y = rand() % col + 1;

		if (mine[x][y] != '1')
		{
			mine[x][y] = '1';//判断是否有雷
			count--;
		}
	}
}

排查雷

cpp 复制代码
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
	int x = 0;
	int y = 0;
	int win = 1;
	while (1)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//是雷
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你踩雷了,游戏结束\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
			}
		}
		else
		{
			printf("输入的坐标有误x(1~9),y(1~9) 请重新输入");
		}
		//游戏胜利
		if (win == row * col - EASY_COUNT)
		{
			printf("恭喜你,排雷成功\n");
			break;
		}
	}
}
统计周围有几个雷

目录

1、主函数及游戏开始结束的界面设计

2、菜单函数

3、游戏模块

[初始化棋盘 尽量设计成一样的](#初始化棋盘 尽量设计成一样的)

打印棋盘

布置雷

排查雷

[法2 统计周围有几个雷](#法2 统计周围有几个雷)


cpp 复制代码
int GetMineCount(char mine[ROWS][COLS], char x, char y)
{
	int i = 0;
	int count = 0;
	for(i = -1;i <= 1;i++)
	{ 
		int j = 0;
		for (j = -1;j <= 1;j++)
		{
			count += mine[x + i][y + j] - '0';
		}
	}
	return count;
}
相关推荐
朝朝又沐沐4 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
薰衣草23335 小时前
一天两道力扣(6)
算法·leetcode
剪一朵云爱着5 小时前
力扣946. 验证栈序列
算法·
遇见尚硅谷5 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
天天开心(∩_∩)5 小时前
代码随想录算法训练营第三十二天
算法
YouQian7725 小时前
(AC)缓存系统
算法·缓存
艾莉丝努力练剑6 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶6 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
李永奉6 小时前
C语言-流程控制语句:for循环语句、while和do…while循环语句;
c语言·开发语言·c++·算法
程序员-King.6 小时前
day69—动态规划—爬楼梯(LeetCode-70)
算法·动态规划