通过前面几篇文章的学习,我们的四子棋程序已经有了框架、搜索几大部分,但是还有着不少问题,我们的程序只能迭代很有限的步骤,导致棋力低下,在这一篇我们将通过启发式搜索极大的优化搜索效率。

一、原因

我们之前的产生走子位置的函数很简单,即找到棋盘上的空余位置。它的不合理性体现在两方面:

没有对结果进行排序,完全是按照数组的遍历顺序的。而Alpha Beta 剪枝的效率是非常依赖节点顺序的,这个我们马上就会讲一下。

没有排除不需要节点。如果能减少一些不必要的节点,那么其实就是优化了 M^N 中的M,优化效果是非常明显的。

还是前一章的那张图,上面可以看到在第二层中,第一个节点的值是3,因为他其实是本层中的极小值,导致后面的两个节点都可以进行剪枝(这里第二个节点的第二个孩子也可以剪掉的)。这是最好的一种情况,即在MIN层中极小值是第一个节点,那么后序的所有节点都可以根据这个极小值进行剪枝,即使极小值不在第一个节点,只要大致能按照从小到大的顺序排列,也会剪掉很多节点。如果很不幸,这一层的节点是从大到小排列的,那么剪枝就完全没有用。

对于Beta 剪枝也是同样的道理。所以说Alpha Beta剪枝的效率是取决于每一层节点的顺序的。 我们肯定是无法精确排序的,因为每一个节点的值并不能直接计算出来,需要递归计算子节点。 但是我们依然能对节点进行大致的一个排序。前面说过了,只要有一个大致的排序 其实就能很好的提升剪枝效率。

那么如何排序呢?就是给所有待搜索的位置进行打分,按照分数的高低来排序。注意这个打分算法是对某一个空位进行打分,在第一张中我们已经有所提到。

有了打分之后,我们就可以按照分数高低进行排序了。

在实现算法前,我们先回顾一下之前的内容。

structPicesPos{intx;inty;intz;

chessPicesStatus type;intvalue;

};

每个落子位置都有相应的value,我们要做的就是在list中将棋子按照一定顺序排列。

二、实现启发式搜索

我们采用stl自带的排序算法,对每个棋子进行排序:

bool comp(const PicesPos &A, const PicesPos &B)

{return A.value >B.value;

}

首先,我们按照comp方法的要求自定义一个排序函数。然后在相应的位置插入排序语句。

