c++ - 井字游戏找到匹配符号和获胜者的更好方法?
问题描述
我是编码初学者,这是我创建的最复杂的代码我是一个简单的井字游戏,我想问是否有更好的方法来找到匹配的 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 "";
}
解决方案
首先,您最好将您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, ' ');
}
推荐阅读
- node.js - 设置锯齿浏览器时被 CORS 策略问题阻止
- python - How to do for loop with a list that contains lists with another list?
- html - 为什么导航栏内的容器有限制宽度而不是填充整个宽度?
- android - 如何使用 okhttp post json 并通过 android 获取 jeson 返回?
- javascript - 水合一个 json 对象数组,以便每个具有不同键数的 json 共享最大键
- javascript - 省略分号时,缩小的 Javascript 文件是否更小?
- python - 在python中渲染图像以在html中显示
- vue.js - vuejs crashes when I use v-for to iterate over a iterable
- javascript - jQuery 函数在 TYPO3 10 中不起作用
- html - 如何将视频和图像添加到带有缩略图的图像滑块?