一步一步实现扫雷游戏(C语言实现)(一)

此项目相关博文链接

一步一步实现扫雷游戏(C语言实现)(一)

一步一步实现扫雷游戏(C语言实现)(二)

一步一步实现扫雷游戏(C语言实现)(三)

一步一步实现扫雷游戏(C语言实现)(四)

 


预定义:
#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的大小)、选关接口...............

游戏程序还没有完全写完,现在写完的只能在字符模式下运行,界面代码还在进行中...

源代码下载地址:http://u.115.com/file/f0618e7853

转载于:https://www.cnblogs.com/hanxi/archive/2011/03/27/1997182.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值