我正在为一个非常基本的C ++课程编写一个井字游戏程序,并且有一个问题让我感到困惑。
以下是userMove()
函数的代码,该函数从用户获取输入并将“X
”写入char数组board[2][2]
。它大部分时间都有效,但问题是如果用户输入row = 1 column = 0
,则board[1][0]
和board[0][2]
都会更改为“X”。
有谁知道为什么会这样?
//! The function userMove().
/*!
The function userMove() takes two integer inputs from the terminal user,
checks to see if the move is a valid one, and updates the char array board.
*/
void userMove() //take player's move
{
//! The int row stores the user's first integer input.
int row;
//! The int column stores the user's second integer input.
int column;
cout << "Enter the row where you'd like your X:";
cin >> row;
cout << "Enter the column where you'd like your X:";
cin >> column;
//! This if statement checks that the user has selected a blank space for
//! their next move. If the space is already taken, the user is informed
//! with an error message and the userMove() function is called
//! recursively.
if(board[row][column] == ' ')
{
board[row][column] = 'X';
}
else
{
cout << "Invalid move\n";
this->userMove();
}
}
答案 0 :(得分:6)
您的尺寸错误。数组维度计算元素,而不是表示最高索引:
char board[3][3];
/**
* Now you may access the following:
*
* board[0][0]
* board[0][1]
* board[0][2]
* board[1][0]
* board[1][1]
* board[1][2]
* board[2][0]
* board[2][1]
* board[2][2]
*/
使用board[2][2]
,您拥有的元素数量少于您的想象,当您尝试获取不存在的元素board[0][2]
的值时,您可能就这样发生了来获取board[1][0]
的值(由于内存访问的工作原理,以及数组在内存中的排列方式) - 这就是为什么你认为这两个元素都发生了写操作的原因
答案 1 :(得分:5)
您需要将您的电路板定义为
char board[3][3];
它是3x3。这允许索引从0到2。
此外,当一个简单的循环执行时,你不应该真正地递归调用该函数。