递归看了N遍终于写出来了展开功能,心塞。
上效果图
打开代码,control+F5,走!
输入1开始游戏
密集恐惧症,心里一万只草泥马路过。。。
未打开前都是‘*’号,玩家根据行标和列标输入需要扫雷的位置
就快要赢了,当然这个难度可能比较低,但是可以自行设置难度,我自己默认的是20*20的表格,20个大雷子。
Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf ("■■■■■■ 扫雷游戏 ■■■■■■\n" );
printf ("■■■■■■■■■■■■■■■■■\n" );
printf ("■■■■■■■■■■■■■■■■■\n" );
printf ("■■■■■■1.开始游戏■■■■■■\n" );
printf ("■■■■■■■■■■■■■■■■■\n" );
printf ("■■■■■■0.退出游戏■■■■■■\n" );
printf ("■■■■■■■■■■■■■■■■■\n" );
}
void game()
{
int i = 0 ;
int x = 0 ;
int y = 0 ;
char Hidemap[ROW][COL] = {0 };
char Showmap[ROW][COL] = {0 };
srand((unsigned int )time(NULL));
Initmap(Hidemap,Showmap,ROW,COL);
Devicemine(Hidemap,ROW,COL,Mine);
Printmap(Showmap,ROW,COL);
for (i=0 ;i<((ROW-2 )*(COL-2 )-Mine);i++)
{
printf ("请输入需要打开的坐标:" );
scanf ("%d%d" ,&x,&y);
if (x>=1 &&x<=ROW&&y>=1 &&y<=COL)
{
if (i==0 )
{
Savepleyer(Hidemap,ROW,COL,x,y);
}
if (Open(Hidemap,Showmap,x,y))
{
;
}
else
{
break ;
}
if (Countshowmine(Showmap,ROW,COL)==Mine)
{
printf ("恭喜玩家获胜/n" );
break ;
}
Printmap(Showmap,ROW,COL);
}
else
{
printf ("对不起,您的输入有误,请重新输\n" );
}
}
}
void test()
{
int input = 0 ;
do
{
menu();
printf ("请输入指令:" );
scanf ("%d" ,&input);
switch (input)
{
case 0 :
printf ("即将退出游戏\n" );
Sleep(2000 );
system("cls" );
break ;
case 1 :
printf ("游戏即将开始\n" );
Sleep(2000 );
system("cls" );
game();
break ;
default :
printf ("输入错误,请您重新输入\n" );
break ;
}
}
while (input);
}
int main()
{
test();
return 0 ;
}
这里注意,创建数组是一个是开发者,显示的是雷的布局,为玩家棋盘服务的数组。
比如我们玩10*10的表格,但是要创建12*12的表格,原因是如果玩家探索边缘的地方,在统计的时候,统计周围八个地区,就会存在数组的越界,但是我们如果多创建2行2列,但是雷都布置到内10行10列中,就可以避免这个问题。打印同样也只打印内10行10列。
Game.c
游戏核心文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Initmap(char Hidemap[ROW][COL],char Showmap[ROW][COL],int row,int col)
{
memset (Hidemap,'0' ,row*col*sizeof (Hidemap[0 ][0 ]));
memset (Showmap,'*' ,row*col*sizeof (Showmap[0 ][0 ]));
}
void Devicemine(char Hidemap[ROW][COL],int row,int col,int mine)
{
int x = 0 ;
int y = 0 ;
while (mine)
{
x = rand() % (row-2 );
y = rand() % (col-2 );
if (Hidemap[x+1 ][y+1 ] == '0' )
{
Hidemap[x+1 ][y+1 ] = '1' ;
mine--;
}
}
}
int Countmine(char Hidemap[ROW][COL],int x,int y)
{
int count = 0 ;
if (Hidemap[x-1 ][y-1 ] == '1' )
{
count++;
}
if (Hidemap[x-1 ][y] == '1' )
{
count++;
}
if (Hidemap[x-1 ][y+1 ] == '1' )
{
count++;
}
if (Hidemap[x][y-1 ] == '1' )
{
count++;
}
if (Hidemap[x][y+1 ] == '1' )
{
count++;
}
if (Hidemap[x+1 ][y-1 ] == '1' )
{
count++;
}
if (Hidemap[x+1 ][y] == '1' )
{
count++;
}
if (Hidemap[x+1 ][y+1 ] == '1' )
{
count++;
}
return count;
}
int Open(char Hidemap[ROW][COL],char Showmap[ROW][COL],int x,int y)
{
if (Showmap[x][y]=='*' )
{
if (Hidemap[x][y]=='0' )
{
if (Countmine(Hidemap,x,y)!=0 )
{
Showmap[x][y] =Countmine(Hidemap,x,y)+'0' ;
}
else
{
Unfoldmap(Hidemap,Showmap,x,y);
}
}
else
{
printf ("你踩到雷了!\n" );
return 0 ;
}
}
return 1 ;
}
void Printmap(char arr[ROW][COL],int row,int col)
{
int i = 0 ;
int j = 0 ;
printf (" 0 " );
for (i=1 ;i<=(col-2 );i++)
{
printf ("% 3d " ,i);
}
printf ("\n" );
printf (" ┏" );
for (j=0 ;j<col-3 ;j++)
{
printf ("━┳" );
}
printf ("━┓\n" );
for (i=1 ;i<=(row-2 );i++)
{
printf ("%2d┃" ,i);
for (j=1 ;j<=(col-2 );j++)
{
printf (" %c" ,arr[i][j]);
printf ("┃" );
}
printf ("\n" );
if (i<row-2 )
{
printf (" ┣" );
for (j=0 ;j<col-3 ;j++)
{
printf ("━╋" );
}
printf ("━┫\n" );
}
}
printf (" ┗" );
for (j=0 ;j<col-3 ;j++)
{
printf ("━┻" );
}
printf ("━┛\n" );
}
void Savepleyer(char Hidemap[ROW][COL],int row,int col,int x,int y)
{
int ret = 1 ;
if (Hidemap[x][y]=='1' )
{
Hidemap[x][y] = '0' ;
while (ret)
{
x = rand() % row;
y = rand() % col;
if (Hidemap[x+1 ][y+1 ] == '0' )
{
Hidemap[x+1 ][y+1 ] = '1' ;
ret--;
}
}
}
}
void Unfoldmap(char Hidemap[ROW][COL],char Showmap[ROW][COL],int x,int y)
{
Showmap[x][y] = ' ' ;
Open(Hidemap,Showmap,(x+1 ),(y+1 ));
Open(Hidemap,Showmap,(x+1 ),(y-1 ));
Open(Hidemap,Showmap,(x+1 ),(y));
Open(Hidemap,Showmap,(x),(y+1 ));
Open(Hidemap,Showmap,(x),(y-1 ));
Open(Hidemap,Showmap,(x-1 ),(y+1 ));
Open(Hidemap,Showmap,(x-1 ),(y-1 ));
Open(Hidemap,Showmap,(x-1 ),(y));
}
int Countshowmine(char Showmap[ROW][COL],int row,int col)
{
int count = 0 ;
int i = 0 ;
int j = 0 ;
for (i=1 ;i<=(row-2 );i++)
{
for (j=1 ;j<=(col-2 );j++)
{
if (Showmap[i][j] == '*' )
{
count++;
}
}
}
return count;
}
注意这里的传参问题。
Game.h头文件
void Initmap(char Hidemap[ROW ][COL ], char Showmap[ROW ][COL ], int row, int col);
void Devicemine(char Hidemap[ROW ][COL ], int row, int col, int mine);
int Countmine(char Hidemap[ROW ][COL ], int x, int y);
int Open(char Hidemap[ROW ][COL ], char Showmap[ROW ][COL ], int x, int y);
void Printmap(char arr[ROW ][COL ], int row, int col);
void Savepleyer(char Hidemap[ROW ][COL ], int row, int col, int x, int y);
void Unfoldmap(char Hidemap[ROW ][COL ], char Showmap[ROW ][COL ], int x, int y);
int Countshowmine(char Showmap[ROW ][COL ], int row, int col);
整个程序就完了,扫雷是一个不错的练手题,难度有,但是对于我们这种初学者来说,完全可以解决。