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