繁体   English   中英

C ++对象还是二维数组作为参数?

[英]C++ Object or 2-dimensional Array as a Parameter?

在我为学校创建的Tic Tac Toe游戏中,我有五个班级:游戏(充当游戏的控制器),玩家(基础班级),HumanPlayer和AIPlayer(均来自玩家)和棋盘。

Board包含2D阵列和一些用于显示和处理该阵列的功能。 所有这三个播放器类都有一个功能makeAMove(Board &board) ,它将在板上选择一个位置并放置X或O。

如您所见, makeAMove接受Board对象作为参数。 然后,该函数将决定移动并更改Board对象的board数组。 如果我正确理解的话,传入的实际对象将被更改,并且不需要返回任何东西。

我理解正确吗? 改用2d数组作为参数会更好吗?

这是我的代码的精简版。

#include <iostream>
#include <memory> // auto_ptr

class Board
{
    public:
        Board()
        {
            for (int row = 0; row < 3; row++)
            {
                for (int column = 0; column < 3; column++)
                    board[row][column] = ' ';
            }
        }

        void displayBoard()
        {
            std::cout << "\n-------------" << std::endl;

            for (int row = 0; row < 3; row++)
            {
                std::cout << "| " ;
                for (int column = 0; column < 3; column++)
                    std::cout << board[row][column] << " | ";
                std::cout << "\n-------------" << std::endl;
            }
        }

/*      My thought was to use getBoard to return the array rather than using the 
        object as a parameter       
        char getBoard()
        {
            return board[][3];
        }       
*/

    char getCell(int row, int column)
    {
        return board[row][column];
    }

    void setCell(int row, int column, char player)
    {
        board[row][column] = player;
    }

    private:
        char board[3][3];

};

class Player
{
    public:
        virtual void makeAMove(Board &board) = 0;   
};

class AIPlayer : public Player
{
    virtual void makeAMove(Board &board)
    {
        // do some work ont the board array
    }   
};

class HumanPlayer : public Player
{
    virtual void makeAMove(Board &board)
    {
        // do some work on the board array
    }
};

class Game 
{
    public: 
        Game(unsigned int players)
        {
            if (players == 1)
            {
                player1.reset (new HumanPlayer()); 
                player2.reset (new AIPlayer());
            }
            else 
            {
                player1.reset (new HumanPlayer());
                player2.reset (new HumanPlayer());
            }
        }

        void playGame()
        {
            player1->makeAMove(myBoard);
        }

    private:
        std::auto_ptr<Player> player1; // pointer to a Player object (C++11 has more secure unique_ptr)
        std::auto_ptr<Player> player2; // pointer to a Player object
        Board myBoard;
};

int main() 
{
    Game myGame(1);
    myGame.playGame();

    return 0;
}

是的,因为您要通过引用传递Board对象,所以对该函数的任何更改都会更改实际的Board对象。 我认为传递一个Board对象是一个更好的主意,因为最好不要向用户公开游戏的实际实现(在这种情况下为2D数组)。 因此,将其作为Board对象传递可以提供更多的抽象,这很好。

makeAMove属于board 玩家对象应该决定要进行的移动,然后调用board::makeAMove进行移动。 这样,玩家对象就不在乎板的内部表示形式。

通过引用按原样传递对象而不是数组。 玩家在棋盘上所做的任何更改将继续存在。

board是的私有成员Board 它只能通过值返回,而不能通过引用返回。 如果您通过“值”将2d数组传递给播放器,则他们对面板所做的任何更改都不会保留。

您的Player类将需要访问Board.setCell(int, int) makeAMove(Board &board)函数中的Board.setCell(int, int) ,并且需要使用board对象。

但是,您的Players班级将需要阅读董事会。 为了出招。 getCell(int,int)函数可能就足够了,但是嵌套循环遍历所有单元格可能也很getCell(int,int) getBoard对于可能的decideMove函数可能很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM