一步一步实现扫雷游戏(C语言实现)(二)
此项目相关博文链接
<1>:返回周围地雷个数的函数
函数原型: int round_num_mines(int i,int j);
原函数见:http://www.cnblogs.com/hanxi/archive/2011/03/27/1997182.html
优化后的
算法函数接口:
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)
{
if (map[i][j] =='*')
{
return'*';
}
int k =0;
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;
}
*/
//改进后的(书上的)代码:
(改进算法)
(1).首先定义一个二维数组:
int dir[8][2] = {
{-1,-1},
{-1, 0},
{-1, 1},
{ 0, 1},
{ 1, 1},
{ 1, 0},
{ 1,-1},
{ 0,-1}};
/*
dir二维数组所表示的8个位置顺序是按顺时针从左上角位置开始。
------------------------------
|(-1,-1)|(-1,0)|(-1,-1)|
------------------------------
|( 0,-1)|( 0, 0)|( 0, 1)|
------------------------------
|( 1,-1)|( 1, 0)|( 1, 1)|
------------------------------
*/
char round_num_mines(int i,int j)
{
int k =0, num_mines =0;
for (k =0; k <8; k++)
{
if (map[i+dir[k][0]][y+dir[k][1]] =='*')
{
num_mines++;
}
}
return num_mines;
}
算法函数接口:
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)
{
if (map[i][j] =='*')
{
return'*';
}
int k =0;
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;
}
*/
//改进后的(书上的)代码:
(改进算法)
(1).首先定义一个二维数组:
int dir[8][2] = {
{-1,-1},
{-1, 0},
{-1, 1},
{ 0, 1},
{ 1, 1},
{ 1, 0},
{ 1,-1},
{ 0,-1}};
/*
dir二维数组所表示的8个位置顺序是按顺时针从左上角位置开始。
------------------------------
|(-1,-1)|(-1,0)|(-1,-1)|
------------------------------
|( 0,-1)|( 0, 0)|( 0, 1)|
------------------------------
|( 1,-1)|( 1, 0)|( 1, 1)|
------------------------------
*/
char round_num_mines(int i,int j)
{
int k =0, num_mines =0;
for (k =0; k <8; k++)
{
if (map[i+dir[k][0]][y+dir[k][1]] =='*')
{
num_mines++;
}
}
return num_mines;
}
初始化地雷分布位置和个数
/*******************************************************************
函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
函数原型:void set_mines(nt m, int n, 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;
}
(优化后)
void set_mines(int num_mines)
{
int num =0;
int i,j;
while (num <= num_mines)
{
srand(time(0));
//rand()%n 取(0,n-1)的随机数
i = rand() % m;
j = rand() % n;
//如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
if (i<0|| i>m || j<0|| j>n || map[i][j] =='*')
{
continue;
}
map[i][j] ='*';
num++;//判断地雷个数
}
}
/*******************************************************************
函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
函数原型:void set_mines(nt m, int n, 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;
}
(优化后)
void set_mines(int num_mines)
{
int num =0;
int i,j;
while (num <= num_mines)
{
srand(time(0));
//rand()%n 取(0,n-1)的随机数
i = rand() % m;
j = rand() % n;
//如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
if (i<0|| i>m || j<0|| j>n || map[i][j] =='*')
{
continue;
}
map[i][j] ='*';
num++;//判断地雷个数
}
}
我的第一个问题(是否越界问题)没有解决,希望各位看到的朋友们给我解释下,谢谢
作者:涵曦(www.hanxi.cc)
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
《 Skynet 游戏服务器开发实战》
-
学习地址:
-
优惠推荐码:
2CZ2UA5u
-
可以先免费试学前 2 章内容