我想请教一下如何将数组指针从一个头文件传递到另一个头文件。
我有一个用于井字游戏的头文件,包含了井字游戏的实现,另一个头文件将包含我的AI及其方法。
我想知道是否可以在这两个头文件之间传递游戏的走法,这样AI可以做出智能的走法,并将结果返回到井字游戏的头文件中进行验证/更新游戏棋盘(或者我在AI中再做一次验证)。一旦我有了这个想法,我就会开始将井字游戏的方法分离到它们自己的类中。
我已经包含了我的主程序、井字游戏和AI的代码。如果有任何批评,请告诉我 😊
主程序
#include <iostream>using namespace std;#include "TicTacToe.h"#include "AI.h"int main(){TicTacToe run;run.Play();TicTacToeAI Test;}
TicTacToe.h
//井字游戏的功能实现(未完成)#include <iostream>#include <iomanip>#include <string>using namespace std;class Game{};class TicTacToe{private: bool WIN =false; bool DRAW = false; char board[3][3]; int noOfMoves = 0; char player = 'X'; char player2 =' '; int row = 0; int col =0;public: void PlayerFlick(); void getXOMove(); void Play(); bool addMove(); bool gameStatus(); bool isValidMove(); void displayBored(){for (int row = 0; row < 3; row++) { cout << row + 1; for (int col = 0; col < 3; col++) { cout << setw(3) << board[row][col]; if (col != 2) cout << " |"; } cout << endl; if (row != 2) cout << " ____|____|____" << endl << " | | " << endl;}cout << endl;} void ResetBoard() { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) board[i][j] = ' '; }};// 方法bool TicTacToe::gameStatus() // 与 cout << board[row][col]<< endl 一起工作{ bool CONTINUE = false; for(int i = 0; i <= 2; i++) { if ((board[i][0] =='X' && board[i][1] == 'X' && board[i][2] == 'X') || (board[i][0] == 'O' && board[i][1]== 'O' && board[i][2] == 'O')) { cout << " CROSS" << endl; // 3,3 // 1,3 WIN = true; return WIN; } } for(int i= 0; i <=2; i++) { if((board[0][i] == 'X' && board[1][i] == 'X' && board[2][i] == 'X') || (board[0][i] == 'O' && board[1][i]== 'O' && board[2][i] == 'O')) { cout << " DOWN" << endl; // 3,1 WIN = true; return WIN; } } if((board[0][0]== 'X' && board[1][1] == 'X' && board[2][2] == 'X') ||(board[0][0]== 'O' && board[1][1] == 'O'&& board[2][2] == 'O') ) { cout << " RIGHT SIDE" << endl; WIN = true; return WIN; } if((board[0][2] == 'X'&& board[1][1] == 'X' && board[2][0] == 'X') || (board[0][2] == 'O' && board[1][1] == 'O'&& board[2][0] == 'O' )) { cout << " LEFT SIDE" << endl; WIN = true; return WIN; } if(noOfMoves == 9) { cout<< " DRAW"<< endl; DRAW= true; return WIN; } TicTacToe::PlayerFlick(); CONTINUE = false; return CONTINUE;}void TicTacToe::getXOMove()// 与 cout << board[row][col]<< endl 一起工作{ do { cout << "玩家 " << player << " 输入走法: "; cin >> row >> col; cout << endl; } while (!isValidMove()); row--; col--;}bool TicTacToe::addMove() // 与 board[row][col] 一起工作{ bool gStatus = false; noOfMoves++; board[row][col] = player; TicTacToe::displayBored(); gStatus = TicTacToe::gameStatus(); if (gStatus == true) { cout << "玩家 " << player << " 获胜!" << endl; return true; } else if (noOfMoves >= 9) { return true; } else return false;}bool TicTacToe::isValidMove(){ if ((row <=3 && col <=3) && (board[row-1][col-1] != 'X' && board[row-1][col-1] != 'O' ) ) { return true; } else { return false; }}void TicTacToe::Play(){ TicTacToe::ResetBoard(); TicTacToe::displayBored(); bool done = false; while (!done) { TicTacToe::getXOMove(); done = TicTacToe::addMove(); }}void TicTacToe::PlayerFlick(){ if (player == 'X') player = 'O'; else player = 'X';}
AI头文件
#include <iostream> #include <iomanip> #include <string> using namespace std; class TicTacToeAI { private: TicTacToe board; int col =0; int row =0; int arr [3][3] = {0}; public: void CreateArr(int *Arr, int arrLength); void play(); void getXmove(); void getOMove(); void getXmove(char player, row&, col&); void GetoMove(char playr , row&, col&); }; void TicTacToeAI::CreateArr(int *Arr,int arrLength) { }
回答:
最常见的方法可能是控制反转(Inversion of Control)。
下面的代码展示了通过依赖注入实现的控制反转(Inversion of Control by Dependency Injection)。
因此,井字游戏可以通过类成员指针访问AI。
#include<iostream>class TicTacToeAI{ };class TicTacToe{ private: const TicTacToeAI* m_AI; public: TicTacToe( const TicTacToeAI* ai ) : m_AI( ai ){ // 注入指针到井字游戏 }};int main(){ TicTacToeAI Test; TicTacToe run( &Test ); run.Play();}