社区
C++ 语言
帖子详情
五子棋 贪婪算法
longdouhzt
2010-12-10 10:34:34
写五子棋程序, 我的方法是博弈树加A-B剪枝, 为了提高速度,开始的时候要先取分数高的几个点,这样可以剪得多
好像有贪婪算法什么的 但是我没学过 各位能不能给点建议?
...全文
86
5
打赏
收藏
五子棋 贪婪算法
写五子棋程序, 我的方法是博弈树加A-B剪枝, 为了提高速度,开始的时候要先取分数高的几个点,这样可以剪得多 好像有贪婪算法什么的 但是我没学过 各位能不能给点建议?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qq120848369
2010-12-10
打赏
举报
回复
这个你要去算法与数据结构区。
longdouhzt
2010-12-10
打赏
举报
回复
……
我们规定每下一步只能1秒钟~
盼望神牛
就想叫yoko
2010-12-10
打赏
举报
回复
牛人,我当年写一个5子棋就是判定落子点的所以5子情况是否有满足的
longdouhzt
2010-12-10
打赏
举报
回复
其实搜过了 没找到好的 有的看不懂,有的就一个函数名,都没具体代码~
yihandrensunyong
2010-12-10
打赏
举报
回复
楼主 百度搜索 五子棋 核心算法 有好多 肯定有你想要的
贪婪法AI
五子棋
贪婪法人工智能
五子棋
,可实现人机对弈,C++编写,界面清晰
五子棋
源代码
五子棋
源代码 根据
贪婪算法
实现的源代码
基于FPGA的机器博弈
五子棋
游戏1
1.1 设计目的 1.2 应用领域 1.3 适用范围 2.1 系统介绍 2.2 各模块介绍 2.2.1 FPGA 中央控制模块 2.2.2 蓝牙笔模块 2.2.
很好的
五子棋
MFC
五子棋
的核心算法 一、相关的数据结构 关于盘面情况的表示,以链表形式表示当前盘面的情况,目的是可以允许用户进行悔棋、回退等操作。 CList StepList; 其中Step结构的表示为: struct Step { int m; //m,n表示两个坐标值 int n; char side; //side表示下子方 }; 以数组形式保存当前盘面的情况, 目的是为了在显示当前盘面情况时使用: char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE]; 其中FIVE_MAX_LINE表示盘面最大的行数。 同时由于需要在递归搜索的过程中考虑时间和空间有效性,只找出就当前情况来说相对比较好的几个盘面,而不是对所有的可下子的位置都进行搜索,这里用变量CountList来表示当前搜索中可以选择的所有新的盘面情况对象的集合: CList CountList; 其中类CBoardSituiton为: class CBoardSituation { CList StepList; //每一步的列表 char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE]; struct Step machineStep; //机器所下的那一步 double value; //该种盘面状态所得到的分数 } 二、评分规则 对于下子的重要性评分,需要从六个位置来考虑当前棋局的情况,分别为:-,¦,/,\,//,\\ 实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对机器方的分数。 基本的规则如下: 判断是否能成5, 如果是机器方的话给予100000分,如果是人方的话给予-100000 分; 判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予10000分,如果是人方的话给予-10000分; 判断是否已成双活3,如果是机器方的话给予5000分,如果是人方的话给予-5000 分; 判断是否成死3活3,如果是机器方的话给予1000分,如果是人方的话给予-1000 分; 判断是否能成死4,如果是机器方的话给予500分,如果是人方的话给予-500分; 判断是否能成单活3,如果是机器方的话给予200分,如果是人方的话给予-200分; 判断是否已成双活2,如果是机器方的话给予100分,如果是人方的话给予-100分; 判断是否能成死3,如果是机器方的话给予50分,如果是人方的话给予-50分; 判断是否能成双活2,如果是机器方的话给予10分,如果是人方的话给予-10分; 判断是否能成活2,如果是机器方的话给予5分,如果是人方的话给予-5分; 判断是否能成死2,如果是机器方的话给予3分,如果是人方的话给予-3分。 实际上对当前的局面按照上面的规则的顺序进行比较,如果满足某一条规则的话,就给该局面打分并保存,然后退出规则的匹配。注意这里的规则是根据一般的下棋规律的一个总结,在实际运行的时候,用户可以添加规则和对评分机制加以修正。 三、胜负判断 实际上,是根据当前最后一个落子的情况来判断胜负的。实际上需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45度角和135度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。具体见下面的图示: 四、搜索算法实现描述 注意下面的核心的算法中的变量currentBoardSituation,表示当前机器最新的盘面情况, CountList表示第一层子节点可以选择的较好的盘面的集合。核心的算法如下: void MainDealFunction() { value=-MAXINT; //对初始根节点的value赋值 CalSeveralGoodPlace(currentBoardSituation,CountList); //该函数是根据当前的盘面情况来比较得到比较好的可以考虑的几个盘面的情况,可以根据实际的得分情况选取分数比较高的几个盘面,也就是说在第一层节点选择的时候采用
贪婪算法
,直接找出相对分数比较高的几个形成第一层节点,目的是为了提高搜索速度和防止堆栈溢出。 pos=CountList.GetHeadPosition(); CBoardSituation* pBoard; for(i=0;ivalue=Search(pBoard,min,value,0); Value=Select(value,pBoard->value,max); //取value和pBoard->value中大的赋给根节点 } for(i=0;ivalue) //找出那一个得到最高分的盘面 { currentBoardSituation=pBoard; PlayerMode=min; //当前下子方改为人 Break; } } 其中对于Search函数的表示如下:实际上核心的算法是一个剪枝过程,其中在这个搜索过程中相关的四个参数为:(1)当前棋局情况;(2)当前的下子方,可以是机器(max)或者是人(min);(3)父节点的值oldValue;(4)当前的搜索深度depth。 double Search(CBoardSituation& board,int mode,double oldvalue,int depth) { CList m_DeepList; if(deptholdvalue))== TRUE) { if(mode==max) value=select(value,search(successor Board,min,value,depth+1),max); else value=select(value,search(successor Board,max,value,depth+1),min); } return value; } else { if ( goal(board)<>0) //这里goal(board)<>0表示已经可以分出胜负 return goal(board); else return evlation(board); } } 注意这里的goal(board)函数是用来判断当前盘面是否可以分出胜负,而evlation(board)是对当前的盘面从机器的角度进行打分。 下面是Select函数的介绍,这个函数的主要目的是根据 PlayerMode情况,即是机器还是用户来返回节点的应有的值。 double Select(double a,double b,int mode) { if(a>b && mode==max)¦¦ (a< b && mode==min) return a; else return b; }
Java
五子棋
游戏(完整项目,eclipse直接运行)
Java编写的
五子棋
程序完成功能: 1.显示
五子棋
棋盘 2.实现黑白落子,可以设定人机对弈或者人人对弈,对于人人对弈,需要输入对弈双方的姓名。 3.能够正确的判断输赢 4.支持棋盘中盘的存储和恢复。 5.显示历史棋局输赢情况,包括对弈结束时间,对弈双方姓名,赢家 6.人机对弈中的机器一方可以选择随机落子、跟随落子、贪婪落子、智能落子其中任意一种算法。 7. 悔棋,至少可以悔棋一次
C++ 语言
65,208
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章