C++扫雷检查相邻方块并添加提示

C++ Minesweeper checking adjacent squares and adding hints

本文关键字:添加 提示 方块 扫雷 检查 C++      更新时间:2023-10-16

所以,我对如何实现大部分程序有一个很好的主意。但是,我很难想出一种算法来添加与地雷相邻的阵列位置的提示。我看到的真正麻烦是边缘情况几乎让你有两个函数来处理它(我所有函数最多有 20 行)。我知道从矿井的位置,我们想要一个循环来检查行 - 1 到行 +1 和 col -1 到 col +1,但是是否可以使用我为游戏编写的代码在一个函数中做到这一点?如果是这样,一些建议会很棒!

编辑!所以我想我已经想出了适用于所有情况的算法,但它正在输出不良信息。我很确定这是由于选角不当造成的,但我看不出出了什么问题。

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

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转换回字符?

有不同的策略来处理这个问题。一个简单的策略是创建一个更大的网格(每边添加一条线),初始化时没有炸弹;使看板成为隐藏边框的视图。使用此策略,您知道您可以退出游戏板而不会引起问题(因为数据结构具有额外的行)。

或者,

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

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

对于任何单元格 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.