现在的位置: 首页 > 综合 > 正文

《华清远见学习手记》之 网络五子棋游戏QT类的设计与实现 (4)

2013年03月02日 ⁄ 综合 ⁄ 共 2494字 ⁄ 字号 评论关闭

 网络五子棋游戏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新装的第四版五子棋游戏的运行效果:

抱歉!评论已关闭.