我的“赢”功能有什么问题

时间:2017-11-17 12:38:34

标签: c cs50

我正在哈佛CS50的PSET3上线工作,并且在CS50游戏十五的“赢”功能方面遇到了问题。

该功能适用​​于4x4网格拼图但不适用于3x3

如果是3x3,该函数会过早地返回true几个步骤。

对于3x3大小的游戏,该函数需要以1到8的升序顺序查看数字的2D数组,并且在4x4大小的游戏中以1到15查看数组的最后一个元素为零。

我对代码的思考过程是我最初将计数器设置为1并将其与数组的第一个元素进行对比。如果匹配则将计数器增加1并重复下一个元素。

如果计数器达到数组中元素的总数,则返回true,如果计数器在任何时候都与相应的数组元素不匹配,则返回false。

你能看出我做错了吗?

/**
 * Returns true if game is won (i.e., board is in winning configuration)
 * else false.
 */
bool won(void)
{
    // TODO

    int counter = 1;

    for (int i=0; i < d; i++)
    {
        for (int j=0; j < d; j++)
        {
            if (board[i][j] == counter) 
            {
                counter++;
            }
            if (counter == (d*d)) 
            {
                return true;
            }
        }
    }
    return false;
}

1 个答案:

答案 0 :(得分:1)

如果所有元素都按顺序排列,则won例程返回true,忽略值为零的元素。因此,如果元素是:

1 2 3
_ 4 5
6 7 8

然后,当代码看到1,2和3时,代码会递增counter。当它看到上面显示counter的0时,它不会递增_。然后当它看到4,5,6,7和8时它将递增counter。然后counter为9,因此它等于d*dwon返回true。

从根本上说,您的won例程过于灵活。如果当前元素等于counter,则在每个步骤增加counter - 否则它是被动的。也就是说,即使不满足所需条件,它也会继续检查。由于只有一个“获胜”位置,如果任何元素不在位置,您可以在看到它时立即返回false