博弈树

alpha & beta剪枝算法实现一字棋

剪枝算法首先就是要理解,把这个算法彻底弄清楚,我觉得这是一件非常有意义的事情!为后续书写其它棋类的AI打下了坚实的基础

剪枝操作的实现,遍历下一步所有可能取到的点,找出评估值最大的那一步就是我们下一步所需要的做的。
剪枝算法

int Tree::alphaBeta(int &value,int deep,bool MAX){if(isWin()==1){value=10000;return 0;}//递归的终点if(deep+this->count==9){return this->evaluate();}//一开始不剪枝bool prune=false;int temp,flag;//max结点我开始落子,电脑希望flag越大越好if(MAX)flag=10000;//min结点电脑开始落子,我希望flag越小越好elseflag=-10000;for(int i=0;i<NUM && !prune;i++){for(int j=0;j<NUM && !prune;j++){//找出一个空位置下棋if(this->s[i][j]==' '){//如果当前结点是max结点,下一步是我下棋if(MAX){this->s[i][j]='X';//如果我下这一步我赢了,是电脑最不希望看到的,直接值取-100if(this->isWin()==-1)temp=-10000;elsetemp=this->alphaBeta(flag,deep+1,!MAX);if(temp<flag)    flag=temp;//如果我下棋让评分变的低了,电脑完全没必要走这一步,剪枝if(flag<=value) prune=true;}//min结点电脑开始下棋else{this->s[i][j]='O';//如果这一步对于电脑来说直接取得胜利,对于机器来说是十分想看到的if(this->isWin()==1)temp=10000;elsetemp=this->alphaBeta(flag,deep+1,!MAX);//我们希望的flag小于实际的评分,此时flag应该更新if(temp>flag)  flag=temp;//此时对于我来说是十分不利的,我不可能走这一步让电脑获取胜利,我这一步应该被剪枝//或结点的alpha值不能降低其父结点的beta值,剪枝if(flag>=value) prune=true;}this->s[i][j]=' ';}}}//max(或)结点的扩展要是能提高value值if(MAX){if(flag>value)value=flag;}//min(与)结点的扩展要是能降低value值else{if(flag<value)value=flag;}return flag;
}

剪枝算法是一字棋程序中的核心部分,此外还需要定义一个棋类,用于初始化和实现下棋操作
棋类部分代码以及所有函数和变量

class Chess{private:char a[3][3];       //棋盘的状态int count;          //已经下棋的步数
public:std::string computer,player;        //电脑与玩家int x,y;                          //下棋的位置std::string str,winner;              //当前落子的对象void initial();                    //初始化函数void getMove();                  //获取走棋的位置bool makeMove(int,int,std::string);    //走棋函数void showStatus();                //展示棋盘当前的状态bool isGameOver();               //判断游戏是否结束void getStatus(char[][3]);          //获取当前的状态int getCount();                     //获取当前已经走棋的步数
};
void Chess::initial(){this->computer="Computer";this->player="Player";this->winner=" ";this->count=0;this->str=this->player;for(int i=0;i<NUM;i++){for(int j=0;j<NUM;j++){this->a[i][j]=' ';}}
}

