此项目相关博文链接
预定义:
#define MAX_X 100 // 行坐标最大值
#define MAX_Y 100 // 纵坐标最大值
全局数组:
char map[MAX_X][MAX_Y];
// 为坐标数组,存储着地雷的分布
int m,n;
// 为坐标的大小(选择等级时用的上)
// 注意:MAX_X,MAX_Y与m,n的不同之处
算法函数接口:
1 .返回周围地雷个数的函数
/* ***************************************************************************
返回周围地雷个数的函数
函数原型: int round_num_mines(int i,int j);
参 数: int i, int j为当前的坐标
返回值类型: int 返回该坐标处周围的地雷数
返回值情况:(1)返回1-8代表周围有1-8个地雷;
(2)返回0代表周围没有地雷;
(3)返回*代表此坐标时地雷;
***************************************************************************** */
char round_num_mines( int i, int j)
{
int k = 0 ; // 记录周围地雷个数
if (map[i][j] == ' * ' )
{
return ' * ' ;
}
else
{
if (i == 0 ) // 第0行
{
if (j == 0 ) // 第0行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第0行非第0列非第n-1列
{
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
}
else if (i == m - 1 ) // 第m-1行
{
if (j == 1 ) // 第m-1行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第m-1行第n-1列
{
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第m-1行非第0列非第n-1列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
else // 非第0行也非第m-1行
{
if (j == 1 ) // 非第0行第0列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 非第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 非第0行非第0列非第m-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
}
return k;
}
2 .鼠标左键(扫雷)的函数
函数原型: void left_mouse( int i, int j );
参数:
int i, int j为当前的坐标
返回值类型: void
函数实现情况:( 1 )判断i,j;
( 2 )调用函数num_mines();
( 3 )判断函数num_mines()的返回值:
1 )返回1 - 8则在坐标点上画出1 - 8 ,此函数的功能完毕, return ;
2 )返回0则继续调用函数num_mines(),再递归调用函数left_mouse();
3 )返回‘ * ’说明踩到地雷, return , game over !
3 .右键(画出旗帜)的函数
此函数的主要功能是限制此位置,规定该位置不会被显示出数字或‘ * ’
4 .初始化地雷分布位置和个数
/* ******************************************************************
函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
函数原型:void set_mines(int num_mines)
参数:(in)—— int num_mines
******************************************************************** */
void set_mines(int num_mines)
{
int num = 0 ;
while (num <= num_mines)
{
rand_mines(m, n);
// 如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
num = fun_num_mines(m, n); // 判断地雷个数
}
}
// 设置随机选取(i,j),设置a[i][j] = '*'
void rand_mines( int m, int n)
{
int i,j;
srand(time( 0 ));
// rand()%n 取(0,n-1)的随机数
i = rand() % m;
j = rand() % n;
map[i][j] = ' * ' ;
}
// 判断地雷个数
int fun_num_mines( int m, int n)
{
int i,j, k = 0 ;
for (i = 0 ; i < m; i ++ )
{
for (j = 0 ; j < n; j ++ )
{
if (map[i][j] == ' * ' )
{
k ++ ;
}
}
}
return k;
}
5 .主函数
负责选关(设置m,n的大小)、选关接口...............
扫雷游戏程序文档
预定义:
#define MAX_X 100 // 行坐标最大值
#define MAX_Y 100 // 纵坐标最大值
全局数组:
char map[MAX_X][MAX_Y];
// 为坐标数组,存储着地雷的分布
int m,n;
// 为坐标的大小(选择等级时用的上)
// 注意:MAX_X,MAX_Y与m,n的不同之处
算法函数接口:
1 .返回周围地雷个数的函数
/* ***************************************************************************
返回周围地雷个数的函数
函数原型: int round_num_mines(int i,int j);
参 数: int i, int j为当前的坐标
返回值类型: int 返回该坐标处周围的地雷数
返回值情况:(1)返回1-8代表周围有1-8个地雷;
(2)返回0代表周围没有地雷;
(3)返回*代表此坐标时地雷;
***************************************************************************** */
char round_num_mines( int i, int j)
{
int k = 0 ; // 记录周围地雷个数
if (map[i][j] == ' * ' )
{
return ' * ' ;
}
else
{
if (i == 0 ) // 第0行
{
if (j == 0 ) // 第0行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第0行非第0列非第n-1列
{
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
}
else if (i == m - 1 ) // 第m-1行
{
if (j == 1 ) // 第m-1行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第m-1行第n-1列
{
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第m-1行非第0列非第n-1列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
else // 非第0行也非第m-1行
{
if (j == 1 ) // 非第0行第0列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 非第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 非第0行非第0列非第m-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
}
return k;
}
2 .鼠标左键(扫雷)的函数
函数原型: void left_mouse( char a[max_x][max_y], int i, int j, int m, int n);
参数: char a[max_x][max_y]为坐标数组,存储着地雷的分布
int i, int j为当前的坐标
int m, int n为坐标的大小(选择等级时用的上)
返回值类型: void
函数实现情况:( 1 )判断i,j;
( 2 )调用函数num_mines();
( 3 )判断函数num_mines()的返回值:
1 )返回1 - 8则在坐标点上画出1 - 8 ,此函数的功能完毕, return ;
2 )返回0则继续调用函数num_mines(),再递归调用函数left_mouse();
3 )返回‘ * ’说明踩到地雷, return , game over !
3 .右键(画出旗帜)的函数
此函数的主要功能是限制此位置,规定该位置不会被显示出数字或‘ * ’
4 .初始化地雷分布位置和个数
/* ******************************************************************
函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
函数原型:void set_mines(nt m, int n, int num_mines)
参数:(in)—— int num_mines
******************************************************************** */
void set_minesint num_mines)
{
int num = 0 ;
while (num <= num_mines)
{
rand_mines(m, n);
// 如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
num = fun_num_mines(m, n); // 判断地雷个数
}
}
// 设置随机选取(i,j),设置a[i][j] = '*'
void rand_mines( int m, int n)
{
int i,j;
srand(time( 0 ));
// rand()%n 取(0,n-1)的随机数
i = rand() % m;
j = rand() % n;
map[i][j] = ' * ' ;
}
// 判断地雷个数
int fun_num_mines( int m, int n)
{
int i,j, k = 0 ;
for (i = 0 ; i < m; i ++ )
{
for (j = 0 ; j < n; j ++ )
{
if (map[i][j] == ' * ' )
{
k ++ ;
}
}
}
return k;
}
5 .主函数
负责选关(设置m,n的大小)、选关接口...............
预定义:
#define MAX_X 100 // 行坐标最大值
#define MAX_Y 100 // 纵坐标最大值
全局数组:
char map[MAX_X][MAX_Y];
// 为坐标数组,存储着地雷的分布
int m,n;
// 为坐标的大小(选择等级时用的上)
// 注意:MAX_X,MAX_Y与m,n的不同之处
算法函数接口:
1 .返回周围地雷个数的函数
/* ***************************************************************************
返回周围地雷个数的函数
函数原型: int round_num_mines(int i,int j);
参 数: int i, int j为当前的坐标
返回值类型: int 返回该坐标处周围的地雷数
返回值情况:(1)返回1-8代表周围有1-8个地雷;
(2)返回0代表周围没有地雷;
(3)返回*代表此坐标时地雷;
***************************************************************************** */
char round_num_mines( int i, int j)
{
int k = 0 ; // 记录周围地雷个数
if (map[i][j] == ' * ' )
{
return ' * ' ;
}
else
{
if (i == 0 ) // 第0行
{
if (j == 0 ) // 第0行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第0行非第0列非第n-1列
{
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
}
}
else if (i == m - 1 ) // 第m-1行
{
if (j == 1 ) // 第m-1行第0列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 第m-1行第n-1列
{
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 第m-1行非第0列非第n-1列
{
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
else // 非第0行也非第m-1行
{
if (j == 1 ) // 非第0行第0列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
}
else if (j == n - 1 ) // 非第0行第n-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
else // 非第0行非第0列非第m-1列
{
if (map[i + 1 ][j] == ' * ' ) k ++ ;
if (map[i + 1 ][j - 1 ] == ' * ' ) k ++ ;
if (map[i + 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j + 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j] == ' * ' ) k ++ ;
if (map[i - 1 ][j + 1 ] == ' * ' ) k ++ ;
if (map[i][j - 1 ] == ' * ' ) k ++ ;
if (map[i - 1 ][j - 1 ] == ' * ' ) k ++ ;
}
}
}
return k;
}
2 .鼠标左键(扫雷)的函数
函数原型: void left_mouse( char a[max_x][max_y], int i, int j, int m, int n);
参数: char a[max_x][max_y]为坐标数组,存储着地雷的分布
int i, int j为当前的坐标
int m, int n为坐标的大小(选择等级时用的上)
返回值类型: void
函数实现情况:( 1 )判断i,j;
( 2 )调用函数num_mines();
( 3 )判断函数num_mines()的返回值:
1 )返回1 - 8则在坐标点上画出1 - 8 ,此函数的功能完毕, return ;
2 )返回0则继续调用函数num_mines(),再递归调用函数left_mouse();
3 )返回‘ * ’说明踩到地雷, return , game over !
3 .右键(画出旗帜)的函数
此函数的主要功能是限制此位置,规定该位置不会被显示出数字或‘ * ’
4 .初始化地雷分布位置和个数
/* ******************************************************************
函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
函数原型:void set_mines(nt m, int n, int num_mines)
参数:(in)—— int num_mines
******************************************************************** */
void set_minesint num_mines)
{
int num = 0 ;
while (num <= num_mines)
{
rand_mines(m, n);
// 如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
num = fun_num_mines(m, n); // 判断地雷个数
}
}
// 设置随机选取(i,j),设置a[i][j] = '*'
void rand_mines( int m, int n)
{
int i,j;
srand(time( 0 ));
// rand()%n 取(0,n-1)的随机数
i = rand() % m;
j = rand() % n;
map[i][j] = ' * ' ;
}
// 判断地雷个数
int fun_num_mines( int m, int n)
{
int i,j, k = 0 ;
for (i = 0 ; i < m; i ++ )
{
for (j = 0 ; j < n; j ++ )
{
if (map[i][j] == ' * ' )
{
k ++ ;
}
}
}
return k;
}
5 .主函数
负责选关(设置m,n的大小)、选关接口...............
游戏程序还没有完全写完,现在写完的只能在字符模式下运行,界面代码还在进行中...
源代码下载地址:http://u.115.com/file/f0618e7853