C ++ Tic tac toe程序

时间:2014-05-29 21:11:37

标签: c++

我正在为一个非常基本的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();
   }
}

2 个答案:

答案 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。

此外,当一个简单的循环执行时,你不应该真正地递归调用该函数。