五子棋ai:极大极小搜索和α-β剪枝算法的思想和实现(qt和c++)(一)引言和界面设计

源代码

GitHub上:Github livingsu/Gobang-ai:极大极小搜索和α-β剪枝

引言

alphaGo击败围棋冠军李世石的新闻让我对棋类博弈产生了浓厚的兴趣,无奈本人不会围棋,但算是一个五子棋业余爱好者,于是乎希望通过实现一个五子棋ai来了解相关算法和知识。

五子棋在英文中又称Gobang,five-in-row,还有两个称呼:gomoku和renju(连珠)。我来简要介绍一下区别。由于五子棋已经被机器严格证明了是一种“不公平”的游戏,先手黑子是绝对占优的,并且先手有必胜的套路。由于先手必胜,必须对先手进行一定的规则限制,于是就出现了“禁手”一说,即某些位置(比如能形成双活3、活3冲4)黑子不能下,不然就算黑子输。在日本,五子棋的理论得到极大发展,有禁手规则的五子棋被称为“连珠”(renju),而一般无禁手规则的叫做gomoku。由于大部分普通人下五子棋只是图一个乐趣,并不需要深入研究其中的理论规则,所以反而是gomoku在学生之间非常流行(我高二时就经常和同学玩五子棋,了解了一些套路但不深入)。

我实现的五子棋ai是无禁手规则的(考虑到有禁手的太复杂。。),标准棋盘大小为1515,规则是黑子先下*,由于黑子占据优势,我一般是人执黑子,ai执白子。之前说过黑子绝对占优且有必胜套路,所以实现的无禁手规则的ai执后手时,如果人用必胜套路,ai肯定会输。但是我们业余玩家不用考虑这些,我的目的是想实现一个能打败大部分执先手普通人的ai。所以,如果你能战胜按照我的博客实现的ai,也不用太过惊讶。

实现的效果图如下所示。
双人(玩家)模式:
在这里插入图片描述
人机(ai)模式:
在这里插入图片描述

界面设计

qt的界面设计非常方便。widget类是开始的欢迎界面,有两个按钮来选择玩家模式或者ai模式。gameWidget类用来绘制棋盘、棋子、分数等,并需要对鼠标事件进行相应以便落子。由于我写的ai需要反复查看棋盘信息,所以我把棋盘放在了chessAi类里面作为public成员,gameWidget可以通过访问ai.chesses来访问棋子信息并进行绘制。

重要效果的实现:
1.在棋盘内时屏蔽鼠标光标,鼠标在某个可以落子的位置附近时,在那个位置上显示一个有颜色(哪一方)的小正方形表示光标,鼠标在某个不可以落子的位置附近时显示禁止光标。

gameWidget类中有成员:

    int cursorRow;//光标位置
    int cursorCol;

然后重写鼠标移动函数:

void gameWidget::mouseMoveEvent(QMouseEvent *event){
   
    if(event->x()>=5&&event->x()<=455&&event->y()>=5&&event->y()<=455){
   //5=20-15,455=20+14*30+15
        setCursor(Qt::BlankCursor);
        for(int i=0;i<15;++i)
            for
  • 18
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
α-β剪枝算法和博弈树是在人工智能中常用于博弈问题的两个重要概念。 博弈树是一种用来描述博弈过程的树状结构,每个节点表示一个游戏的状态,边表示游戏中的合法移动。从根节点开始,通过递归地生成子节点,构建整个游戏的状态空间。博弈树可以帮助我们分析游戏的决策过程,找到最优的决策策略。 α-β剪枝算法是一种常用于优化博弈树搜索算法。在博弈树搜索过程中,我们需要评估每个节点的价值,并选择最佳的移动。α-β剪枝算法通过对搜索过程进行剪枝,减少不必要的搜索,从而提高搜索效率。 在α-β剪枝算法中,我们维护两个值:α和β。α表示当前玩家可以确保的最佳值,β表示对手可以确保的最佳值。在搜索过程中,当遇到一个节点时,我们首先评估它的价值,并更新α或β的值。如果当前节点的价值超过了对手可以确保的最佳值β,那么对手就不会选择这个节点,并且我们可以剪掉这个分支。同样地,如果当前节点的价值小于当前玩家可以确保的最佳值α,那么当前玩家也不会选择这个节点,并且我们可以剪掉这个分支。通过不断更新α和β的值,并进行剪枝,α-β剪枝算法可以快速找到最优的决策策略。 综上所述,α-β剪枝算法和博弈树是在博弈问题中常用的两个概念。博弈树用于描述游戏状态和决策过程,α-β剪枝算法则用于优化博弈树搜索,提高搜索效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值