Я выполняю домашнюю работу, о которой я задаю. Если вы не чувствуете себя комфортно в решении домашней проблемы, я должен сказать, что мой инструктор побудил нас попросить о помощи на этом сайте, когда мы полностью в тупике. Кроме того, я выполнил основную часть задания самостоятельно, и теперь я делаю дополнительную проблему с проблемами. В любом случае, к проблеме!
Будучи новичком в ООП и C++ в целом, мне трудно понять оператор "this- > ". Мы не рассматривали его в классе, но я видел его в другом месте, и я вроде как предполагаю, как он предназначен для использования.
Для назначения мне нужно создать консольную игру Tic-Tac-Toe. Только вызовная часть задания хочет, чтобы мы создали противника ИИ, и мы не получаем дополнительного кредита за выполнение задачи, я просто хочу знать, как это сделать. Я изучаю такие вещи, как минимаксные и игровые деревья, но пока я просто хотел создать функцию "выбрать случайную, открытую точку".
У меня есть класс под названием TicTacToe, который является в основном всей программой. Я отправлю его ниже с частями, которые имеют отношение к вопросу, но часть, которая дает мне ошибку, - это подпрограмма:
void TicTacToe::makeAutoMove(){
srand(time(NULL));
int row = rand() % 3 + 1;
int col = rand() % 3 + 1;
if(this->isValidMove(row, col)){
this->makeMove(row, col);
}else{
this->makeAutoMove();
}
}
Единственное, что предназначена для этой функции - сделать ход на доске, предполагая, что она открыта. Плата настроена так:
char board[4][4];
и когда я его распечатаю, он выглядит так:
1 2 3
1 - - -
2 - - -
3 - - -
Проблема в том, что иногда происходит компьютер, который дает мне ошибку, которую трудно отследить из-за случайного характера функции. Я считаю, что это ошибка segfault, но я не могу сказать, потому что не могу реплицировать ее в своем отладчике.
Я думаю, что оператор "this- > " функционирует как указатель, и если указатель имеет NULL и к нему обращаются, он может дать мне эту проблему. Это верно? Есть ли способ исправить это?
Я понимаю, что это может быть вопрос очень низкого уровня для многих членов сообщества, но я был бы признателен за вашу помощь, если бы он не приносил сдержанных замечаний о том, насколько это тривиально, или как глупо Я должен быть. Я LEARNING, а это значит, что иногда у меня будут какие-то глупые вопросы.
Вот мой файл .cpp, если он помогает:
TicTacToe::TicTacToe()
{
for(int row = 0; row < kNumRows; row++){
for(int col = 0; col < kNumCols; col++){
if(col == 0 && row == 0){
board[row][col] = ' ';
}else if(col == 0){
board[row][col] = static_cast<char>('0' + row);
}else if(row == 0){
board[row][col] = static_cast<char>('0' + col);
}else{
board[row][col] = '-';
}
}
}
currentPlayer = 'X';
}
char TicTacToe::getCurrentPlayer(){
return currentPlayer;
}
char TicTacToe::getWinner(){
//Check for diagonals (Only the middle square can do this)
char middle = board[2][2];
if(board[1][1] == middle && board[3][3] == middle && middle != '-'){
return middle;
}else if(middle == board[3][1] && middle == board[1][3] && middle != '-'){
return middle;
}
//Check for horizontal wins
for(int row = 1; row < kNumRows; row++){
if(board[row][1] == board[row][2] && board[row][2] == board[row][3] && board[row][1] != '-'){
return board[row][1];
}
}
//Check for vertical wins
for(int col = 1; col < kNumCols; col++){
if(board[1][col] == board[2][col] && board[2][col] == board[3][col] && board[1][col] != '-'){
return board[1][col];
}
}
//Otherwise, in the case of a tie game, return a dash.
return '-';
}
void TicTacToe::makeMove(int row, int col){
board[row][col] = currentPlayer;
if(currentPlayer == 'X'){
currentPlayer = 'O';
}else if(currentPlayer == 'O'){
currentPlayer = 'X';
}
}
//TODO: Make sure this works after you make the make-move function
bool TicTacToe::isDone(){
bool fullBoard = true;
//First check to see if the board is full
for(int col = 1; col < kNumCols; col++){
for(int row = 1; row < kNumRows; row++){
if(board[row][col] == '-'){
fullBoard = false;
}
}
}
//If the board is full, the game is done. Otherwise check for consecutives.
if(fullBoard){
return true;
}else{
//Check for diagonals (Only the middle square can do this)
char middle = board[2][2];
if(board[1][1] == middle && board[3][3] == middle && middle != '-'){
return true;
}else if(middle == board[3][1] && middle == board[1][3] && middle != '-'){
return true;
}
//Check for horizontal wins
for(int row = 1; row < kNumRows; row++){
if(board[row][1] == board[row][2] && board[row][2] == board[row][3] && board[row][1] != '-'){
return true;
}
}
//Check for vertical wins
for(int col = 1; col < kNumCols; col++){
if(board[1][col] == board[2][col] && board[2][col] == board[3][col] && board[1][col] != '-'){
return true;
}
}
}
//If all other tests fail, then the game is not done
return false;
}
bool TicTacToe::isValidMove(int row, int col){
if(board[row][col] == '-' && row <= 3 && col <= 3){
return true;
}else{
//cout << "That is an invalid move" << endl;
return false;
}
}
void TicTacToe::print(){
for(int row = 0; row < kNumRows; row++){
for(int col = 0; col < kNumCols; col++){
cout << setw(3) << board[row][col];
}
cout << endl;
}
}