C实现简单扫雷

  主要实现以下功能:

  (1)第一次不被炸死;

  (2)若第一次没有踩到雷,以(x,y)坐标为中心进行展开,并统计雷的数目;

  实现该游戏思路如下:

  (1)需要用一个数组去布置雷,另一个数组进行显示;分别用mine[ ][ ]和board[ ][ ]表示;

  (2)对这两个数组进行初始化,将mine[ ][ ]数组初始化成0,将board[ ][ ]数组初始化成*,

  (3)在mine[ ][ ]数组中随机布置雷;

  (4)设计扫雷过程:输入位置,是雷,报错并退出;不是雷,显示周围雷的个数。

具体代码如下:

(1)防止第一次被炸死,如果第一次踩到雷,则将此处设置为0,并重新布雷,进行下一次扫雷;

void safe_mine(char mine[ROWS][COLS],char board[ROWS][COLS],int row, int col)
{
	int x=0;
	int y=0;
	printf("请输入坐标:>");  
    scanf("%d%d",&x,&y);
    if(((x>=1)&&(x<=ROW))&&((y>=1)&&(y<=COL)))  
        {  
            if(mine[x][y]=='1') 
			{
                mine[x][y]='0';
				board[x][y]=get_count_mine(mine,x,y)+'0';
                open_mine(mine,board,x,y);
	            display_board(board,ROWS,COLS);
	            set_mine(mine);
            }  
            else  
            {   
                if(board[x][y]=='0')  
                board[x][y]=get_count_mine(mine,x,y)+'0';  
                open_mine(mine,board,x,y);
	            display_board(board,ROWS,COLS);
            }  
        } 
        else  
        {  
            printf("下标有误,请重新输入\n");  
        }  

}
(2)第一次扫雷后,统计坐标(x,y)周围雷的个数,将其个数显示在board棋盘的(x,y)坐标处,并以(x,y)为中心进行展开;

void open_mine(char mine[ROWS][COLS],char board[ROWS][COLS],int x, int y)//坐标周围展开函数
{
    if (mine[x-1][y-1]=='0')
    { 
        board[x-1][y-1]=get_count_mine(mine,x- 1,y-1)+'0';
    }
	else
	{
		 board[x-1][y-1]='@';
	}
    if (mine[x-1][y]=='0')
    {
         board[x-1][y]=get_count_mine(mine,x-1,y)+'0';
    }
	else
	{
		 board[x-1][y]='@';
	}
    if (mine[x-1][y+1]=='0')
    {
         board[x-1][y+1]=get_count_mine(mine,x-1,y+1)+'0';
    }
	else
	{
		 board[x-1][y+1]='@';
	}
    if (mine[x][y-1]=='0')
    {
         board[x][y-1]=get_count_mine(mine,x,y-1)+'0';
    }
	else
	{
		 board[x][y-1]='@';
	}
    if (mine[x][y+1]=='0')
    {
         board[x][y+1]=get_count_mine(mine,x,y+1) + '0';
    }
	else
	{
		 board[x][y+1]='@';
	}
    if (mine[x+1][y-1]=='0')
    {
         board[x+1][y-1]=get_count_mine(mine,x+1,y-1)+'0';
    }
	else
	{
		 board[x+1][y-1]='@';
	}
    if (mine[x+1][y]=='0')
    {
         board[x+1][y]=get_count_mine(mine,x+1,y)+'0';
    }
	else
	{
		 board[x+1][y]='@';
	}
    if (mine[x+1][y+1]=='0')
    {
        board[x+1][y+1]=get_count_mine(mine,x+1,y+1)+'0';
    }
	else
	{
		 board[x+1][y+1]='@';
	}
}
(3)初始化棋盘

//初始化mine[][]成'0'
void init_mine(char mine[ROWS][COLS],int row,int col)
{
	memset(mine,'0',row*col*sizeof(mine[0][0]));
}
//初始化board[][]成'*'
void init_board(char board[ROWS][COLS],int row,int col)
{
	memset(board,'*',row*col*sizeof(board[0][0]));
}
(4)显示棋盘

