将数组索引从一个类传递到另一个类 C++

我想请教一下如何将数组指针从一个头文件传递到另一个头文件。

我有一个用于井字游戏的头文件,包含了井字游戏的实现,另一个头文件将包含我的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();}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注