C语言实现扫雷

        扫雷是大家在日常生活中经常接触的一款游戏,用C语言就可以实现简单扫雷

//game.h


#define ROW 9
#define COL 9
#define COLS COL+2
#define ROWS ROW+2
#define Mine_Sum 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void init_board(char mine[ROWS][COLS], int row, int col, char set);void print(char mine[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);//找雷的函数
int mum(char show[ROWS][COLS], int i, int j); 
void ExpandBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* win);

首先我们先在game.h头文件中添加自己需要的函数,函数从上到下依次为

1.初始化棋盘函数

2.安放雷的函数

3.找雷的函数

4.返回雷的数量的函数

5.实现区域消去的函数

同时我们宏定义一下常用的数据,比如棋盘的行ROW,棋盘的列COL,这样我们可以方便地修改棋盘的大小,至于ROW+2和COL+2是显示棋盘外的隐藏棋盘,方便我们对棋盘进行操作,最后是Mine_mum,表示雷的数量。

接下来实现函数的代码都放在game.c

//game.c
#include"game.h"
void init_board(char mine[ROWS][COLS], int row, int col, char set)//初始化棋盘的函数
{
	int i, j;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			mine[i][j] = set;
		}
		putchar('\n');
	}
}




void print(char mine[ROWS][COLS], int row, int col)//打印棋盘的函数
{
	int i, j;
	for (i = 0; i <=COL; i++)
	{
		printf("%d ", i);
	}
	putchar('\n');
	for (i = 1; i <= ROW; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= COL; j++)
		{
			printf("%c ",mine[i][j]);
		}
		putchar('\n');
	}
}
void setmine(char mine[ROWS][COLS], int row, int col)//埋雷的函数
{
	int sum = Mine_Sum+1;
	while (sum)
	{
		int i = rand() % ROW + 1;
		int j = rand() % COL + 1;
		if (mine[i][j] == '0')
		{
			mine[i][j] = '1';
			sum--;
		}
	}
}
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//找雷的函数
{
	int i, j;
	int k=0;
	int a = 0;
	int* win = &a;
	while (1)
	{
		printf("请输入你找的雷的坐标\n");
		


		scanf("%d%d", &i, &j);
		if (i <= 9 && i >= 1 && j <= 9 && j >= 1)
		{
			if (show[i][j] == '1')
			{
				printf("你踩到雷了,游戏结束\n");
				print(show, ROW, COL);
				break;


			}
			else
			{
				
				ExpandBoard(mine, show, i, j, win);
				if ((*win) ==ROW * COL - Mine_Sum)
				{
					printf("恭喜你排查了所有的雷\n");
					print(show, ROW, COL);
					break;
				}
				/*(*win)++;
				k = mum(show, i, j);
				if (k == 0)
				{
					mine[i][j] = ' ';
					(*win)++;
					if(mine[i-1][j-1]=='*'&&i-1>0&&i-1<ROWS&&j-1>0&&j-1<COLS)*/
				/*}*/
				//mine[i][j] = k + '0';
				//putchar('\n');
				//putchar('\n');
				print(mine, ROW, COL);//每完成一次操作打印一次棋盘
				//flag--;
			}
		}
		else
		{
			printf("你输入的坐标不合法,请重新输入\n");
		}
	}
	/*if (flag==0)
	{
		printf("恭喜你排查了所有的雷\n");
		print(show, ROW, COL);
	}*/
}
int mum(char show[ROWS][COLS], int i, int j)
{
	return show[i - 1][j - 1] + show[i - 1][j] + show[i - 1][j + 1]
		+ show[i][j - 1] + show[i][j + 1] + show[i + 1][j - 1] +
		show[i + 1][j] + show[i + 1][j + 1]-8*'0';


}


void ExpandBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* win)
{
	(*win)++;
	int k = mum(show, i, j);
	if (k == 0)
	{
		mine[i][j] = ' ';
		(*win)++;
		if (mine[i - 1][j - 1] == '*' && i - 1 > 0 && i - 1 < ROWS && j - 1 > 0 && j - 1 < COLS)
			ExpandBoard(mine, show, i - 1, j - 1, win);
		if (mine[i - 1][j] == '*' && i - 1 > 0 && i - 1 < ROWS && j > 0 && j < COLS)
			ExpandBoard(mine, show, i - 1, j, win);
		if (mine[i - 1][j + 1] == '*' && i - 1 > 0 && i - 1 < ROWS && j + 1 > 0 && j + 1 < COLS)
			ExpandBoard(mine, show, i - 1, j + 1, win);
		if (mine[i][j - 1] == '*' && i > 0 && i < ROWS && j - 1 > 0 && j - 1 < COLS)
			ExpandBoard(mine, show, i, j - 1, win);
		if (mine[i][j + 1] == '*' && i > 0 && i < ROWS && j + 1 > 0 && j + 1 < COLS)
			ExpandBoard(mine, show, i, j + 1, win);
		if (mine[i + 1][j - 1] == '*' && i + 1 > 0 && i + 1 < ROWS && j - 1 > 0 && j - 1 < COLS)
			ExpandBoard(mine, show, i + 1, j - 1, win);
		if (mine[i + 1][j + 1] == '*' && i + 1 > 0 && i + 1 < ROWS && j + 1 > 0 && j + 1 < COLS)
			ExpandBoard(mine, show, i + 1, j + 1, win);
	}
	else
		mine[i][j] = k + '0';
}

最后是进行整体操作的函数test.c

//test.c

#include"game.h"

void game()
{
	
	char mine[ROWS][COLS];//游戏界面棋盘
	char show[ROWS][COLS];//埋雷信息棋盘
	init_board(mine,ROWS,COLS,'*');//初始化显示棋盘
	print(mine, ROW, COL);//打印棋盘
	init_board(show, ROWS, COLS, '0');
	setmine(show, ROW, COL);//埋雷
	//print(show, ROW, COL);//打印棋盘
	findmine(mine, show, ROW, COL);//找雷的函数






}
void menu()
{
	printf("**********扫雷********\n");
	printf("*******1.开始游戏********\n");
	printf("*******0.结束游戏********\n");
	printf("********************\n");
}
void test()
{
	srand((unsigned int)time(NULL));
	int i;
	do
	{
		menu();
		printf("请输入你的选择\n");
		scanf("%d", &i);
		switch (i)
		{
		case 1:
			game(); break;
		case 0:
			printf("游戏结束\n"); break;
		}
	} while (i);
}
int main()
{
	test();
	return 0;
}

同时为了方便用户输入坐标,第一行和第一列我标注了坐标

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值