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

标签 c++ arrays class header artificial-intelligence

我只是想知道是否可以将数组指针从一个头文件传递给另一个头而获得帮助。
我有TicTacToe的头文件,其中包含游戏TicTacToe,另一个头文件将包含My AI及其方法。
我只是想知道是否可以从TicTacToe到AI的传递来回传递,以便AI可以做出聪明的举动并将其返回到TicTacToe header 中,以便对GameBoard进行验证/更新(或者在AI中进行其他验证)一旦有了想法,我就会开始将TicTacToe中的Methods分离到自己的类中。
我已经包含了Main,TicTacToe和AI的代码
如果有任何批评请让我来have
主要

#include <iostream>
using namespace std;
#include "TicTacToe.h"
#include "AI.h"
int main()
{
TicTacToe run;
run.Play();
TicTacToeAI Test;
}
井字游戏

//Functional implementation for Tic Tac Toe game (incomplete)

#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] = ' ';
    }


};
// Methods
bool TicTacToe::gameStatus() // Works with 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()//  work with cout << board[row][col]<<  endl
{

    do {
            cout << "Player " << player << " enter move: ";
            cin >> row >> col;
            cout << endl;


        } while (!isValidMove());
            row--;
            col--;
}

bool TicTacToe::addMove() // does work with board[row][col]
{
        bool gStatus = false;
        noOfMoves++;
        board[row][col] = player;


        TicTacToe::displayBored();
        gStatus = TicTacToe::gameStatus();

        if (gStatus == true) {
            cout << "Player " << player << " wins!" << 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 by Dependency Injection
因此,TicTacToe可以通过指针作为类成员访问AI。

#include<iostream>

class TicTacToeAI{    
};

class TicTacToe{
    private:
        const TicTacToeAI* m_AI;
    public:
        TicTacToe( const TicTacToeAI* ai ) : m_AI( ai ){ // Inject the pointer to TicTacToe

        }
};

int main(){
    TicTacToeAI Test;
    TicTacToe run( &Test );
    run.Play();
}

关于c++ - 将数组索引从一个类传递到另一个C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63501028/

相关文章:

c++ - 在 Cython 中包装 C++ 模板函数/方法

c++ - 重载流和算术运算问题

c++ - 字符串运算符+(重载)char数组和string.in cpp中的不同行为

php - PDOStatement::fetchAll()返回的数组中的每个字段均为String类型(PHP + MySQL)。如何保留原始字段类型?

php - 访问静态变量定义中的静态方法

c++ - 已使用 VS2015 项目和解决方案构建后的 vc++ 解决方案清理项目的 msbuild

c++ - 两个同名变量

c - 在数组中搜索特定标记/字符串 C

c++ - 使用 C++ 和命名空间编译错误

java - 是否有理由在忽略返回值的情况下调用 obj.getClass() ?