game.h
void Initialize(char a[ROWS ][COLS ], int rows, int cols, char b);//对a数组进行初始化
void Output(char a[ROWS ][COLS ], int row, int col);//打印出有雷和无雷的地方
void Mine(char a[ROWS ][COLS ], int row, int col,int f); //布雷
int Player(char b[ROWS ][COLS ],char a[ROWS ][COLS ], int row, int col,int *count);//玩家走
int Judge(char a[ROWS ][COLS ], int row, int col);//判断是否排雷成功
void Spread(char p[ROWS ][COLS ],char q[ROWS ][COLS ], int rows, int cols,int m, int n);//递归展开
game.c
void Initialize(char a[ROWS][COLS], int rows, int cols, char b)//对a数组初始化
{
int i = 0 ;
int j = 0 ;
for (i = 0 ; i < rows; i++)
{
for (j = 0 ; j < cols; j++)
{
a[i][j] = b;
}
}
}
void Output(char a[ROWS][COLS], int row, int col)//打印出有雷和无雷的地方
{
int i = 0 ;
int j = 0 ;
for (i = 1 ; i <= row; i++)
{
printf (" %d " , i);
}
printf ("\n" );
for (i = 1 ; i <= row; i++)
{
for (j = 1 ; j <= col; j++)
{
printf ("----" );
}
printf ("\n" );
for (j = 1 ; j <= col; j++)
{
printf ("|" );
printf (" %c " , a[i][j]);
}
printf ("| %d \n" , i);
}
for (j = 1 ; j <= col; j++)
{
printf ("----" );
}
printf ("\n\n" );
}
void Mine(char a[ROWS][COLS], int row, int col, int f) //布雷
{
// 在arr[][]中放雷
int i = 0 ;
int j = 0 ;
int count = 0 ;
while (count < f)
{
i = rand ()%9 + 1 ;
j = rand ()%9 + 1 ;
if (a[i][j] == '0' &&i > 0 &&i <= row&&j > 0 &&j <= row)
{
a[i][j] = '1' ;
count++;
}
}
}
int Player(char b[ROWS][COLS], char a[ROWS][COLS], int row, int col,int *count )//玩家走,*count 是用来计算保证第一次踩雷之后,不被炸死。
{
int m = 0 ;
int n = 0 ;
int r = 0 ;
// 标记还是排雷
while (1 )
{
printf ("请选择标记还是排雷:(1.排雷,2.标记)\n" );
scanf("%d " , &r);
if (r < 1 ||r > 2 )
{
printf ("输入错误请重新输入\n" );
}
else
{
break ;
}
}
//标记
if (r == 2 )
{
int i = 0 ;
int j = 0 ;
printf ("请输入要标记的坐标:" );
while (1 )
{
scanf("%d %d " , &i, &j);
if ((i<0 )||(i>row)||(j<0 )||(j>row))
{
printf ("坐标错误,请重新输入:" );
}
else
{
break ;
}
}
if (a[i][j] == '1' )
{
a[i][j] = 'X' ;
b[i][j] = 'X' ;
printf ("标记成功\n" );
return 0 ;
}
if (a[i][j] == '0' )
{
printf ("标记失败,你阵亡了\n" );
return 2 ;
}
}
//排雷
if (r == 1 )
{
int i = 0 ;
int j = 0 ;
printf ("玩家输入坐标:" );
while (1 )
{
scanf("%d %d " , &i, &j);
if (i < 1 ||i > row||j < 0 || j > col)
{
printf ("坐标错误" );
}
else
{ if (b[i][j] != '*' )
{
printf ("此处已经显示,请选择未知区\n" );
}
else
{
break ;
}
}
}
if (a[i][j] == '1' )
{
if (*count == 0 ) //第一个中雷也不会死
{
while (*count < 1 )
{
m = rand ()%9 + 1 ;
n = rand ()%9 + 1 ;
if ((a[m ][n] == '0' )&&(i > 0 )&&(i <= row)&&(j > 0 )&&(j <= row))
{
a[i][j] = '0' ;
a[m ][n] = '1' ;
*count =2 ;
/* Output(a, ROW, COL); */
Spread(b,a, row, col,i, j);
}
}
}
else
{
return 2 ;// 除了第一步,下次也中雷的情况
}
}
else if (i <= row&&i > 0 && j <= row&&i > 0 )
Spread(b,a,row, col,i,j);
}
return 0 ;// 继续走
}
int Judge(char a[ROWS][COLS], int row, int col)//判断否成功排雷
{
int i = 0 ;
int j = 0 ;
int count = 0 ;
for (i = 1 ; i <= row; i++)
{
for (j = 1 ; j <= col; j++)
{
if (a[i][j] == '*' ||a[i][j] == 'X' )//只要标记成功的个数与现有雷的个数相同就成功了
{
count++;
}
}
}
return count;
}
void Spread(char p[ROWS][COLS],char q[ROWS] [COLS], int rows, int cols,int m , int n) //递归展开
{
int ret;
p[m ][n] = ((q[m-1] [n-1 ] + q[m] [n-1 ] + q[m+1] [n-1 ] + q[m+1] [n] + q[m+1] [n+1 ] + q[m] [n+1 ] + q[m-1] [n+1 ] + q[m-1] [n]) - 8 *' 0 ');
ret = p[m][n];
if(ret== 0)
{
p[m][n] = ' 0 ';
if(p[m-1][n-1]==' *' &&(m -1 )> 0 &&(m -1 )<rows&&(n-1 )> 0 &&(n-1 )<rows)
{
Spread(p,q , rows, cols,m -1 , n-1 );
}
if (p[m ][n-1 ]=='*' &&(m )> 0 &&(m )<rows&&(n-1 )> 0 &&(n-1 )<rows)
{
Spread(p,q , rows, cols,m , n-1 );
}
if (p[m +1 ][n-1 ]=='*' &&(m +1 )> 0 &&(m +1 )<rows&&(n-1 )> 0 &&(n-1 )<rows)
{
Spread(p,q , rows, cols,m +1 , n-1 );
}
if (p[m +1 ][n]=='*' &&(m +1 )> 0 &&(m +1 )<rows&&(n)> 0 &&(n)<rows)
{
Spread(p,q , rows, cols,m +1 , n);
}
if (p[m +1 ][n+1 ]=='*' &&(m +1 )> 0 &&(m +1 )<rows&&(n+1 )> 0 &&(n+1 )<rows)
{
Spread(p,q , rows, cols,m +1 , n+1 );
}
if (p[m ][n+1 ]=='*' &&(m )> 0 &&(m )<rows&&(n+1 )> 0 &&(n+1 )<rows)
{
Spread(p,q , rows, cols,m , n+1 );
}
if (p[m -1 ][n+1 ]=='*' &&(m -1 )> 0 &&(m -1 )<rows&&(n+1 )> 0 &&(n+1 )<rows)
{
Spread(p,q , rows, cols,m -1 , n+1 );
}
if (p[m -1 ][n]=='*' &&(m -1 )> 0 &&(m -1 )<rows&&(n)> 0 &&(n)<rows)
{
Spread(p,q , rows, cols,m -1 , n);
}
}
else
{
p[m ][n] = ((q[m-1] [n-1 ] + q[m] [n-1 ] + q[m+1] [n-1 ] + q[m+1] [n] + q[m+1] [n+1 ] + q[m] [n+1 ] + q[m-1] [n+1 ] + q[m-1] [n]) - 8 *' 0 ');
p[m][n] = p[m][n] + ' 0 ';
}
}
4.4.c
#include"game.h"
void Menu()
{
printf ("******************\n" );
printf ("*****1. paly *****\n" );
printf ("*****0. exit *****\n" );
printf ("******************\n" );
}
void Game()
{
int f = 0 ;
int g = 0 ;
char arr[ROWS][COLS] = {0 };
char show[ROWS][COLS] = {0 };
int h = 0 ;
printf ("请选择难度:(1.简单(10个雷), 2.困难(40个雷),3.地狱(60个雷))" );
while (1 )
{
scanf ("%d" , &f);
if (f<0 ||f>3 )
{
printf ("输入错误,请重新输入" );
}
else
{
break ;
}
}
if (f == 1 )
{
g = A;
}
else if (f == 2 )
{
g = S;
}
else
{
g = SS;
}
Initialize(arr, ROWS, COLS, '0' );
Initialize(show, ROWS, COLS, '*' );
Output(show, ROW, COL);
Mine(arr, ROW, COL,g);
while (1 )
{
int q = 0 ;
int s = 0 ;
s = Player(show,arr, ROW, COL,&h);
q = Judge(show, ROW, COL);
if (q == g)
{
printf ("恭喜你,排雷成功\n" );
break ;
}
if (s == 2 )
{
system("cls" );
printf ("很遗憾,你被炸死了\n" );
Output(arr, ROW, COL);
break ;
}
else
{
system("cls" );
Output(show, ROW, COL);
}
}
}
void Text()
{
int input = 0 ;
do
{
Menu();
printf ("请选择》(1或0):" );
scanf ("%d" , &input);
switch (input)
{
case 1 :
Game();
break ;
case 0 :
printf ("退出游戏\n" );
break ;
default :
break ;
}
}while (input);
}
int main()
{
srand((unsigned )time(NULL));
Text();
system("pause" );
return 0 ;
}