int Square::countmines(){
int numofmines = 0;
for (int valuey = y_ - 1; valuey < valuey + 2; valuey ++){
for (int valuex = x_ -1; valuex < valuex + 2; valuex ++){
if(lauta_-> at(valuex).at(valuey).returnmine() == true){
numofmines ++;
}
}
我试图用c ++为学校项目编写一个扫雷游戏。 Square是一个具有x和y坐标的对象,如果有一个矿,则是一个布尔值。计数地雷通过遍历它周围的每个方块来计算广场附近有多少个地雷,如果有一个地雷,则为numofmines值增加+1。
问题在于,当计算位于板边缘的正方形的正方形附近时,程序会抛出索引错误。在python中我可以像这样解决它:
try:
<MY CODE>
except IndexError:
pass
在c ++中有类似的方法吗?
答案 0 :(得分:3)
问题在于,当计算位于板边缘的正方形的附近地雷时,程序会抛出索引错误。
是的,它告诉你不要这样做。你没有忽略这个错误,你修改了代码来停止这样做。
您需要让程序检测edge case并以不同方式处理它。这就是编程的内容,不仅仅针对所有情况做同样的事情而忽略了错误。
修改强>
在c ++中有类似的方法吗?
您需要阅读C ++中的try
和catch
。
答案 1 :(得分:1)
您可以使用[valuex]
代替at(values)
等来忽略错误。这将使您完全陷入未定义的行为领域。不要这样做。有两种直接解决此问题的方法:添加保护方块,或在索引到数组之前检查边界。
对于保护方块,而不是数组的大小,将每个维度增加2。当您访问&#34;真实&#34;正方形,每个索引值加1。当您计算时,只需按照您现在正在进行的方式访问广场。通过在雷区周围放置一个保护区边界,您可以使用距离雷区边界一次的索引值,而不会超出基础阵列。
要检查边界,当你在雷区的边缘时,不要使用-1或+2索引。
答案 2 :(得分:0)
你的问题是缺乏抽象。
如果你有一个竞技场的类,它有一个很好的访问函数来判断一个字段是我的,那么你可以只修改那个访问器,为越界而不是错误返回false。
答案 3 :(得分:0)
提前计算您的限制并使用它们,而不是在for循环中包含计算。您还将修复其他错误(在溢出整数之前,valuey&lt; valuey + 2始终为真。)
int Square::countmines(){
int numofmines = 0;
auto lowerx = std::max(x_ - 1, 0);
auto upperx = std::min(x_ + 1, (int)lauta_->size());
for (int valuex = lowerx; valuex < upperx; valuex ++){
auto lowery = std::max(y_ - 1, 0);
auto uppery = std::min(y_ + 1, (int)lauta_->at(valuex).size());
for (int valuey = lowery; valuey < uppery; valuey ++){
if(lauta_-> at(valuex).at(valuey).returnmine() == true){
numofmines ++;
}
}
}
return numofmines;
}
如果您将宽度和高度存储为类中的值,则可以将那些size()调用和强制转换设置为int而不是