扫雷2(可以同时排出多位没有雷的位置)

 

"sweep.h"                                           //头文件
#ifndef  __SWEEP_H__
#define  __SWEEP_H__
#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROWS 16
#define COLS 16
#define MINES 20
void menu();//打印菜单
void display_mine(char mine[][COLS+2], int rows, int cols);//打印雷阵
void display_show(char show[ ][COLS+2], int rows, int cols);//打印雷的个数
void set_mines( char mine[][COLS+2]);//布雷
void sweep(char mine[ ][COLS+2],char show[ ][COLS+2]);//扫雷
#endif 
 
"sweep.c"         //函数部分
#include"sweep.h"
void menu()
{
	printf("*****************************************************************\n");
	printf("***********************     扫雷     ****************************\n");
	printf("***********************    1.play    ****************************\n");
	printf("***********************    0.exit    ****************************\n");
	printf("*****************************************************************\n");
}
void display_mine(char mine[ ][COLS+2], int rows, int cols)//打印雷阵
{
	int i = 0;
	int j = 0;
	printf(" ");
	for(i=1;i<=rows;i++)
	{   
		printf(" %2d",i);
	}
	printf("\n");
	for (i = 1; i <=rows; i++)//输出行的标号
	{     
		printf("%2d",i);
		for(j=1;j<=cols;j++)
	{
	      printf(" %c ",mine[i][j]);
		}
		printf("\n");
	}
}
void display_show(char show[ ][COLS+2], int rows, int cols)
{
	int i = 0;
	int j = 0;
	printf("     ");
	for (i =1; i <=rows; i++)
	{
		printf("%2d ",i);
	}
	printf("\n  ");

	for (i =1; i <=rows; i++)
	{   
		printf("%2d ",i);


		for (j =1; j <=cols; j++)
		{
			printf(" %c ",show[i][j]);
		}
		printf("\n  ");

	}
}

void set_mines( char mine[][COLS+2] )//布雷
{     
	int count = MINES;//定义雷的个数
	srand((unsigned int)time(NULL));//为了每次产生不同的随机数
flag:
	while (count)//当雷没有布完时,执行循环
	{
		int  x = rand()%(ROWS)+1;//产生随机的下标
		int  y = rand()%(COLS)+1;
		  if(mine[x][y] =='#')//如果这个位置已经布过雷,则重新生成下标
		{
			goto flag;
		}
		else
		{
			mine[x][y] = '#';
			count--;//布一个雷之后雷的个数应该减一
		}
	}
}
void sweep(char mine[ ][COLS+2],char show[ ][COLS+2])//扫雷
{   
	int i = 0;
	int j = 0;
	int x = 0;
	int y = 0;
	int x1=0;
	int y1=0;
	printf("请输入要第一次排雷的位置>");
	scanf("%d %d",&x1, &y1);
		  if (mine[x1][y1] == '#')//如果第一次点击的就是雷的位置,则应该把这个雷移走
	{   
		for (i=0; i<x1; i++)
		{
			for (j = 0; j<y1-1; j++)
			{
				if (mine[i][j] != '#')
				{   
					mine[i][j] = mine[x1][y1] ;
					mine[x1][y1]=' ';
				}
			}
		}
	}
	else 
	{
		//如果点击的位置不是雷,则应该统计雷的个数
		show[x1][y1] = ((mine[x-1][y-1] == '#') 
			+ (mine[x1-1][y1] == '#') + (mine[x1-1][y1+1] == '#')
			+ (mine[x1][y1-1] == '#') + (mine[x1][y1+1] == '#')
			+ (mine[x1+1][y1-1] == '#') + (mine[x1+1][y] == '#')
			+ (mine[x1+1][y1+1] == '#'))+ '0';
		  if(show[x1][y1]=='0')
		{
			for(x=x1-1;x<=x1+1;x++)
				for(y=y1-1;y<=y1+1;y++)
				{
					show[x][y]=((mine[x-1][y-1] == '#') 
						+ (mine[x-1][y] == '#') + (mine[x-1][y+1] == '#')
						+ (mine[x][y-1] == '#') + (mine[x][y+1] == '#')
						+ (mine[x+1][y-1] == '#') + (mine[x+1][y] == '#')
						+ (mine[x+1][y+1] == '#'))+ '0';;
				}
		}
	}
	display_show(show, ROWS, COLS);  //打印出雷阵
	while(1)
	{
		printf("请输入要排的位置 :>");
		scanf("%d%d",&x1,&y1);
		if(mine[x1][y1] == '#')
		{   
			printf("炸死了\n");
			break;
		}
		else         //如果点击的位置不是雷,则应该统计雷的个数
		{                                         
			show[x1][y1] = ((mine[x1-1][y1-1] == '#') 
				+ (mine[x1-1][y1] == '#') + (mine[x1-1][y1+1] == '#')
				+ (mine[x1][y1-1] == '#') + (mine[x1][y1+1] == '#')
				+ (mine[x1+1][y1-1] == '#') + (mine[x1+1][y] == '#')
				+ (mine[x1+1][y1+1] == '#'))+ '0';
			if(show[x1][y1]=='0')
			{
				for(x=x1-1;x<=x1+1;x++)
					for(y=y1-1;y<=y1+1;y++)
					{
						show[x][y]=((mine[x-1][y-1] == '#') 
							+ (mine[x-1][y] == '#') + (mine[x-1][y+1] == '#')
							+ (mine[x][y-1] == '#') + (mine[x][y+1] == '#')
							+ (mine[x+1][y-1] == '#') + (mine[x+1][y] == '#')
							+ (mine[x+1][y+1] == '#'))+ '0';;
					}
			}

		}
		display_show(show, ROWS, COLS);//打印显示雷的个数的数组
	}
}


"text.c"                                                  //测试部分

#include"sweep.h"
void game()
{
	int x = 0;
	int y = 0;
	char mine[ROWS + 2][ COLS +2]={0}; 
	char show[ROWS + 2][COLS + 2]={0};
    memset( mine,'0', sizeof(char)*(ROWS+2)*(COLS+2));
	memset( show,'*', sizeof(char)*(ROWS+2)*(COLS+2));
	set_mines(mine);
	//display_mine(mine, ROWS, COLS);
	display_show(show, ROWS, COLS);
	sweep(mine,show);
}
int main()
{   
	int input = 0;
	do
	{ 
		menu();
		printf("请输入要选择的数字:");
		scanf("%d",&input);
		switch (input)
		{
		case 0:
			exit(1);
		case 1:
			game();
		}
	}while(input);
	system("pause");
	return 0;
}
 
	 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值