使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细) (7)

为了防止搜索过程显示到屏幕上,需要使用一个标志位,no_update,然后每次下棋之前将棋盘情况复制到一个暂存的棋盘当中,no_update=1时一直paint这个暂时的棋盘,然后当no_update=0后paint目前的棋盘。

使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

如何实现多进程 为何需要多线程

因为GUI图形程序一般分为前端显示和后端运算两个部分,如果只使用单个进程的话会导致在后端运算的时候前端界面卡死,因此需要使用多进程来解决这个问题。

实现方法

要开启一个新的进程需要QThread类来实现,但是QThread的run函数是固定好的,因此需要自己定义一个类,这个类继承QThread类,然后重写QThread的run()函数,之后使用start()函数来开启线程,调用run()函数即可。

代码如下

类的定义:

class back_game: public QThread { Q_OBJECT public: MainWindow w; private slots: void on_play_begin_bt_clicked(); void on_start_bt_2_clicked(); void on_start_ag_clicked(); void on_is_ok_bt1_clicked(); protected: void run(); // 新线程入口 // 省略掉一些内容 }; #endif // MAINWINDOW_H

main函数中的调用:

int main(int argc, char *argv[]) { QApplication a(argc, argv); back_game game; game.w.is_press=0; game.w.show(); game.start(); // return a.exec(); return a.exec(); }

将所有的游戏流程都放在run()函数当中了。

信号与槽函数如何使用:

使用connect函数来链接信号和槽函数,

connect(sender, SIGNAL(event()), receiver, SLOT(function()));

sender:信号的发送者,如果为按钮,点击后就会发送clicked()信号

receiver: 信号的接受者,如果单纯只是想使用某一个函数而不改变组件的话,可以使用this,this指的是function所在的类。

SIGNAL(event()):发送的信号,不同组件不同

function():槽函数,注意,槽函数一定要定义在private:slot这样声明为私有槽函数的私有成员当中。不然没有用。

遇到点击事件但是没有响应怎么办:

考虑以下五种情况:

1、看看你的类声明中有没有Q_OBJECT,没有加上(并检查是否已经包含#include<QtCore/QObject>头文件)

2、你声明的函数要加声明:

private slots:

3、检查槽函数名拼写是否有误

4、确认对应的signal和slot的参数是否一致

5、如果还不行的话,清理项目,删掉原有的moc_xxx.cpp,重新执行qmake.

如果上述情况还是不行的话,可能是因为多进程,而其中的一个进程占用了cpu内的所有时间,因此需要在当前的死循环内加上一个msleep(1),该线程休息1ms,为信号的接受提供CPU时间。

while(1) { ····· msleep(1); } 总结:

通过本次实验,我受益匪浅,先列举如下:

熟悉如何使用min-max以及alpha-beta剪枝来解决一个博弈问题

了解了许多能加速alpha-beta剪枝的方法,并且自己实现了两个

学会了如何构造评估函数并且实现,如何对评估函数进行调优

学会使用了QT create开发平台,了解了如何使用拖拽组件的方法快速制作GUI

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzddzf.html