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

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

  1. 《华清远见学习手记》 之3G智能机器人——移植视频监控客户端到我的Nokia E52上

    移植视频监控客户端到我的Nokia E52上 [编译环境]ubuntu 8.10 + Vmware + windows xp [目标机]Nokia E52 / symbian s60 v3 [交叉编译 ...

  2. 华清远见学习笔记—Level1—Day5—数组和字符串

    本专栏为个人在华清远见嵌入式linux学习期间的笔记,希望能与各位读者共同进步! 文章目录 前言 一.数组 1.数组定义 2.一维数组的定义 3.一维数组的引用 4.一维数组的初始化 5.程序举例 二 ...

  3. 在华清远见学习嵌入式开发的总结

    一.前言 在华清(成都中心)四个多月的学习即将结束,在学习中有学到新知识的兴奋,也有为代码中的bug而难受一整天的痛苦,这些都是学习过程中的常态,只要我们善于总结,就会有所进步.不要忘了我们最初的目标 ...

  4. 【华清远见嵌入式培训】网络编程(更新中)

    Pre-learning:网络编程 不借助第三方软件实现不同主机.不同操作系统之间的通信.搭建服务器与客户端. Chapter 1 网络发展史与背景 1.1 网络发展简史 ARPnet(阿帕网)因为没 ...

  5. 【华清远见学习之星】

    由于在学习期间还要赶毕业设计,所以将学习期间遗漏的部分知识记录下来,以方便以后有时间再复习: 结构体:完成度70%: 未能对结构体写法彻底掌握,结构体程序编写太少导致不熟练. 指针及其相关组合:完成度 ...

  6. 我在华清远见学习的成果

    第一天来华清的时候觉得氛围特别好,老师从0基础开始讲解,让每个人都能听懂,非常nice,第一周的时候学习了C基础,对于我这种0基础的人,也能学会简单编写程序了,从虚拟机安装开始,老师就带着我们一步一步 ...

  7. 华清远见学习—“进制之间的转换”

    进制转换 可以直接进行算术运算的数据 二进制(逢2进1):0~1 十进制(逢10进1):0~9 八进制(逢8进1):0~7 十六进制(逢16进1):0-9.a(A)-f(F) 其他进制转十进制 方法: ...

  8. 华清远见嵌入式开发学习的6大阶段

    分享一下华清远见嵌入式开发学习的6大阶段.19年嵌入式培训经验,值得一看. 第一阶段:嵌入式系统开发基础理论 阶段目标 掌握Linux操作系统的使用,精通使用C语言编程,熟练掌握嵌入式Linux的开发 ...

  9. 在华清远见的学习感悟

    我已经毕业一年的往届生了,也工作了一年了,由于对当时的工作不是很满意,同时由于我大学时学习的时电子信息方面专业就对嵌入式行业也有很搞得兴趣,所以我就在网络上查看了不少关于嵌入式学习的相关事情,同时也看 ...

最新文章

  1. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结
  2. iOS 之 UICollectionView
  3. winsock2之最简单的win socket编程
  4. maven编译java1.8项目_maven正在用java 1.7编译代码,但我想用1.8编译它
  5. 使用OpenMP实现多线程,不仅是用在循环处理上
  6. 深度剖析Zabbix Web scenarios数据表结构
  7. java私塾 设计模式 视频_[章节]Java Web开发理论部分视频教程 之 04 mvc设计模式详解视频教程 - 我的学习中心 - 私塾在线 - 只做精品视频课程服务...
  8. 2.Redis数据操作
  9. 手机怎么看mkv格式视频 如何将mkv无损转换成mp4格式
  10. DELL PERC-10和 PERC-9阵列卡支持的操作系统版本
  11. 灰度化处理——灰度化
  12. 如何塑造亲切有趣的微博形象?
  13. 用VSCode写简历表
  14. 使用python调整excel表格的行和列以及合并或拆分单元格
  15. Java XLS 转 XLSX
  16. PADS过孔与安全间距的设置与使用
  17. 什么是基本表?什么是视图?两者的联系和区别是什么?视图有哪些优点?
  18. 【Python学习】数据归一化Scaling与标准化Normalization间的区别与相关实现
  19. 22考研中科大计算机专业经验分享
  20. 人在美国,刚下飞机,“IP属地”催生下的灰色产业

热门文章

  1. Ubuntu下设置DNS的方法
  2. zabbix+grafana安装
  3. 提高认知:从类目-属性说起,全方位解构商品题】
  4. centos8 stream 屏幕共享 远程桌面 vnc 出错
  5. 百度AI车辆图像识别JavaSDK使用原来这么简单?
  6. mac新手指南:如何查看你的mac磁盘容量?
  7. 指派问题与匈牙利解法
  8. 关于Win7系统“U盘拒绝访问”解决问题
  9. 华为交换机如何看接口与vlan的相关信息
  10. ssh 彻底卸载 install