主函数部分

 Onechess.initial();while(!Onechess.isGameOver() && Onechess.getCount()!=9){Onechess.showStatus();if(Onechess.str==Onechess.player){Onechess.getMove();Onechess.makeMove(Onechess.x,Onechess.y,Onechess.str);}else{tree.getChessStatus(Onechess);//不断的去试探,找出一个最大的value的值的走法for(int i=0;i<NUM;i++){for(int j=0;j<NUM;j++){if(tree.s[i][j]==' '){tree.s[i][j]='O';tree.alphaBeta(value,deep,1);if(value>temp){temp=value;row=i;column=j;}tree.s[i][j]=' ';}}}value=-10000;temp=-10000;Onechess.makeMove(row+1,column+1,Onechess.str);}printf("\n**************");}Onechess.showStatus();//并没有分出胜负,但是下棋的步数已经到达了9步,此时判定平局if(!Onechess.isGameOver() && Onechess.getCount()==9){printf("There are no winner! Is Draw!!!");}elseprintf("The winner is %s,let's congratulate!",Onechess.winner.c_str());

通过此次书写一字棋的博弈树,我对人工智能有了一个很好的了解。
部分运行截图。程序运行,结果最多就是平局,然后就是玩家输掉游戏。

剪枝算法实现一字棋-C++相关推荐

  1. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  2. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  3. 使用Java实现alpha-beta剪枝算法(井字棋小游戏)

    1.初始化游戏界面: /*** 初始化游戏界面:*/public void StartGream() {for (int i = 1; i < 4; i++)for (int j = 1; j ...

  4. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  5. 基于Alpha-Beta剪枝树的井字棋人机博弈实现

    1 Alpha-Beta剪枝树的简单介绍 Alpha-Beta剪枝的本质就是基于极小化极大算法的一种改进算法.因此先简单地介绍下极小化极大算法,这样有利于我们更好的理解Alpha-Beta剪枝算法. ...

  6. MiniMax算法实现井字棋

    使用MiniMax算法实现井字棋,下面是问题的记录 源代码地址:gitee仓库地址 python中列表的浅复制和深复制 在函数传递中,如果实参传递可变数据类型(list.set.dict)实际上传递的 ...

  7. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

  8. 极小化极大算法实现井字棋

    Minimax算法 Minimax 算法又叫极小化极大算法,是一种找出失败的最大可能性中的最小值的算法.(维基百科) alpha-beta 剪枝 Minimax算法中,由于每个节点都是取的极值,所以可 ...

  9. python井字棋最大最小算法_python井字棋算法及代码

    井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X.O 或 关于落子问题 由于只能采用键盘输入,所以需要对棋盘进行坐标表示: 即直接用1-9个9个数字来表示位置, 7|8|9 -+-+- ...

  10. Python手写强化学习Q-learning算法玩井字棋

    Q-learning 是强化学习中的一种常见的算法,近年来由于深度学习革命而取得了很大的成功.本教程不会解释什么是深度 Q-learning,但我们将通过 Q-learning 算法来使得代理学习如何 ...

最新文章

  1. INSTALL_FAILED_VERSION_DOWNGRADE
  2. 把一个人的特点写具体作文_部编版五年级下册语文习作把一个人的特点写具体教案课件+范文...
  3. 使用windows服务更新站点地图
  4. 消息断点+内存断点定位窗口过程
  5. 微软北大联合提出换脸AI和脸部伪造检测器,演绎现实版「矛与盾」?
  6. python绘制滑稽脸_用Python画滑稽
  7. 一种基于游戏引擎的AR模式探讨(上)
  8. DevC++最新汉化版(支持C++11)
  9. Mysql 索引 n-gram分词引擎使用
  10. exchange 2010 relay设定
  11. easyexcel导入简单封装
  12. Spring Boot整合Swagger3
  13. Asp.net基础概念之 委托
  14. windows server 2012将计算机图标添加到桌面(图文教程)(转)
  15. Linux学习笔记二:Ubuntu启用root用户、更改软件源以及安装vim
  16. C# 中用 PadLeft、PadRight 补足位数
  17. 为何最简单的破坏命令通过了众多杀软
  18. 二、电容屏原理(1)
  19. oracle增加字段为主键自增_Oracle新增自增一的主键字段和赋值代码
  20. c语言中 x20是什么意思,vivo X20的这些功能,我想给满分。

热门文章

  1. 2022爱分析· 业财税一体化厂商全景报告
  2. CMAKE Opencv配置
  3. java retainall源码,Java CopyOnWriteArraySet retainAll()用法及代码示例
  4. 某型火炮随动控制系统测试研究
  5. 一张图概括淘宝直播背后的前端技术
  6. SSD1306 OLED驱动芯片 详细介绍(使用I2C)
  7. 中国的北斗,世界的北斗|hightopo卫星发射demo
  8. UniBeast使用心得
  9. AD15 PCB规则检查,unplated pad
  10. 【测试基础】Linux打包、解包、解压缩命令这一篇全