//显示布雷的棋盘
void display_mine(char mine[ROWS][COLS],int row,int col)
{
	int i=0;
	int j=0;
	printf("     1  2  3  4  5  6  7  8  9 10 \n");
	for(i=1;i<row-1;i++)
	{
		printf("    — — — — — — — — — —\n");
		printf("%2d |",i);
		for(j=1;j<col-1;j++)
		{
			printf("%c |",mine[i][j]);
		}
		printf("\n");
	}
		printf("    — — — — — — — — — —\n");

}
//显示棋盘
void display_board(char board[ROWS][COLS],int row,int col)
{
	int i=0;
	int j=0;
	printf("     1  2  3  4  5  6  7  8  9 10\n");
	for(i=1;i<row-1;i++)
	{
		printf("    — — — — — — — — — —\n");
		printf("%2d |",i);
		for(j=1;j<col-1;j++)
		{
			printf("%c |",board[i][j]);
		}
		printf("\n");
	}
		printf("    — — — — — — — — — —\n");

}
(5)布雷

//布雷
void set_mine(char mine[ROWS][COLS])
{
	int x=0;
	int y=0;
	int i=0;
	int count=MINE_COUNT;
		
	/*for(i=1;i<=count;i++)
	{
		x=rand()%ROW+1;
	    y=rand()%COL+1;
		if(mine[x][y]=='0')
			mine[x][y]='1';
		else
			i--;
	}	*/
	while(count)
	{
		x=rand()%ROW+1;
	    y=rand()%COL+1;
		if(mine[x][y]=='0')
		{
			mine[x][y]='1';
			count--;
		}
		else
			continue;
	}
}

(6) 统计(x,y周围雷的个数

int get_count_mine(char mine[ROWS][COLS],int x,int y)
{  
    return ( mine[x-1][y]  
    +mine[x-1][y-1]  
    +mine[x][y-1]  
    +mine[x+1][y-1]  
    +mine[x+1][y]  
    +mine[x+1][y+1]  
    +mine[x][y+1]  
    +mine[x-1][y+1]-8*'0');  
  
}  
(7)测试代码

 #define _CRT_SECURE_NO_WARNINGS 1
#include"saolei.h"

game()
{
	char mine[ROWS][COLS]={0};
	char board[ROWS][COLS]={0};
	int win=0;
	int x=0;
	int y=0;
	int ret=1;
	int count=0;
	init_mine(mine,ROWS,COLS);
	init_board(board,ROWS,COLS);
	set_mine(mine);
	display_mine(mine,ROWS,COLS);
	display_board(board,ROWS,COLS);

//扫雷
	printf("开始扫雷.....................................\n");
	safe_mine(mine,board,ROWS,COLS);//防止第一次被炸死
	display_mine(mine,ROWS,COLS);
	 while(win<=(ROW*COL-MINE_COUNT))  
    {  
        printf("请输入坐标:>");  
        scanf("%d%d",&x,&y);
        if(((x>=1)&&(x<=ROW))&&((y>=1)&&(y<=COL)))  
        {  
            if(mine[x][y]=='1') 
			{
                printf("很遗憾,你被炸死了\n");  
                break;
            }  
            else  
            {   
                if(board[x][y]=='*')  
                    win++;  
                count=get_count_mine(mine,x,y);  
                board[x][y]=count+'0';
                open_mine(mine,board,x,y);
	            display_board(board,ROWS,COLS);
            }  
        } 
        else  
        {  
            printf("下标有误,请重新输入\n");  
        }  
    }
	 if(win>(ROW*COL-MINE_COUNT))
		 printf("恭喜你排雷成功\n");  
}
menu()
{
	printf("**************\n");
	printf("****1.play****\n");
	printf("****0.exit****\n");
	printf("**************\n");

}
test()
{
	int input=0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
	    printf("欢迎来到扫雷游戏,请选择:>");
	    scanf("%d",&input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新输入:>\n");
			break;
		}

	}while(input);
}

int main()
{
	test();
	return 0;
}









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值