首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!

第零章:介绍

看到这个游戏了,感觉蛮好玩的,实现了一下。

界面如下:

游戏玩法:在3×*3的矩阵中,每个按钮都可以点击,如果按钮四周有一个是空白,则点击此按钮则会移动到这个空白。按钮字母顺序变成“ABCD……”这样有序就赢了,最后空格可以出现在任何地方。

第一章:构思

设计模式基本上没接触过,所以就没有按书上的方式,自己想了大概要怎么实现,可能自己像的没有它给出的方式好吧,但是毕竟是菜鸟嘛,一步一步来!

1、用什么装这些按钮

学习了QGridLayOut,“The QGridLayout class lays out widgets in a grid”,这就好办了,它会把窗体控件放到一个网格里面,也就是说类似与矩阵啦,ABC……这些肯定就是就是一个个QPushButton啦,创建了一个个按钮,再把它装进去即可。最后这个QGridLayOut设置为QDialog的LayOut就可以了。

这个是从显示层面考虑的。

2、如何用代码表示一个3×3的矩阵

虽然可以把一个窗体放到一个QGridLayOut来进行布局,它有如下添加函数:

但是由于我对QGridLayOut不熟,不知道是否可以用类似与矩阵的存取方式,即给定行列,获取里面的东西。所以我用了一个矩阵,也就是一个二维数组啦,对应每一个按钮,数组里面放的是指向按钮的指针,空白就放一个NULL指针,因为几个按钮创建好了就在内存那里了,不动了,所以以后我交换一个按钮与一个空白的时候就这要交换这两个指针就加上重新QGridLayOut的方法addWidget就可以了。

3、需要哪些类

需要两个类,一个MyButton,公有继承QPushButton,还有Dialog类,公有继承QDialog,即显示主界面啦。

4、如何实现点击按钮就移动呢

点击按钮时按钮发射clicked()信号,但是Dialog类不知道是哪一个按钮,所以要重新发射一个信号,把指向自己的指针this当做参数,按后Dialog类就可以知道是谁了,在判断时候需要移动。

第三章:MyButton类的实现

直接上代码:

我给每一个按钮一个坐标的数据了,因为按钮创建好了就在内存的某个位置不动了,如何表示他们对应显示的哪一个呢?这个坐标就相当于标示一个按钮,ABCD……只是他们显示的文字,这个是不变的。

构造函数的参数char是它要显示的东西,Coord是自定义结构体表示坐标。

注意这个,这样就可以让Dialog类自己写一个槽,这个槽由上面的this参数就可以知道是哪个按钮被点了,在这里居然想了好久……

第四章:Dialog类的实现

1、类的声明:

一一说明数据成员的含义,源代码没有注释是因为输入不了中文,我才不要鸡鸡比注释短呢……

static const int N=3;  表明是几乘几的矩阵

QGridLayout* m_lay;  布局

MyButton* m_pbArr[N][N];  对应布局的矩阵,数组里面放的都是指向按钮的指针,移动一个按钮只要交换对应的指针并把按钮的私有坐标改一下并在布局里面弄一下即可

QString m_btnTextOrder;  用到就知道了

2、构造函数:

先把窗口大小固定了。

new一个QGridLayout。

然后的双层循环用来创建一个个按钮对象,创建一个对象就把它添加到QGridLayOut,这样就有了秩序了,然后就连接每个按钮被点击的槽了。

最后把最后一个位置的没有按钮的赋值为空指针。

最最后使这些按钮无序,这个稍后介绍。

3、按钮被点击啦

被点击后可以通过按钮发射的信号获得按钮的指针,再通过按钮的获得按钮的坐标。然后看这个坐标上下左右是否有一个是空格,没有就什么都不做,有的话就把这个按钮移动到那个位置,实质上是交换。

交换分为两周情况,两个按钮的交换,这个再使界面无序化时调用,另一个就是交换按钮与空白,只要看前一个就足够了。

先把待交换的两个按钮从QGridLayOut拿下来,具体表现就是不显示了。

再交叉添加到QGridLayOut的特定坐标。

再把两个按钮的私有数据也就是坐标交换一下,因为坐标通过这个坐标从得到被点按钮的位置的。

再把数据层(QGridLayOut是显示层)的指针也互换一下,让他们指向对的按钮内存。

4、使无序化

游戏开始是无序的,这个函数就是干这事的,有了上面的交换,那么只要随即生成坐标,把指定坐标的按钮交换即可。关键这里的产生随即坐标的函数,我写的不太好,调试时可以看出好多对坐标一样,因为计算机太快了。

5、检测是否结束

每一次点击按钮都执行一下,看时候结束了。我写的就是按照矩阵顺序一个一个按钮读,读它的文本,追加到一个字符串,最后和“ABCD……”字符串比较,相等就结束了。

第五章:遗言

1、QGridLayOut

显示与数据表示分离了,这个不太好。

2、啦啦啦啦啦啦

我会告诉你我只有一次成功了吗?

我想随机交换之后会不会本身就有成功不了的可能?数学理论啊!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221019A08ZBB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券