初学者国际象棋运动中断功能

时间:2015-10-21 20:50:26

标签: c++ chess

如何制作一个函数来查找国王和车之间是否有任何字母(件)?我不明白当它找到介于两者之间的东西时如何使功能停止。因为到目前为止它表明即使不是国王也在检查。

我的函数在二维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是黑棋子

1 个答案:

答案 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构造,其中有一段代码,应该只在循环正常退出时才会发生。

但只是为了强调这一点,进行此更改将使您的功能正确,因为正如我所说,看起来逻辑是完全错误的。