请高手指点下棋类游戏基类的定义

我想写一个棋类游戏的基类,但总觉得不妥,不知道哪里存在问题--我是说设计上的。

我也参考了一些其它棋类游戏,但他们一般不写基类,直接具体化。
代码如下:
////////////////////////////////////////////////////////////////////////////////
//文件:chess.h
//功能:棋类游戏基类
//作者:李云
//版权:任意COPY与更改
//时间:2009年
//说明:为了便于AI的快速搜索,故同时使用了棋盘类和棋子类
////////////////////////////////////////////////////////////////////////////////

#ifndef super_admi_chess_include_h
#define super_admi_chess_include_h

#include <string>
#include <vector>

#ifndef NULL
#define NULL 0
#endif

using namespace std;

class ch_board //棋盘
{
public:
ch_board(){_data=NULL;_rows=0;_cols=0;}
ch_board(ch_board& me);
~ch_board(){if(_data!=NULL)delete[] _data;}

bool clear(); //清零
bool set_board(int rows,int cols);
int get_element(int x,int y);
bool set_element(int x,int y,int data);
bool move_piece(int x1,int y1,int x2,int y2);
ch_board operator=(ch_board& board);

private:
int _rows;
int _cols;
int* _data;
};
////////////////////////////////////////////////////////////////////////////////
class ch_piece //棋子
{
public:
ch_piece();
ch_piece(ch_piece& me);
~ch_piece(){}

void set_type(int type){_type=type;}
void set_number(int number){_number=number;}
void set_ch_name(string ch_name){_ch_name=ch_name;}
void set_validity(bool validity){_validity=validity;}
void set_worth(double worth){_worth=worth;}
void set_color(int color){_color=color;}
void set_x(int x){_x_coord=x;}
void set_y(int y){_y_coord=y;}

int get_type(){return _type;}
int get_number(){return _number;}
string get_ch_name(){return _ch_name;}
bool get_validity(){return _validity;}
double get_worth(){return _worth;}
int get_color(){return _color;}
int get_x(){return _x_coord;}
int get_y(){return _y_coord;}

private:
int _type; //棋子类型
int _number; //棋子编号
string _ch_name; //中文名称
bool _validity; //是否有效
double _worth; //棋子价值
int _color; //棋子颜色
int _x_coord; //X坐标值
int _y_coord; //Y坐标值
};
////////////////////////////////////////////////////////////////////////////////
enum player_type{ch_person,ch_network,ch_computer};

class ch_player //玩家
{
public:
ch_player();
ch_player(ch_player& me);
~ch_player(){}

int get_id(){return _id;}
int get_type(){return _type;}

private:
int _id;
int _type;
};
////////////////////////////////////////////////////////////////////////////////
class bs_chess //基类
{
public:
bs_chess();
bs_chess(bs_chess& me);
virtual ~bs_chess();

virtual bool reset()=0;
virtual bool rules()=0;
virtual bool go_step()=0;

bool clear();
ch_board get_board(){return _board;}
int get_cur_player(){return _cur_player_id;}
int get_board_rows(){return _board_rows;}
int get_board_cols(){return _board_cols;}
int get_piece_number(){return _piece_number;}
int get_player_number(){return _player_number;}

protected:
virtual bool initialize()=0;

ch_board _board; //棋盘
ch_piece* _piece; //棋子
ch_player* _player; //玩家
int _cur_player_id; //当前玩家ID
vector<ch_board> _record; //记录

int _board_rows; //棋盘行数
int _board_cols; //棋盘列数
int _piece_number; //棋子个数
int _player_number; //玩家数目
};

棋类的基类不是这样写的。

打个比方说,如象棋,有车马炮,等,他们都有名字,都可以行动,都可以杀人。。就可以弄个基类:

class BaseObject
{
string _name;
int _rank; // 等级,决定谁杀谁
//
//..
//

public:
//
// constructor
//

//
// destructor
//

// 前进
// EResult,一个结果。
EResult Go( ) = 0;

// 杀
// EResult,判断是否可以正常砍杀
EResult Eat( ) = 0;

// 以下两个函数,可以为纯虚,也可以不为纯虚
//
void SetName( string i_name );

string GetName( ) const;

// ...
// ...
};

找到公共的东西,就可以弄出基类了,而且基类本来就是这样写的.

你不能把棋盘、棋子、玩家都放到一个类里,然后当基类。这是错误的理解,你的是类的组合,而不是类的继承。继承是意思是,每一个儿子都可以被看作是一个爸爸,每一个儿子都包含了爸爸里所有的东西。在你的设计里,儿子里并不总是包含爸爸所有的东西。。这很容易看出,你的爸爸里包含了三个东东,每一个东东都是不一样,而且是毫无关系的。

你的定义适合当成一个Game类,因为游戏里是包含了棋盘、棋子、玩家的。

class Game
{
list<Player> _lstPlayer;
list<QZ> _lstQZ;
//
public:
Game( );
void Start( );
///
///
};

不过不要被我的想法所左右,我说的都不怎么好,你的可能会更好。
温馨提示:答案为网友推荐,仅供参考
相似回答