C++扫雷检查相邻方块并添加提示
C++ Minesweeper checking adjacent squares and adding hints
所以,我对如何实现大部分程序有一个很好的主意。但是,我很难想出一种算法来添加与地雷相邻的阵列位置的提示。我看到的真正麻烦是边缘情况几乎让你有两个函数来处理它(我所有函数最多有 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.
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 添加带有 QSyntaxHighlight 和 QTextCharFormat 的工具提示
- 将工具提示添加到 ComboBoxEx 失败
- 将变量添加到作为提示的输入参数
- C++扫雷检查相邻方块并添加提示
- float4 -乘-添加性能提示