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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章