一步一步实现扫雷游戏(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++;
}
elseif (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++;
}
}
elseif (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++;
}
elseif (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++;
}
elseif (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++;
}
elseif (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++;
}
}
elseif (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++;
}
elseif (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++;
}
elseif (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++;
}
elseif (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++;
}
}
elseif (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++;
}
elseif (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++;
}
elseif (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
作者:涵曦(www.hanxi.cc)
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
《 Skynet 游戏服务器开发实战》
-
学习地址:
-
优惠推荐码:
2CZ2UA5u
-
可以先免费试学前 2 章内容