【发布时间】:2013-12-14 18:59:08
【问题描述】:
在我为学校创建的井字游戏中,我有五个类:Game(充当游戏的控制器)、Player(基类)、HumanPlayer 和 AIPlayer(均源自 Player)和 Board。
Board 包含一个二维数组和一些用于显示和处理数组的函数。所有三个玩家类别都有一个函数makeAMove(Board &board),它将在棋盘上选择一个位置并放置一个 X 或一个 O。
如您所见,makeAMove 接受 Board 对象作为参数。然后该函数将决定移动并更改 Board 对象的 board 数组。如果我理解正确,传入的实际对象将被更改,并且不需要返回任何东西。
我理解正确吗?用二维数组作为参数会更好吗?
这是我的代码的精简版。
#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;
}
【问题讨论】: