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

此项目相关博文链接

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

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

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

一步一步实现扫雷游戏(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;
}
初始化地雷分布位置和个数
/*******************************************************************
函数功能:根据设置的地雷个数和分布地图(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
++;//判断地雷个数
}

}
主要看来就是第二函数优化了不少,
我的第一个问题(是否越界问题)没有解决,希望各位看到的朋友们给我解释下,谢谢
posted @ 2011-03-28 13:39  涵曦  阅读(4294)  评论(1编辑  收藏  举报