如何制作一个函数来查找国王和车之间是否有任何字母(件)?我不明白当它找到介于两者之间的东西时如何使功能停止。因为到目前为止它表明即使不是国王也在检查。
我的函数在二维char数组的x和y轴上逐个移动,直到它找到碰撞的东西(不是空格(!=' *'))或直到它结束找到一个国王(' k')
void rook_white(piece A[]) // does WR check BK
{
bool check = false;
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if ((!A[t_i].field[m_x-x][m_y] == '*') || (!A[t_i].field[m_x+x][m_y] == '*') ||
(!A[t_i].field[m_x][m_y+y] == '*') || (!A[t_i].field[m_x][m_y-y] == '*'))
{
break;
}
if( A[t_i].field[m_x-x][m_y] == 'k' || A[t_i].field[m_x+x][m_y] == 'k' ||
A[t_i].field[m_x][m_y+y] == 'k' || A[t_i].field[m_x][m_y-y] == 'k')
{
check = true;
}
}
}
if (check == true)
{
ofstream fr(FVR,ios::app);
fr << "Black is in check " << t_i << endl;
}
}
输入文件就像这样:
********
***k****
********
********
***p****
********
********
***R****
是黑人国王
R是白车
p是黑棋子
答案 0 :(得分:0)
你的逻辑完全错了。
但是你似乎误解的一件事是break
只突破了一个循环;你仍然在外部循环中,并且循环继续。
如果你需要一次打破多个循环,这是goto
的标准现代用途之一:
for(...) {
for(...) {
if(reason) { goto loop_exit; }
}
}
// If I wanted to do something special on normal termination, it goes here
loop_exit:
// Stuff to be done after exiting the loop goes here.
(标签loop_exit
可以或多或少地被调用,尽管提供信息有助于提高可读性)
作为奖励,我还注释了上面的代码,以演示goto
的另一个现代用法:模仿for
- else
构造,其中有一段代码,应该只在循环正常退出时才会发生。
但只是为了强调这一点,进行此更改将不使您的功能正确,因为正如我所说,看起来逻辑是完全错误的。