改写了一个扫雷小游戏

本博主比较喜欢扫雷,但是玩的很差。最近装了个redhat,好不容易把centos的源给整好了,但是发现没有扫雷这个经典的游戏。($yum search saolei---no result $yum search mine ---no saolei)。于是要么下载一个,要么就自己写一个。就在我找扫雷源码的时候,我找到了大牛dave_cn的博客:http://www.cnblogs.com/dave_cn/archive/2010/10/13/1849342.html

大牛的扫雷游戏已经很好了,可是少了两个功能,这两个功能对我这种菜鸟级玩家特别的重要。一个是在打开所有相邻为0的格子的时候还可以打开最后一层不为0且不是雷的格子。第二个功能是windows扫雷里面,鼠标左右两个键一起按的自动挖坑功能。加上这两个功能之后,我就玩的很高兴了。下面只贴出不一样的代码吧。

int clean_zero_squares(struct square_t square[MINEAREA_WIDTH][MINEAREA_LENGTH], int cur_y, int cur_x)
{
if (check_yx(cur_y - 1, cur_x) == 0
&& ( square[cur_y - 1][cur_x].mine == SQUARE_ZERO
|| (square[cur_y][cur_x].mine == SQUARE_ZERO
&& square[cur_y-1][cur_x].mine != SQUARE_MINE) )
&& square[cur_y - 1][cur_x].type != SQUARE_CLEAN)
{
square[cur_y - 1][cur_x].type = SQUARE_CLEAN;
clean_zero_squares(square, cur_y - 1, cur_x);
}
if (check_yx(cur_y + 1, cur_x) == 0
&& ( square[cur_y + 1][cur_x].mine == SQUARE_ZERO
|| (square[cur_y][cur_x].mine == SQUARE_ZERO
&& square[cur_y + 1][cur_x].mine != SQUARE_MINE) )
&& square[cur_y + 1][cur_x].type != SQUARE_CLEAN)
{
square[cur_y + 1][cur_x].type = SQUARE_CLEAN;
clean_zero_squares(square, cur_y + 1, cur_x);
}

if (check_yx(cur_y, cur_x-1) == 0
&& ( square[cur_y][cur_x-1].mine == SQUARE_ZERO
|| (square[cur_y][cur_x].mine == SQUARE_ZERO
&& square[cur_y][cur_x-1].mine != SQUARE_MINE) )
&& square[cur_y ][cur_x-1].type != SQUARE_CLEAN)
{
square[cur_y ][cur_x-1].type = SQUARE_CLEAN;
clean_zero_squares(square, cur_y, cur_x-1);
}

if (check_yx(cur_y, cur_x+1) == 0
&& ( square[cur_y ][cur_x+1].mine == SQUARE_ZERO
|| (square[cur_y][cur_x].mine == SQUARE_ZERO
&& square[cur_y][cur_x+1].mine != SQUARE_MINE) )
&& square[cur_y ][cur_x+1].type != SQUARE_CLEAN)
{
square[cur_y ][cur_x+1].type = SQUARE_CLEAN;
clean_zero_squares(square, cur_y, cur_x+1);
}

return 0;
}

以上是第一个功能的代码,下面展出第二个功能的代码:

case 'k':
case 'K':
if (square[g_cur_y][g_cur_x].type == SQUARE_CLEAN)
{
bool alive = true;
int num_mine = 0;
int index[2] = {g_cur_y - 1, g_cur_x -1};
int times = 0;
do
{
if ( ( check_yx(index[0],index[1]) != -1) && ( square[index[0]][index[1]].type == SQUARE_FLAG) )
{
num_mine++;
if ( square[index[0]][index[1]].mine != SQUARE_MINE )
alive = false;
}
index[0] += circle_iter[2*times];
index[1] += circle_iter[2*times+1];
times ++;
}while(alive && (times <= 7));
if ( alive && num_mine == square[g_cur_y][g_cur_x].mine)
{
//open all
index[0] = g_cur_y - 1;
index[1] = g_cur_x - 1;
times = 0;
do
{
if ( ( check_yx(index[0],index[1]) != -1 ) && ( square[index[0]][index[1]].type == SQUARE_INIT ) )
square[index[0]][index[1]].type = SQUARE_CLEAN;
index[0] += circle_iter[2*times];
index[1] += circle_iter[2*times + 1];
times ++;
}
while( times <= 7 );
}
win_refresh(square, MINEAREA_WIDTH, MINEAREA_LENGTH, remain_mines);
break;
}

最后还多定义了一个全局变量:

int circle_iter[16] = {1,0,1,0,0,1,0,1,-1,0,-1,0,0,-1, 0, 0};//Iterator all the neibours

感谢dave_cn的代码,现在的代码还有个bug,但我很喜欢这个bug....



posted @ 2012-01-12 21:45  sunhaohui  Views(754)  Comments(1)    收藏  举报