Tic Tac Toe麻烦(一些逻辑错误)
Tic Tac Toe Trouble ( some logical mistakes )
我正在使用类编写这个井字游戏程序。我编写了一个名为makeAMove()
的函数。这个功能本应验证玩家的移动,但它一直显示这是一个无效的移动,并要求玩家重新进入。可能有一些逻辑错误,但我没有看到。有人能帮忙吗?它是一个使用名为Cell board[ROW][COL]
的对象和另一个名为Player players[2]
的对象的类。标记为X
或O
,而iVal
是板的初始值(板上的每个单元格都有一个从1到9的数字)。这里包括winGame()
和switchPlayer()
供您参考。虽然我认为我的winGame()
函数是可以的,但我知道我可以使用求和来实现这一点。换句话说,每个单元格都有一个内部标记,如-1或1,如果行、列等的总和为-3或3,则与玩家对应的内部标记将输出一个赢家。如果你对如何做到这一点有任何见解,请随时分享,否则,我的winGam
e就可以了。
int TicTacToe::switchPlayer(){
if ( currentPlayer == 0)
currentPlayer = 1;
else if ( currentPlayer == 1 )
currentPlayer = 0;
return (currentPlayer);
}
//
//method to make a move
//
void TicTacToe::makeAMove(){
char move;
int turns = 1;
do{
cout << "Player " << (getCurrentPlayer() + 1) << " make a move." << endl;
cin >> move;
for ( int i = 0; i < ROW; i++ ){
for ( int j = 0; j < COL; j++ ){
//This is where my problem begins
if ( board[i][j].getiVal() == move ){
board[i][j].setiVal( players[currentPlayer].getMarker());
DrawBoard();
switchPlayer();
turns++;
}
else if ( board[i][j].getiVal() == 'X' || board[i][j].getiVal() == 'O'){
cout << "Invalid move, please reenter. " << endl;
cin >> move;
}//the else if statement always outputs:x
}
}
} while ( turns <= 9 || !winGame() );
cout << "Congratulations " << ( getCurrentPlayer() + 1 ) << "you won the game!" << endl;
}
bool TicTacToe::winGame(){
bool validate = false;
int k = 0;
for ( int i = 0; i < ROW; i++ ){
//check column wins
if ( board[0][i].getMarker() == board[1][i].getMarker() && board[1][i].getMarker() == board[2][i].getMarker()){
players[currentPlayer].setNumWin(k++);
validate = true;
break;
}
//check row wins
else if ( board[i][0].getMarker() == board[i][1].getMarker() && board[i][1].getMarker() == board[i][2].getMarker()){
players[currentPlayer].setNumWin(k++);
validate = true;
break;
}
}
if( board[0][0].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][2].getMarker()){
players[currentPlayer].setNumWin(k++);
validate = true;
}
else if ( board[0][2].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][0].getMarker()){
players[currentPlayer].setNumWin(k++);
validate = true;
}
return (validate);
}
这是程序的运行示例
+--+--+--+
|1 |2 |3 |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
1
+--+--+--+
|O |2 |3 |
+--+--+--+
|4 |5 |6 |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 2 make a move.
5
Invalid move, please reenter.
6
+--+--+--+
|O |2 |3 |
+--+--+--+
|4 |5 |X |
+--+--+--+
|7 |8 |9 |
+--+--+--+
Player 1 make a move.
此处的逻辑错误可以减少为以下内容:
for ( int i = 0; i < ROW; i++ ){
for ( int j = 0; j < COL; j++ ){
if ( board[i][j].getiVal() == move ){
// Not important what happens here
}
else if ( board[i][j].getiVal() == 'X' || board[i][j].getiVal() == 'O'){
cout << "Invalid move, please reenter. " << endl;
// Not important what happens here
}
逻辑错误可以在这里使用"Rubber Duck"方法进行调试来识别。
调试的"橡皮鸭"方法包括拿一只漂浮在浴缸里的橡皮鸭,把它放在监视器屏幕旁边,然后试图向橡皮鸭解释你的代码在做什么,你一直解释,直到你自己解决问题。
在这里,您将首先向您的橡皮鸭解释,您的代码将扫描井字图矩阵,一次一行,一次扫描一列,从左上角开始,到右下角结束。这就是嵌套的for循环在这里所做的。
橡皮鸭会同意的,您将继续解释此代码。
现在,您将告诉您的橡皮鸭,您的代码将继续扫描井字游戏板,直到它在当前扫描位置看到move
、X
或O
。如果它看到X
或O
,您的代码将抱怨该移动无效。
因此,如果第一个单元格,即左上角的单元格,包含"X"或"O",则该代码将在内部循环的第一次迭代中看到它,并报告错误消息,无论井字图矩阵的其余部分中还包含什么。
此时,您已经使用Rubber Duck方法成功地识别了此处的逻辑错误。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- C TIC TAC TOE游戏.开关空间而不是错误消息
- Tic-Tac-Toe阵列错误
- Tic Tac Toe麻烦(一些逻辑错误)
- Tic-Tac-Toe C++链接错误ld返回1退出状态