以下是用于分析Tic-Tac-Toe板的功能的第一部分。
如果玩家“即将获胜”,aboutToWin()
函数返回true,即连续两次。棋盘表示如果玩家1在该方格中移动,则3x3矩阵中的值将为1.玩家2将为-1。如果没有人采取行动,则为0。
我在这个问题中提出的部分是第一部分,它检查负对角线(即板上的位置1,5和9)。
bool aboutToWin(int squares[3][3], int& position, bool p1)
{
// The value you are looking for is 2 for p1 and -2 for p2
int check = 2;
if (!p1)
{
check = -2;
}
// Check negative diagonal
int sum = 0;
// Go through negative diagonal
for (int i = 0; i < 3; i++)
{
sum += squares[i][i];
// Saves the position of the last checked 0 square
// If check passes, this will be the winning square
// If not, it will get handled and overwritten
if (squares[i][i] == 0)
{
// Calculates position from i
position = 1 + (4 * i);
std::cout << "\nPosition: " << position << "\n";
}
}
// If this diagonal added to check, stop the function and return now
if (sum == check)
return true;
...
}
这是我从main()
函数运行的代码,用于测试此功能:
int p;
std::cout << p;
int a3[3][3] = {{1, 0, 1},
{0, 0, 0},
{0, 0, 1}};
std::cout << "\nShould be 1, 5: " << aboutToWin(a3, p, true) << ", " << p;
输出如下:
0 Position: 5 Should be true, 5: 1, 0
这是为什么?我可以看到该值在函数期间发生了变化,但它没有转移出函数。
答案 0 :(得分:4)
使用问题:
std::cout << "\nShould be 1, 5: " << aboutToWin(a3, p, true) << ", " << p;
除非使用C ++ 17,否则不会定义参数的评估顺序。
在调用p
之前,您的设置中首先评估aboutToWin
。
分开通话。
auto ret = aboutToWin(a3, p, true);
std::cout << "\nShould be 1, 5: " << ret << ", " << p;