[英]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.