扫雷(c语言)

1.扫雷的原理:(若有什么疑问,请打在评论区)

  1. 胜利条件:在不点错雷的情况下,尽可能快地将所有的雷都标记出来。

  2. 操作方法:左键翻开方格,右键标记地雷。双击左键可以查看数字的可点击范围。

  3. 技巧:根据数字周围的雷数,推断雷的位置。使用右键加左键的组合可以快速点开数字周围的方块。

  4. 2.扫雷的步骤

  5. 先进入游戏(1为play,0为exit)

  6. 当输入1时进入游戏,输入0的时候就退出游戏,输入其他数字时,请重新输入。

  7. void menu()
    {
    	printf("*******************\n");
    	printf("***** 1.paly  *****\n"); 
    	printf("***** 0.exit  *****\n");
    	printf("*******************\n");
    
    }
    int main()
    {
    	int input = 0;
    	do
    	{
    		menu();//菜单选择
    		printf("请选择>");
    		scanf_s("%d", &input);
    		switch (input)
    		{
    		case 1:
    			test();//进入游戏的程序
    			break;
    		case 0:
    			printf("退出游戏");
    			break;
    		default:
    			printf("输入错误,请重新输入");
    			break;
    		}
    
    	} while (input);
    	return 0;
    }

  8. 对扫雷的界面进行设置

  9. 应该设置二个界面,上下两个,(上面为方格覆盖用*表示,下面为数字为0)当边缘有数字的,我们要检查九宫格有没有雷,因为在边缘没有九宫格所以要用上面的界面填充下面的界面,当下面的边长,(ROW,COL),所有上面的边长为(ROWS=ROW+1,COLS=COL+1),也因为不好输入坐标的,所有在外面数字横轴,与纵轴方便输入坐标,所以(ROWS=ROW+2,COLS=COL+2)。建立一个头文件game.h将ROW,COL放在里面建立一个声明。对上下两个界面进行大小设置,进行覆盖。

  10. //头文件 gmae.h
    #define ROW 9 //行的个数
    #define COL 9 //列的个数
    #define ROWS ROW+2 //外面行的个数
    #define COLS COL+2 //外面列的个数
    
    ​//布置有多少给方格
    void Inboard(char board[ROWS][COLS], int rows, int cols,char set);
    //出现方格的数字
    void Displayboard(char board[ROWS][COLS], int row, int col);
    //源文件 sl.c​
    #include"game.h"//头文件的引用
    void test()
    {
    	//下面
    	char mine[ROWS][COLS] = { 0 };
    	//上面
    	char show[ROWS][COLS] = { 0 };
    	//布置有多少给方格
    	Inboard(mine, ROWS, COLS,'0');
    	//对方格进行覆盖
    	Inboard(show, ROWS, COLS,'*');
    
    }
    ​
    //第二个源文件game.c
    #include"game.h"
    void Inboard(char board[ROWS][COLS], int rows, int cols,char set)
    {
    	int i = 0;
    	int 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;
    	int 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");
    
    }
    

  11. 设置雷(的多少,用1表示)

  12. 将雷随机放在雷的界面上,(注意:有雷的地方不能放雷所有当board==0时才可以放雷)

  13. //头文件 game.h
    #define easy_count 10//雷的个数
    //设置雷
    void setmine(char board[ROWS][COLS], int row, int col);
    //源文件 game.c
    void setmine(char board[ROWS][COLS], int row, int col)
    {
    	int count = easy_count;
    	while (count)
    	{
    		int x = rand() % row + 1;
    		int y = rand() % col + 1;
    		if (board[x][y] == '0')
    		{
    
    			board[x][y] = '1';
    			count--;
    		}
    	}
    
    }
    //源文件 sl.c
    #include<time.h>
    #include<stdlib.h>
    void test()
    {
    	//下面
    	char mine[ROWS][COLS] = { 0 };
    	//上面
    	char show[ROWS][COLS] = { 0 };
    	//布置有多少给方格
    	Inboard(mine, ROWS, COLS,'0');
    	//对方格进行覆盖
    	Inboard(show, ROWS, COLS,'*');
    
    	//设置雷
    	setmine(mine,ROW,COL);
    
    	Displayboard(show, ROW, COL);
    
    
    }
    //在main()加入设计随机数
    srand((unsigned int)time(NULL));

  14. 玩家下棋

  15. 有要扫雷的坐标用 x,y    有要标记的坐标  ROW+x,COL+y  ,如果是雷,则扫雷失败,如果不是 则继续扫雷,如果超过坐标范围则重新输入。若坐标周围没有雷,则九宫格数字全部出现。若全部都是雷则扫雷成功,继续下一局。

  16. //game.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 Inboard(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 board[ROWS][COLS], char show[ROWS][COLS], int row, int col);
    //周围有没有雷
    
    //game.c
    void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
    {
    	int x = 0;
    	int y = 0;
    	int win = 0;//找到非雷的个数
    	while (win<=row*col-easy_count)
    	{
    		printf("如果要标记雷用边长+坐标,标记用#表示\n");
    		printf("请输入坐标;>");
    		scanf_s("%d%d", &x, &y);
    	    
    		
    		if (show[x][y] != '*')
    		{
    			printf("位置被扫过了,请重新输入坐标\n");
    		}
    		else if (x >= 1 && x < row && y >= 1 && y < col)
    		{
    			if (mine[x][y] == '1')//如果是雷
    			{
    				printf("为雷,扫雷失败\n");
    				Displayboard(mine, ROW, COL);
    				break;
    			}
    			else//如果不是雷
    			{
    				//统计周围有多少雷
    				int count = 0;
    				int b = 0;
    				int c = 0;
    				for (b= x-1; b <=x+1; b++)
    				{
    					for (c = y-1; c <= y+1; c++)
    					{
    						if (mine[b][c] == '1')
    						{
    							count++;
    							break;
    						}
    					}
    				}
    				if (count == 0)
    				{
    					for (b = x - 1; b <= x + 1; b++)
    					{
    						for (c = y - 1; c <= y + 1; c++)
    						{
    							show[b][c] = '0';
    							Displayboard(show, ROW, COL);
    							
    						}
    					}
    				}
    				win++;
    				show[x][y] = count + '0';//转换数字字符
    				Displayboard(show, ROW, COL);
    			}
    		}
    		//标记雷
    		if (x >= row + 1 && x < 2 * row && y >= col + 1 && y < 2 * col)
    
    		{
    			show[x - row][y - col] = '#';
    			Displayboard(show, ROW, COL);
    		}
    	}
    	if (win == row * col - easy_count)
    	{
    		printf("恭喜你,扫雷成功\n");
    		Displayboard(mine, ROW, COL);
    
    	}
    
    }
    // 源文件 sl.c
    void test()
    {
    	//下面
    	char mine[ROWS][COLS] = { 0 };
    	//上面
    	char show[ROWS][COLS] = { 0 };
    	//布置有多少给方格
    	Inboard(mine, ROWS, COLS,'0');
    	//对方格进行覆盖
    	Inboard(show, ROWS, COLS,'*');
    
    	//设置雷
    	setmine(mine,ROW,COL);
    	//Displayboard(mine, ROW, COL);
    
    	//Displayboard(mine, ROW, COL);
    	Displayboard(show, ROW, COL);
    	//检查雷
    	Findmine(mine, show, ROW, COL);
    
    
    
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值