所以,我对如何实现大部分程序非常了解,但是我很难想出一个算法来添加与地雷相邻的数组位置的提示。我所看到的真正麻烦的是,边缘情况几乎使你有两个有两个函数来处理它(我在所有函数上都有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?
答案 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.