首页 > 解决方案 > 井字游戏找到匹配符号和获胜者的更好方法?

问题描述

我是编码初学者,这是我创建的最复杂的代码我是一个简单的井字游戏,我想问是否有更好的方法来找到匹配的 X 和 O

string getWinner(string _gameBoard[ROW][COL]) // get the winner
{
    

    for (int i = 0; i < ROW; i++)
        {
            if (_gameBoard[i][0] != " " && _gameBoard[i][0] == _gameBoard[i][1] && _gameBoard[i][1] == _gameBoard[i][2])
                return _gameBoard[i][0]; //horizontal match
        }
    
        for (int j = 0; j < COL; j++)
        {
            if (_gameBoard[0][j] != " " && _gameBoard[0][j] == _gameBoard[1][j] && _gameBoard[1][j] == _gameBoard[2][j])
                return _gameBoard[0][j]; //vertical match
        }
    
        if (_gameBoard[0][0] != " " && _gameBoard[0][0] == _gameBoard[1][1] && _gameBoard[1][1] == _gameBoard[2][2])
            return _gameBoard[0][0]; // diagonal match // upper left to lower right
    
        if (_gameBoard[2][0] != " " && _gameBoard[2][0] == _gameBoard[1][1] && _gameBoard[1][1] == _gameBoard[0][2])
            return _gameBoard[2][0]; // diagonal match // upper lower left to upper right
    
        return "";
    }

标签: c++

解决方案


首先,您最好将您gameBoard的 2D 数组保存为char,因为string它很重且没有必要。

接下来,正如我在评论中建议的那样,您可以将所有逻辑拆分为单独的函数。不要害怕它们返回奇怪std::pair<bool, char>,这只是从单个函数返回两个值的一种方式(从技术上讲,它返回一个值,但它里面有一个bool和一个char)。boolean 对应于检查后是否找到中奖者,character 对应于中奖者的角色,如果有的话。

在每个函数内部都有一个循环。这个循环比较i'th元素和0'th元素。如果您发现它们不相等,则整个行/列/对角线不相等,因此我们返回没有赢家。如果函数到达终点,则意味着所有值都相等,因此有赢家。

getWinner然后只需调用所有函数并决定谁最终获胜。

std::pair<bool, char> checkRow(char gameBoard[ROW][COL], int rowId) {
  for (int i = 1; i < COL; ++i) {
    if (gameBoard[rowId][i] != gameBoard[rowId][0]) {
      return std::make_pair(false, ' '); // false indicates no winner on this row 
    }
  }
  return std::make_pair(true, gameBoard[rowId][0]); // true indicates there is a winner
}

std::pair<bool, char> checkCol(char gameBoard[ROW][COL], int colId) {
  for (int i = 1; i < ROW; ++i) {
    if (gameBoard[colId][i] != gameBoard[colId][0]) {
      return std::make_pair(false, ' '); // false indicates no winner on this col 
    }
  }
  return std::make_pair(true, gameBoard[colId][0]); // true indicates there is a winner
}

std::pair<bool, char> checkDownDiagonal(char gameBoard[ROW][COL]) {
  for (int i = 1; i < COL; ++i) {
    if (gameBoard[i][i] != gameBoard[0][0]) {
      return std::make_pair(false, ' '); // false indicates no winner on this diagonal 
    }
  }
  return std::make_pair(true, gameBoard[0][0]); // true indicates there is a winner
}

std::pair<bool, char> checkUpDiagonal(char gameBoard[ROW][COL]) {
  for (int i = 1; i < COL; ++i) {
    if (gameBoard[ROW-1-i][i] != gameBoard[ROW-1][0]) {
      return std::make_pair(false, ' '); // false indicates no winner on this diagonal 
    }
  }
  return std::make_pair(true, gameBoard[0][0]); // true indicates there is a winner
}

std::pair<bool, char> getWinner(char gameBoard[ROW][COL]) {
  auto downDiag = checkDownDiagonal(gameBoard);
  if (downDiag.first) return downDiag; // `first` is flag if there's a winner
  
  auto upDiag = checkUpDiagonal(gameBoard);
  if (upDiag.first) return upDiag;
  
  for(int i = 0; i < ROW; ++i) {
    auto rowCheck = checkRow(gameBoard, i);
    if (rowCheck.first) return rowCheck;
  }

  for(int i = 0; i < COL; ++i) {
    auto colCheck = checkRow(gameBoard, i);
    if (colCheck.first) return colCheck;
  }
  return std::make_pair(false, ' ');
}

推荐阅读