C ++ Minesweeper检查相邻的正方形并添加提示

时间:2016-03-13 17:36:24

标签: c++ algorithm

所以,我对如何实现大部分程序非常了解,但是我很难想出一个算法来添加与地雷相邻的数组位置的提示。我所看到的真正麻烦的是,边缘情况几乎使你有两个有两个函数来处理它(我在所有函数上都有20行最大值)。我知道从我的位置我们想要一个循环检查行 - 1到行+1和col -1到col +1,但是有可能在一个函数中用我对游戏的代码执行此操作吗?如果是这样,一些建议会很棒!

EDIT! 所以我想我已经提出了适用于所有情况的alogorithem,但它输出了不良信息。我很确定这是由于不正确的演员,但我无法看到什么错误。

以下是我为添加提示而编写的两个函数:

void add_hints_chk(char ** game_board, int cur_row, int cur_col, int
   rows, int cols)

{

int row_start = 0, row_end = 0, col_start = 0, col_end = 0;

    if (cur_row - 1 < 0)
    {
        //Top edge case
        row_start = 0;
    }
    else
    {
        row_start = cur_row - 1;
    }
    if (cur_row + 1 > rows - 1)
    {
        //bottom edge case
        row_end = rows - 1;
    }
    else
    {
        row_end = cur_row + 1;
    }
    if (cur_col - 1 < 0)
    {
        //Left edge case
        col_start = 0;
    }
    else
    {
        col_start = cur_col - 1;
    }
    if (cur_col - 1 > cols - 1)
    {
        //Right edge case
        col_end = cols - 1;
    }
    else
    {
        col_end = cur_col + 1;
    }

    add_hints(game_board, row_start, row_end, col_start, col_end);

}


void add_hints(char **board, int row_start, int row_end, int col_start,
 int col_end)

{
    int tmp_int = 0;

for (int i = row_start; i <= row_end; i++)
{
    for (int j = col_start; j <= col_end; j++)
    {
        if (board[i][j] != '*')
        {
            if (board[i][j] == ' ')
            {
                tmp_int = 1;
                board[i][j] = (char)tmp_int;
            }
            else
            {
                tmp_int = (int)board[i][j];
                tmp_int++;
                board[i][j] += (char)tmp_int;
            }
        }
    }
}
}

所以,当我打印数组时,我得到一个带有q标记的小盒子。我是否错误地将tmp_int转换回char?

2 个答案:

答案 0 :(得分:2)

有不同的策略来处理这个问题。一个简单的策略是创建一个更大的网格(每边添加一行),初始化没有炸弹;使董事会成为隐藏边界的观点。有了这个策略,你就知道你可以走出游戏板而不会引起问题(因为数据结构还有一行)。

或者,您可以在调用测试函数之前测试坐标是否在有效范围内,或者作为该函数中的第一步。

此外,您可以考虑预先计算所有地图的值,每当您在赛前阶段向棋盘添加炸弹时,增加所有周围位置附近炸弹的计数器。您可以使用上述任一方法来处理边界条件。

答案 1 :(得分:0)

对于任何单元格C,有8个可能的位置需要检查:

# # #  
# C # 
# # #  

在从数组中提取数据之前,必须对每个外部位置进行边界检查。

您可以概括,例如,如果值(列-1)超出范围,则无需检查3个位置。

在你的情况下,我会使用强力方法并在访问之前检查每个外部单元格的边界。如果分析将此识别为主要瓶颈,则返回并优化它。否则继续前进。

编辑1:直言不讳

int C_left = C_column - 1;
int C_right = C_column + 1;
if (C_left >= 0)
{
  // The left column can be accessed.
}
if (C_right < MAXIMUM_COLUMNS)
{
  // The right columns can be accessed.
}
// Similarly for the rows.