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

当然这种只选择最好的节点拓展的方法非常依赖于启发式函数的正确性,如果这种启发式搜索函数不好的话,只搜索前10个节点可能会丧失最优解,体现在AI上就是下棋变“蠢”了。

使用迭代加深深度优先搜索加速

迭代加深深度优先搜索就是先搜索depth=1的情况,然后搜索depth=2的情况,以此类推。这种方法看似很慢,其实会加速alpha-beta剪枝。因为浅层搜索得到的最优解很有可能是深层搜索下评估函数得分高的点,因此按照浅层节点的得分进行排序来拓展节点,基本上都是有序的,会大大加快alpha-beta剪枝的速度。

GUI界面的编写 开发平台

Qt Creator 4.14.2 (Community)

使用原因:

QT Creator 是一个将c++编辑器以及GUI界面拖拽组件实现集成在一起的一个软件。可以用于快速开发GUI界面。

关于QT的语法以及编辑器的使用实在太多了,无法列举出来,这里给个网址自己看(找了好久的中文文档):

Qt教程,Qt5编程入门教程(非常详细) (biancheng.net)

界面介绍以及具体实现:

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

①:QPushButton

点击组件①会让游戏正式开始,如果没有点击②,③设置算法和先后手会默认使用alpha-beta剪枝和先手来进行对局。

使用槽函数和信号,connet方法来连接信号和槽函数。

connect(w.ui->start_bt_2, SIGNAL(clicked()),this , SLOT(on_start_bt_2_clicked())); ②:QPushButton

点击组件②会弹出窗口,其中有两个单选框,两个都是QRadioButton,按确定后会设置先后手

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

如何展示弹窗?

先定义一个QDialog,点击按钮后,将QDialog resize后,然后定义两个QRadioButton加入到Group当中,最后通过点击button来进行先后手的选择。

void MainWindow::on_start_bt_clicked() { who_first.resize(200,150); tip_who->resize(200,50); tip_who->setText(" 请问您是执黑还是执白"); tip_who->setStyleSheet("font-size:16px"); firstGroup = new QButtonGroup(&who_first); firstGroup->addButton(white,0); firstGroup->addButton(black,1); black->setText("黑"); white->setText("白"); black->setChecked(1); white->setGeometry(QRect(50, 60, 30, 20)); black->setGeometry(QRect(120, 60, 30, 20)); who_first.show(); tip_who->show(); white->show(); black->show(); is_ok->setGeometry(QRect(50, 100, 100, 30)); is_ok->setText("确定"); is_ok->show(); connect(is_ok, SIGNAL(clicked()), this, SLOT(on_is_ok_bt_clicked())); } ③:QPushButton

点击组件③会弹出窗口,其中有两个单选框,两个都是QRadioButton,按确定后选择算法

弹窗同上。

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

④:QLabel

对话框,用于显示游戏进行的提示。

使用setText函数来对QLabel的内容

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

⑤:QTextBrowser

信息框,用于显示搜索的信息。

//为out_tip赋值 w.ui->detail_info->textCursor().insertText(out_tip);

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

⑥:paintEvent:

棋盘,实时更新数组中的棋子。为了使游戏能顺利进行。

使用paintEvent事件+mousePressEvent事件:

使用paintEvent事件将图片花在背景上,然后画横线和竖线,之后再在特定的五个点画棋盘的标注。

使用mousePressEvent事件检测鼠标是否点击屏幕,触发事件后会返回点击的坐标,根据坐标计算出点击的行列,然后传入棋盘,在指定位置置"A","B"。

使用update()方法可以重新调用paintEvent,实现棋盘的更新。

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

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