剪枝算法实现一字棋-C++
博弈树
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++相关推荐
- C++实现的基于α-β剪枝算法的井字棋游戏
"井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...
- [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
"井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...
- 使用Java实现alpha-beta剪枝算法(井字棋小游戏)
1.初始化游戏界面: /*** 初始化游戏界面:*/public void StartGream() {for (int i = 1; i < 4; i++)for (int j = 1; j ...
- 采用α-β算法实现井字棋游戏
题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...
- 基于Alpha-Beta剪枝树的井字棋人机博弈实现
1 Alpha-Beta剪枝树的简单介绍 Alpha-Beta剪枝的本质就是基于极小化极大算法的一种改进算法.因此先简单地介绍下极小化极大算法,这样有利于我们更好的理解Alpha-Beta剪枝算法. ...
- MiniMax算法实现井字棋
使用MiniMax算法实现井字棋,下面是问题的记录 源代码地址:gitee仓库地址 python中列表的浅复制和深复制 在函数传递中,如果实参传递可变数据类型(list.set.dict)实际上传递的 ...
- java——博弈算法实现井字棋游戏
通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...
- 极小化极大算法实现井字棋
Minimax算法 Minimax 算法又叫极小化极大算法,是一种找出失败的最大可能性中的最小值的算法.(维基百科) alpha-beta 剪枝 Minimax算法中,由于每个节点都是取的极值,所以可 ...
- python井字棋最大最小算法_python井字棋算法及代码
井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X.O 或 关于落子问题 由于只能采用键盘输入,所以需要对棋盘进行坐标表示: 即直接用1-9个9个数字来表示位置, 7|8|9 -+-+- ...
- Python手写强化学习Q-learning算法玩井字棋
Q-learning 是强化学习中的一种常见的算法,近年来由于深度学习革命而取得了很大的成功.本教程不会解释什么是深度 Q-learning,但我们将通过 Q-learning 算法来使得代理学习如何 ...
最新文章
- INSTALL_FAILED_VERSION_DOWNGRADE
- 把一个人的特点写具体作文_部编版五年级下册语文习作把一个人的特点写具体教案课件+范文...
- 使用windows服务更新站点地图
- 消息断点+内存断点定位窗口过程
- 微软北大联合提出换脸AI和脸部伪造检测器,演绎现实版「矛与盾」?
- python绘制滑稽脸_用Python画滑稽
- 一种基于游戏引擎的AR模式探讨(上)
- DevC++最新汉化版(支持C++11)
- Mysql 索引 n-gram分词引擎使用
- exchange 2010 relay设定
- easyexcel导入简单封装
- Spring Boot整合Swagger3
- Asp.net基础概念之 委托
- windows server 2012将计算机图标添加到桌面(图文教程)(转)
- Linux学习笔记二:Ubuntu启用root用户、更改软件源以及安装vim
- C# 中用 PadLeft、PadRight 补足位数
- 为何最简单的破坏命令通过了众多杀软
- 二、电容屏原理(1)
- oracle增加字段为主键自增_Oracle新增自增一的主键字段和赋值代码
- c语言中 x20是什么意思,vivo X20的这些功能,我想给满分。