C语言----扫雷游戏

Posted ftzchina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言----扫雷游戏相关的知识,希望对你有一定的参考价值。

扫雷游戏本题设置了四个规则:

1,如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X' 。

2,如果一个 没有相邻地雷 的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
3,如果一个 至少与一个地雷相邻 的空方块('E')被挖出,修改它为数字('1' 到 '8' ),表示相邻地雷的数量。

4,如果在此次点击中,若无更多方块可被揭露,则返回盘面。

 解题思路:

1,从给出的点出发,如果该点很不幸就是雷,置为'X',game over,匹配规则1,

2,不是雷的情况,采用深度搜索算法(dfs),对于当前点,如果为'E'说明没有被涉足,我们扫描以该点为中心的九宫格,统计雷的个数count(即字符'M'的个数)

3,如果count为0,说明没有雷,将'E'置为'B',匹配规则2;

4,如果count不为0,说明有雷,置为count数,并且从该点出发搜索九宫格,匹配规则3

 代码如下:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
void dfs(char** board, int x, int y, int boardSize, int boardColSize)

    if(x<0 || x>=boardSize || y<0 || y>=boardColSize || board[x][y] != 'E') //首先对当前搜索的点(x,y)做合法性检查,保证在搜索的区域内
        return;
    int count = 0;
    int i,dx,dy;
    int x_dir[8] = -1,0,1,-1,1,-1,0,1;//八个方向搜索
    int y_dir[8] = 1,1,1,0,0,-1,-1,-1;
    for(i=0; i<8; i++)
    
        dx = x + x_dir[i];
        dy = y + y_dir[i];
        if(dx<0 || dx>=boardSize || dy<0 || dy>=boardColSize)
            continue;
        else if(board[dx][dy] == 'M')   //如果是雷,则统计雷的个数
            count++;
    
    if(count != 0)   //如果count不为0,说明周边有雷,匹配规则3后返回
        board[x][y] = count + '0';
    else
       //如果count为0,说明周边没有雷,匹配规则2,以该点为中心继续搜索,八个方向搜索完后返回
        board[x][y] = 'B';
        for(i=0; i<8; i++)
        
            dx = x + x_dir[i];
            dy = y + y_dir[i];
            dfs(board,dx,dy,boardSize,boardColSize);
        
    
    return;


char** updateBoard(char** board, int boardSize, int* boardColSize, int* click, int clickSize, int* returnSize, int** returnColumnSizes)

    int click_x = click[0];
    int click_y = click[1];
    if(board[click_x][click_y] == 'M')  //匹配规则1
        board[click_x][click_y] = 'X';
    else
        dfs(board,click_x,click_y,boardSize,boardColSize[0]);
        
    *returnSize = boardSize;
    (*returnColumnSizes) = (int*)malloc(sizeof(int)*boardSize);
    for(int i=0; i < boardSize; ++i)
        (*returnColumnSizes)[i] = boardColSize[0];

    return board;

运行结果:

 

以上是关于C语言----扫雷游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言游戏超详解扫雷游戏完整版,细节满满!!

C语言游戏超详解扫雷游戏完整版,细节满满!!

c语言初学者如何代码实现 扫雷 游戏

C语言实现扫雷游戏(一步步教你如何写扫雷)

C语言实现扫雷(初阶)

C语言实现小游戏篇我接触的第一款电脑游戏,你可以永远相信 “ 扫雷 ” 。[ C语言实现 ] [ 超详细,超清楚 ] [ 有代码 ]