【发布时间】:2025-12-29 08:50:07
【问题描述】:
好的,所以我非常接近完成这个程序。我理解为什么我的程序没有采取行动并且我能够修复它,但现在我正在尝试检查是否有赢家。我意识到我的winGame() 函数应该在某种while 中或执行while 循环以结束游戏。但是,当我尝试进行一些调试以解决一些问题时,我意识到一些令人不安的事情。它总是说这是平局,即使它不应该是。这些都是很小的事情,我很惭愧不理解,我真的很想得到一些关于如何解决它的帮助。另外,我知道如果赢了,应该有一段时间或做while循环来结束游戏。我只是不确定把它放在哪里,所以如果你有任何建议,请告诉我。
*请注意,在我的有效移动函数中有一个小数组,我计划将其设为静态 const 数组。我的 get 函数返回名称中的值(例如 getIval() 返回单元格对象的初始值),而我的 set 函数只是适当地分配值。
bool TicTacToe::validMove(char move){
char options[9] = { '1','2', '3', '4','5','6','7', '8','9' };
bool validate = false;
for ( int i = 0; i < 9; i++ ){
if ( move == options[i]){
validate = true;
}
}
return ( validate );
}
void TicTacToe::setMove( char move ){
for ( int i = 0; i < ROW; i++ ){
for ( int j = 0; j < COL; j++ ){
if ( board[i][j].getiVal() == move ){
board[i][j].setiVal( players[currentPlayer].getMarker() );
switchPlayer();
break;
}
}
}
}
void TicTacToe::makeAMove(){
char move;
int turns = 1;
bool validate = true;
do{
cout << "Player " << (getCurrentPlayer() + 1) << " make a move." << endl;
cin >> move;
if ( validMove( move ) ){
if ( turns > 4 ){
cout << "Nested if-else statement." << endl;
winGame();
setMove( move );
}
else
setMove(move);
}
else{
cout << "Invalid Move. Please reenter." << endl;
cin >> move;
}
DrawBoard();
turns++;
} while ( turns <= 9 );
}
bool TicTacToe::winGame(){
cout << "Calling winGame() " << endl;
bool validate = false;
int k = 0;
for ( int i = 0; i < COL; i++ ){
//check column wins
if ( board[0][i].getMarker() == board[1][i].getMarker() && board[1][i].getMarker() == board[2][i].getMarker() && board[2][i].getMarker() != (' ')){
cout << "Column win " << endl;
validate = true;
break;
}
//check row wins
else if ( board[i][0].getMarker() == board[i][1].getMarker() && board[i][1].getMarker() == board[i][2].getMarker() && board[i][2].getMarker() != (' ')){
cout << "Row win." << endl;
validate = true;
break;
}
}
if( board[0][0].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][2].getMarker() && board[2][2].getMarker() != (' ')){
cout << "Diagonal 1" << endl;
validate = true;
}
else if ( board[0][2].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][0].getMarker() && board[2][0].getMarker() != (' ') ){
cout << "Diagonal 2 " << endl;
validate = true;
}
else{
cout << "It's a draw!" << endl;
validate = true;
}
return (validate);
}
这是一个程序运行示例供您参考。
//sample run
+--+--+--+
|1 |2 |3 |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
1
+--+--+--+
|X |2 |3 |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 2 make a move.
2
+--+--+--+
|X |O |3 |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
3
+--+--+--+
|X |O |X |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 2 make a move.
5
+--+--+--+
|X |O |X |
+--+--+--+
|4 |O |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
+--+--+--+
|X |O |X |
+--+--+--+
|4 |O |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
7
Nested if-else statement.
Calling winGame()
It's a draw!
+--+--+--+
|X |O |X |
+--+--+--+
|4 |O |6 |
+--+--+--+
|X |8 |9 |
+--+--+--+
Player 2 make a move.
8
Nested if-else statement.
Calling winGame()
It's a draw!
+--+--+--+
|X |O |X |
+--+--+--+
|4 |O |6 |
+--+--+--+
|X |O |9 |
+--+--+--+
【问题讨论】:
-
你为什么不在发现获胜者后立即返回
true?相反,您正在检测获胜者,而不是立即返回,您的代码会无缘无故地进行更多检查。 -
我的导师告诉我,在一个函数中有多个返回值是糟糕的编程习惯。但鉴于多人告诉我同样的事情,我开始假设我的导师给了我错误的信息。现在我知道了,我会考虑到这一点。感谢您的回复!
标签: c++ if-statement