使用C++; >我试图在C++中做一个非常基本的TigToToT,而在我没有明显语法错误的时候,我有很多调试错误:“Cobra.exe 0x0100142D中未处理的异常:0xC000 00 5:访问违例读取位置0xccccc359”< /p>
我觉得这是一个明显的错误,我只是没有处理,但它;It’我的神经肯定开始紧张起来了。我将标记访问错误的位置。。。现在它,;在我的checkwin方法中有一个,但我觉得肯定不止一个 在我的标题中,我使用一个私有字符**板和一个私有整数播放器使用C++; >我试图在C++中做一个非常基本的TigToToT,而在我没有明显语法错误的时候,我有很多调试错误:“Cobra.exe 0x0100142D中未处理的异常:0xC000 00 5:访问违例读取位置0xccccc359”< /p>,c++,C++,我觉得这是一个明显的错误,我只是没有处理,但它;It’我的神经肯定开始紧张起来了。我将标记访问错误的位置。。。现在它,;在我的checkwin方法中有一个,但我觉得肯定不止一个 在我的标题中,我使用一个私有字符**板和一个私有整数播放器 #include "TicTacToe.h" #include <iostream> using namespace std; int main() { int rowChosen, colChosen; TicT
#include "TicTacToe.h"
#include <iostream>
using namespace std;
int main()
{
int rowChosen,
colChosen;
TicTacToe newGame;
while(newGame.checkWin()==' ' && !newGame.fullBoard())
{
newGame.displayBoard();
do
{
cout << "Player " << newGame.getPlayer() << " choose a row and column.";
cin >> rowChosen >> colChosen;
newGame.setGame(rowChosen,colChosen);
}while(newGame.setGame(rowChosen,colChosen)==false);
newGame.makeMove(rowChosen, colChosen, newGame.getPlayer());
newGame.switchPlayer();
}
newGame.displayBoard();
if(newGame.checkWin()!=' ')
cout << "Player " << newGame.returnWinner() << " wins!";
else if(newGame.fullBoard()==true)
cout << "Cat's Game: This is a Draw!";
return 0;
}
TicTacToe::TicTacToe()
{
player = 1;
char blank = ' ';
for(int row=0;row<3;row++)
for(int col=0;col<3;col++)
board[row][col] = ' ';
}
void TicTacToe::setPlayer(int play)
{
player = play;
}
int TicTacToe::getPlayer()
{
return player;
}
void TicTacToe::switchPlayer()
{
if (player==1)
player++;
else
player--;
}
bool TicTacToe::setGame(int row, int col) //input validation
{
if (row >= 3 || row < 0)
return false;
if (col >= 3 || col < 0)
return false;
if (board[row][col] != ' ')
return false;
return true;
}
char TicTacToe::getBoard(int row, int col)
{
return board[row][col];
}
bool TicTacToe::fullBoard()
{
bool full = true;
for(int row=0;row<3;row++)
for(int col=0;col<3;col++)
{
if(board[row][col]==' ')
{
full=false;
break;
}
}
return full;
}
void TicTacToe::makeMove(int r, int c, int player)
{
char ch;
if (player==1)
ch = 'X';
else
ch = 'O';
board[r][c] = ch;
}
char TicTacToe::checkWin()
{
char b = ' ';
for(int i=0; i<3; i++) //horizontal
{
if((board[i][1]==board[i][0]) && (board[i][1]==board[i][2])) //THIS IS ERROR
{
b=board[i][1];
}
}
for(int j=0; j<3; j++) //vertical
{
if( (board[1][j]==board[0][j]) && (board[1][j]==board[2][j]) )
b=board[1][j];
}
if((board[0][0]==board[1][1] && board[1][1]==board[2][2]) ||
(board[2][0]==board[1][1] && board[1][1]==board[0][2]))
b= board[1][1];
return b;
}
void TicTacToe::displayBoard()
{
for(int row=0;row<3;row++)
{
cout << "|-----|";
for(int col=0;col<3;col++)
{
if(board[row][col]==' ')
cout << "| ";
else
cout << "|" << board [row][col];
}
cout << "|" << endl;
cout << "|-----|";
}
}
int TicTacToe::returnWinner()
{
int winner = 0;
if(checkWin()=='X')
winner = 1;
else if(checkWin()=='O')
winner = 2;
return winner;
}
假设您已经包含了所有代码,那么您缺少了一些基本的东西:类TictaToe的声明。当然,有一个
TicTacToe.h
,所以它可能(可能)藏在那里。那会有帮助的
总而言之,我认为Mat是对的——您在ctor中声明一个名为的本地board
,并初始化它。但一旦ctor完成,这就超出了范围,这意味着所有初始化都会消失在以太中。。假设您在类中定义了board
,那么只需删除char
声明就可以了
现在,这里有一个一般性的建议:如果您得到一个访问冲突异常,通常意味着您在所指内容的范围上犯了错误。由于异常发生在您正在使用
board
的某个点上,因此包含已识别board
的程序的名称就是要查看的地方。TicTacToe::TicTacToe(){char board[3][3]
几乎肯定是一个bug,为什么您希望在构造函数中有一个名为board
的本地代码?请正确缩进您的代码,并在缩小问题范围后显示类声明-可能80%以上的代码与您发布的代码无关。包括TicTacToe
的类声明“在我的标题中,我使用了一个私有char**
..”——这几乎肯定是您的第一个错误,因为您的构造函数中没有为该构造分配必要的内存(您无论如何都不应该使用它,因为您已经知道它是一个3x3板)。你在构造函数中初始化一个本地自动变量board
,它实际上什么都不做,因为一旦构造函数完成,它就会丢失。我看到了,第一次挥杆时,我在构造函数中制作了一个board,并出于任何原因调用了一个函数,当我更改它时,我没有删除该片段。我很抱歉现在,当我试图用空的“”字符填充构造函数时,构造函数本身出现了错误…因此,请包含实际的.h文件并让我们查看代码。感谢大家的帮助,这确实是一个很容易解决的问题,现在,很容易处理的只是小的显示/逻辑错误。你是对的,我看到了问题。我想我已经解决了在构造函数中为board分配空间,但我刚刚制作了一个新的board,在这种情况下,私有board仍然只是一个空的空间,甚至没有空的数组空间。这很容易犯错误,特别是当您不区分成员变量和局部变量时。通常的做法是在成员变量前面加上“m”_java java和C++的调整很难,当我的大学使用了这么多的Java,而不是很多C++,我认为java的动态分配是很令人沮丧的,所以我真的不知道如何使用它。
class TicTacToe
{
private:
char board[3][3]; //there we go
int player;
public:
TicTacToe();
void setPlayer(int);
int getPlayer();
void switchPlayer();
bool setGame(int,int);
char getBoard(int,int);
bool fullBoard();
void makeMove(int,int,int);
char checkWin();
void displayBoard();
int returnWinner();
};