OK, quindi sono incredibilmente vicino alla conclusione di questo programma. Capisco perché il mio programma non ha fatto una mossa e sono stato in grado di risolverlo, ma ora sto cercando di verificare la presenza di un vincitore. Mi rendo conto che la mia funzione winGame()
dovrebbe essere in una sorta di while while do do while loop per terminare il gioco. Ma, quando stavo cercando di fare un po 'di debug per risolvere alcune cose, mi rendo conto di qualcosa di inquietante. Dice sempre che è un pareggio, anche quando non dovrebbe essere. Queste sono cose di poco conto che mi vergogno di non capire e mi piacerebbe davvero un po 'di aiuto su come posso risolvere il problema. Inoltre, so che ci dovrebbe essere un po 'di tempo mentre fai un ciclo per terminare il gioco se c'è una vittoria. Non sono sicuro di dove metterlo, quindi se hai qualche suggerimento, per favore fammelo sapere.Errori logici, verifica di un vincitore in Tic Tac Toe
* Nota che nella mia funzione di spostamento valida c'è un piccolo array, ho intenzione di renderlo un array const statico. Le mie funzioni get restituiscono il valore nel nome (ad esempio, getIval() restituisce il valore iniziale dell'oggetto cell), mentre le mie funzioni set assegnano semplicemente i valori in modo appropriato.
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);
}
Ecco un esempio di esecuzione del programma per il vostro riferimento.
//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 |
+--+--+--+
Perché non si restituisce 'true' immediatamente una volta rilevato un vincitore? Invece, stai rilevando il vincitore e invece di tornare subito, il tuo codice esegue più controlli senza motivo. – PaulMcKenzie
Sono stato informato dal mio istruttore che avere più ritorni in una funzione era una cattiva pratica di programmazione. Ma dato che più persone mi stanno dicendo la stessa cosa, sto iniziando a pensare che il mio istruttore mi abbia fornito informazioni errate. Ora che lo so, lo prenderò in considerazione. Grazie per la risposta! –