网络五子棋游戏QT类的设计与实现 (4)
经过一段时间的C++和QT的学习,打算好好的改造一下前面的C++五子棋游戏。
你知道的,前面的程序甚至连构造函数都没有使用,还有虽然用到了面向对象的类,但思想还是落入了过程化编程的泥淖,过多的把对象当一个子函数来实现,即传一个参数进去,通过返回值得到一个结果。为此,我又拿起中性笔开始了鬼画桃符(^^自已能看懂就OK):
1. 在原有的C++五子棋程序的基础上,用面向对象的思想重新优化,并增加用户界面类。
2. 原来的坐标是人工直接输入的,现在要用鼠标来获取(mousePressEvent()?),点击的时候应有一定的范围。
3. 增加图形界面类(paintEvent()?),把显示功能从棋盘类中脱离出来,棋盘只负责棋子坐标数据的存储和更新。
4. 为使用界面更加的美观,打算给界面贴一张背景图(label->setPixmap()?QImage?QPixmap?)。
5. 棋盘的网格用QPainter类的drawline()来实现,分别在X方向和Y方向画20条直线。
6. 棋子本身采用QPainter类的drawEllipse()画圆并填充来实现?还是直接drawImage()贴图来实现?
7. 本次仅实现可以自己跟自己下棋的对话框程序。
8. 好的,现在开始给第三版五子棋游戏换上新装吧:
棋盘类 chessBoard.h :
const int BOARD_SIZE = 19;
const int WHITE_CHESS ='W';
const int BLACK_CHESS ='B';
const int NO_CHESS =' ';
class ChessBoard
{
public:
ChessBoard();// 构造函数
void clear(); // 清屏
void setChess(int x,int y,int chs);
int getChess(int x, int y); //获取棋子位置
bool judgeVictory(const int x,const int y);
private:
int board[BOARD_SIZE][BOARD_SIZE];
};
棋子类 myChess.h:
class MyChess
{
public:
MyChess(int,ChessBoard *);
// 构造函数
void setLocation(int,int);
bool setChess();
int getChess(int, int);
bool endFlag; // 结束标志
private:
int chesstype;
int currentX;
int currentY;
ChessBoard * board;
//棋盘
};
棋盘界面基座类 chessBase.h:
class ChessBase:public QDialog
{
Q_OBJECT
public:
ChessBase(int,char**);
public slots:
void slotTurn(bool);
void slotVictory(bool);
void slotClear();
void slotStart();
private:
ChessBoard *board; //棋盘
MyChess *white; // 白棋
MyChess *black; // 黑棋
ChessView *view; // 棋盘视图
QLabel*statusLabel;
QPushButton *startButton;
QPushButton *restartButton;
QPushButton *quitButton;
};
棋盘界面视图类 chessView.h:
const int BOARD_HEIGHT_DEFAULT = 320;//棋盘的高度
class ChessView:public QWidget
{
Q_OBJECT
public:
ChessView(int,char**,ChessBoard *,MyChess *,MyChess *,QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *event); // 界面重绘事件处理
void mousePressEvent(QMouseEvent *event); //鼠标按键事件处理
void judgeLocation(int x, int y);
void drawPix(); // 显示绘图
public slots:
void slotClear();
void slotStart();
signals:
void signalTurn(bool);
void signalVictory(bool);
private:
QPixmap *pix;
QImage imagWhite; // 白棋的图片
QImage imagBlack; // 黑棋的图片
int startx;
int starty;
int step;
int width;
int height;
bool key;
bool startFlag;
ChessBoard *board; //棋盘
MyChess *whitechess; //白棋
MyChess *blackchess; //黑棋
};
主程序 main.cpp:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
ChessBase *base = new ChessBase(argc,argv);
base->show(); //显示界面
return app.exec();
}
9. 下面是换了QT新装的第四版五子棋游戏的运行效果: