C语言实现扫雷_入门级

代码年代久远,比较稚嫩,仅供参考,还请海涵

问题描述

实现游戏扫雷的部分功能,难度可选

操作说明

  • 输入3个数字,前两个数字为坐标。第三个数字为操作数,若其为0则标记该格子为雷区,否则翻开
  • 若格子已被标记,操作数为0则取消标记
  • 场上所有雷均被标记且其他格子未被标记则胜利,同时会记录所用时间
  • 踩雷,boom,game over

实现思路

  • 设置两个二维数组(in与out),分别记录场上的真实分布情况与用户看到的分布情况
  • 在用户翻开不为雷的格子时,检测周围格子是否为‘0’,是则翻开并以之为原点继续扩散检测,否则不作为
  • 雷由随机函数依赖时间进行埋放

源代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void show();
void clear();
void number();
void circle(int a,int b);
bool win();
void check(int a,int b);
char in[50][50];
char out[50][50];
int m,n;
int main()
{
	int a,b,c,d,e,f,g,h,j,r,s;
	int p[2500];
	clock_t begin,end;
	printf("游戏说明:请输入坐标,中间以空格隔开\n若要显示该格,请在后面输入任意一个非0个位数;若要标记该格(有雷),请在后面输入0。\n"); 
	printf("请选择游戏难度:\n1.初级\t2.中级\t3.高级\t4.自定义\n");
	scanf("%d",&a);
	switch(a)
	{
		case 1:m=n=10;break;
		case 2:m=40;n=16;break;
		case 3:m=99;n=22;break;
		case 4:printf("请输入雷的数目与棋盘边长(<50)\n");
		       scanf("%d%d",&m,&n);break; 
		default:printf("输入错误"); 
	}
	clear();
	srand(time(NULL));
	for (b=0;b<m;b++)
	{
		p[b]=rand()%(n*n);
		for (e=b;e>=0;e--)
		{
			if (p[b]==p[e])
			{
				p[b]=rand()%(n*n);
				e=b;
			}
		}
	}
	for (j=0;j<m;j++){
	    in[(p[j]/n+1)][(p[j]%n+1)]=42;
    }
	number();
	begin=clock();
	while(1)
	{
	scanf("%d%d%d",&f,&g,&h);
	if(h)
	{
		out[f][g]=in[f][g];
	    if(in[f][g]=='0')
    	check(f,g);
	    show();
	    printf("\n");
	}
	else
	{
	    if(out[f][g]=='X')
		{
		    out[f][g]=23;
		    show();
	    }
		else
		{
		    out[f][g]='X';
	        show();
        }
    }
	if(out[f][g]==42)
	{
	    printf("游戏结束,你失败了\n\n");
	    for(r=0;r<n+1;r++)
	    for(s=0;s<n+1;s++)
	    if(in[r][s]==42)
		out[r][s]=42;
	    show();
	    break;
	}
	else if(win())
	{
		end=clock();
	    printf("恭喜通关!用时%f秒\n",(double)(end-begin)/CLK_TCK);
	    break;
    }
    else printf("请输入坐标及操作\n\n");
    }
}
void clear()
{
	int a,b,c,d,e,f;
    for(a=1;a<50;a++)
    for(b=1;b<50;b++)
    out[a][b]=23;
    for(e=0;e<50;e++)
    out[0][e]=e;
    for(f=0;f<50;f++)
    out[f][0]=f;
    for(c=0;c<50;c++)
    for(d=0;d<50;d++)
    if(c>n-1||d>n-1)
    in[c][d]=48;
}
void number()
{
	int a,b,c,d;
	for(a=1;a<n+1;a++)
	for(b=1;b<n+1;b++)
	if(in[a][b]!=42)
	{
	    in[a][b]=48;
		if(a==1&&b==1)
	{
		if(in[a+1][b]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
		if(in[a+1][b+1]==42)in[a][b]++;
	}
	else if(a==n&&b==n)
	{
		if(in[a-1][b]==42)in[a][b]++;
		if(in[a-1][b-1]==42)in[a][b]++;
		if(in[a][b-1]==42)in[a][b]++;
	}
	else if(a==1&&b==n)
	{
		if(in[a][b-1]==42)in[a][b]++;
		if(in[a+1][b-1]==42)in[a][b]++;
		if(in[a+1][b]==42)in[a][b]++;
	}
	else if(a==n&&b==1)
	{
		if(in[a-1][b]==42)in[a][b]++;
		if(in[a-1][b+1]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
	}
	else if(a==1)
	{
		if(in[a][b-1]==42)in[a][b]++;
		if(in[a+1][b-1]==42)in[a][b]++;
		if(in[a+1][b]==42)in[a][b]++;
		if(in[a+1][b+1]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
	}
	else if(b==1)
	{
		if(in[a+1][b]==42)in[a][b]++;
		if(in[a+1][b+1]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
		if(in[a-1][b+1]==42)in[a][b]++;
		if(in[a-1][b]==42)in[a][b]++;
	}
	else if(a==n)
	{
		if(in[a][b-1]==42)in[a][b]++;
		if(in[a-1][b-1]==42)in[a][b]++;
		if(in[a-1][b]==42)in[a][b]++;
		if(in[a-1][b+1]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
	}
	else if(b==n)
	{
		if(in[a-1][b]==42)in[a][b]++;
		if(in[a-1][b-1]==42)in[a][b]++;
		if(in[a][b-1]==42)in[a][b]++;
		if(in[a+1][b-1]==42)in[a][b]++;
		if(in[a+1][b]==42)in[a][b]++;
	}
	else
	{
		if(in[a+1][b]==42)in[a][b]++;
		if(in[a+1][b+1]==42)in[a][b]++;
		if(in[a][b+1]==42)in[a][b]++;
		if(in[a-1][b+1]==42)in[a][b]++;
		if(in[a-1][b]==42)in[a][b]++;
		if(in[a-1][b-1]==42)in[a][b]++;
		if(in[a][b-1]==42)in[a][b]++;
		if(in[a+1][b-1]==42)in[a][b]++;
	}
    }
    show();
}
bool win()
{
	int a,b,c,d;
	c=d=0;
	for(a=0;a<50;a++)
	for(b=0;b<50;b++)
	{
		if(in[a][b]==42&&out[a][b]=='X')c++;
		else if(out[a][b]=='X')d++;
	} 
	return(c==d&&c==m);
}
void check(int a,int b)
{
	int c,d,e,f;
	if(a==1&&b==1)
	{
		if(out[a+1][b]==23)circle(a+1,b);
		if(out[a][b+1]==23)circle(a,b+1);
		if(out[a+1][b+1]==23)circle(a+1,b+1);
	}
	else if(a==n&&b==n)
	{
		if(out[a-1][b]==23)circle(a-1,b);
		if(out[a-1][b-1]==23)circle(a-1,b-1);
		if(out[a][b-1]==23)circle(a,b-1);
	}
	else if(a==1&&b==n)
	{
		if(out[a][b-1]==23)circle(a,b-1);
		if(out[a+1][b-1]==23)circle(a+1,b-1);
		if(out[a+1][b]==23)circle(a+1,b);
	}
	else if(a==n&&b==1)
	{
		if(out[a-1][b]==23)circle(a-1,b);
		if(out[a-1][b+1]==23)circle(a-1,b+1);
		if(out[a][b+1]==23)circle(a,b+1);
	}
	else if(a==1)
	{
		if(out[a][b-1]==23)circle(a,b-1);
		if(out[a+1][b-1]==23)circle(a+1,b-1);
		if(out[a+1][b]==23)circle(a+1,b);
		if(out[a+1][b+1]==23)circle(a+1,b+1);
		if(out[a][b+1]==23)circle(a,b+1);
	}
	else if(b==1)
	{
		if(out[a+1][b]==23)circle(a+1,b);
		if(out[a+1][b+1]==23)circle(a+1,b+1);
		if(out[a][b+1]==23)circle(a,b+1);
		if(out[a-1][b+1]==23)circle(a-1,b+1);
		if(out[a-1][b]==23)circle(a-1,b);
	}
	else if(a==n)
	{
		if(out[a][b-1]==23)circle(a,b-1);
		if(out[a-1][b-1]==23)circle(a-1,b-1);
		if(out[a-1][b]==23)circle(a-1,b);
		if(out[a-1][b+1]==23)circle(a-1,b+1);
		if(out[a][b+1]==23)circle(a,b+1);
	}
	else if(b==n)
	{
		if(out[a-1][b]==23)circle(a-1,b);
		if(out[a-1][b-1]==23)circle(a-1,b-1);
		if(out[a][b-1]==23)circle(a,b-1);
		if(out[a+1][b-1]==23)circle(a+1,b-1);
		if(out[a+1][b]==23)circle(a+1,b);
	}
	else
	{
		if(out[a+1][b]==23)circle(a+1,b);
		if(out[a+1][b+1]==23)circle(a+1,b+1);
		if(out[a][b+1]==23)circle(a,b+1);
		if(out[a-1][b+1]==23)circle(a-1,b+1);
		if(out[a-1][b]==23)circle(a-1,b);
		if(out[a-1][b-1]==23)circle(a-1,b-1);
		if(out[a][b-1]==23)circle(a,b-1);
		if(out[a+1][b-1]==23)circle(a+1,b-1);
	}
}
void show()
{
	int x,y;
	for(x=0;x<n+1;x++)
	    {     
		    for(y=0;y<n+1;y++)
		    if(x==0)
		    {
		    if(y==9){printf("%2d ",out[x][y]);}
		    else
		    printf("%2d",out[x][y]);
		    }
		    else if(y==0)
		    printf("%2d ",out[x][y]);
		    else printf("%c ",out[x][y]);
    	    printf("\n");
        }
}
void circle(int a,int b)
{
	out[a][b]=in[a][b];
	if(in[a][b]=='0')check(a,b);
}

猜你喜欢

转载自blog.csdn.net/weixin_44329588/article/details/106320387
今日推荐