...else{int maxVal = -1000000;

PicesPosList list=getAvailablePos(board,chessPicesStatus::white);

sort(list.begin(),list.end(),comp);for(auto iter = list.begin();iter != list.end();iter++)

{

board[iter->x][iter->y][iter->z] =chessPicesStatus::white;

...

至此,整个搜索算法就完成啦。

三、主程序

我们的程序已经完成了80%,最后就剩下把他们连接起来了。

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

ChessBoard cb;

cb.init();

cb.printBoard();intx,y;while(std::cin>>x>>y)

{if(!cb.insertPices(x,y,chessPicesStatus::black))

{

std::cout<

}

cb.dfs(cb.chessBoard,2);

cout<

<

cb.insertPices(cb.targetPos.x, cb.targetPos.y, chessPicesStatus::white);int whiteScore =cb.getSideScore(cb.chessBoard,chessPicesStatus::white);int blackScore =cb.getSideScore(cb.chessBoard,chessPicesStatus::black);

cout<

cout<

"z:"<

cout<

"z:"<

{

cb.printBoard();

cout<

}else if(status ==chessPicesStatus::black)

{

cb.printBoard();

cout<

}else{

cb.printBoard();

}

}returna.exec();

}

我们的四子棋程序就这样完成了,事实证明根本下不过啊…

参考文献:

致谢!

c语言棋类ai怎么写搜索,新手立体四子棋AI教程(4)——启发式搜索与主程序相关推荐

  1. POJ 1568 四子棋 搜索剪枝

    题意:给定一个四子棋的棋盘,问是否存在先手必胜的策略 思路:极大极小算法.暴力搜索会T,这里加上剪枝,当发现 a>=b 时可以直接返回,这里a>=b证明找到一种合理策略,最后再用全局变量保 ...

  2. 北京工业大学 大一C语言课程设计--四子棋(Bingo)(连子游戏)in TurboC 3.0

          连子游戏设计报告书                               2009年12月 目录页 目录 1 需求分析... 3 1.1功能与数据需求... 3 1.1.1题目要求的 ...

  3. java四连环游戏编程_如何用C语言实现四连环游戏(重力四子棋)?

    正好我们老师也要做了这个作业!就来蹭个热闹~ 大概就是实现了要求的功能,然后能够自定义棋盘大小(目前是6行7列,通过修改Connect4::play()里面的对于rowNum和colNum的赋值来实现 ...

  4. 百度作业帮c语言查题目,c语言题目看程序写结果a=5,b=4,c=3,d:d=(abc)

    请大家看一下下面的C语言程序哪里出错了,题目是求一元二次方程的解. 您的程序一共有两个地方有问题,第一是读取输入的时候,a,b,c定义成double,所以读入的时候不能用%d,而应该:scanf(&q ...

  5. c语言程序结构设计的心得,写给新手 选择结构程序设计总结

    写给新手 选择结构程序设计总结 选择结构程序设计总结  2010-11-2 一:C语言有两种选择结构: (1):if语句,用来实现两个分支的选择结构: (2):switch语句,用来实现多分支的选择结 ...

  6. c语言写扫雷新手详解

    c语言写扫雷新手详解 一.用到的知识点 1.分支语句 2.循环语句 3.二维数组 4.最好分块,使代码的功能更加独立,思维逻辑更加清楚,此程序我写了:test.c用来存放我的主函数,game.h用来定 ...

  7. c语言实验报告常见问题,C语言新手问题~~我是大一学生上C语言课期末让写实验报告我呕心沥 爱问知识人...

    我是大一学生 上C语言课 期末让写实验报告 我呕心沥血写了半天的东西计算机死活不认 老师不给力 找老师也没帮我明确找出问题...我只能求助网络了...#include "Stdio.h&qu ...

  8. 写给新手的WebAPI实践

    此篇是写给新手的Demo,用于参考和借鉴,用于发散思路.老鸟可以忽略了. 自己经常有这种情况,遇到一个新东西或难题,在了解和解决之前总是说"等搞定了一定要写篇文章记录下来",但是当 ...

  9. 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享

    Go语言精进之路,从新手到高手的编程思想.方法和技巧 读书分享 1 本书定位 2 本书内容总览 3 选择本书的原因 4 小收获分享 第7-12条 真的不知道咋命名 第13-19条 能用--怎么用更好 ...

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

    源代码 GitHub上:Github livingsu/Gobang-ai:极大极小搜索和α-β剪枝 引言 alphaGo击败围棋冠军李世石的新闻让我对棋类博弈产生了浓厚的兴趣,无奈本人不会围棋,但算 ...

最新文章

  1. [USACO16JAN]子共七Subsequences Summing to Sevens
  2. Nginx vs Apache--reference
  3. 20170626_oracle_数据库设计
  4. linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)
  5. duilib中的添加自定义控件
  6. 单链表的增、删、查、改、python实现,超详细讲解
  7. 3. 线性表的链式结构
  8. (Markdown图片居中)CSDN 验证通过
  9. IEnumerableIEnumerablestring结构解析通用解决方案(支持指定属性顺序)
  10. html坦克游戏,HTML5实现经典坦克大战坦克乱走还能发出一个子弹
  11. 教你写Linux设备驱动程序:一个简短的教程
  12. 2022电工(中级)考试模拟100题模拟考试平台操作
  13. 计算机网络与信息安全公务员,计算机网络技术专业考公务员有些职位?
  14. 2007年大学生电子设计大赛国赛电源类题目设计报告
  15. python123回文素数_平方回文素数
  16. 励志!从职高到杭电、浙大、MIT计算机博士!
  17. 链接:https://pan.baidu.com/s/1U-UlYoranUvpfj97XLrHvQ 提取码:ZMTD
  18. 6.5Linux-rpm和tar
  19. 【Vue】Vue3脚手架
  20. blood pressure android app,Blood Pressure Monitor via Bluetooth/Internet in Android

热门文章

  1. 新版码支付个人免签支付系统源码+实测成功
  2. html图片自适应屏幕大小
  3. python高斯核函数_python 实现高斯核与卷积过程
  4. nucleo STM32F072 PWM 测试
  5. 通俗易懂谈强化学习之Q-Learning算法实战
  6. JDY-24M钥匙标签使用说明
  7. 基于FPGA的DS18B20数字温度传感器测温实例
  8. 计算机毕设周记20篇,电子与计算机毕业设计周记.doc
  9. python 回归方程及回归系数的显著性检验_回归方程及回归系数的显著性检验演示教学...
  10. Java高并发编程详解系列-Volatile关键字