“计算机下五子棋”智能程序开发-实验报告模板.doc

“计算机下五子棋”智能程序开发-实验报告模板.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
“计算机下五子棋”智能程序 设计与开发实验报告 实验小组成员: 王钦杰 200930636236 黄晓彬 200930636076 李威 200930631224 2011年 11 月 14 日 实验目标 我们小组使用C++开发,用Visual Studio 2010来开发,是用了老师给的局域网内人人对战五子棋程序的源代码,在此基础上增加机器下棋智能模块,玩家可以选择不同的难度进行游戏。 算法设计 AI中包括CmoveGenerator类,走法产生器,负责检查用户的输入是否符合规则及向搜索程序提供合法的走法。 ChistoryEngine类,历史启发类,用来给搜索算法调整节点顺序。 CtranspositionTable类,置换表类,用来记忆评估过的节点价值。 CNegaScout_TT_HH类,结合历史启发和置换表增强搜索效率,使用N层预判的负极大值算法(极大极小的优化算法)和α-β剪枝算法建立极大极小树,其实这个过程是进行优化过的,就是将Alpha和Beta的间隔设的足够小,就将这个搜索的范围像窗一样限定在某一范围,搜索一次的速度能更快,但也可能搜索出的结果不在窗内,那么就只能根据结果再次调整Alpha, Beta的值搜索,所以这一过程可能重复多次,搜索的层数越深,这样的优化就越能看出效果。 下面给出这个类的核心函数的代码: int CNegaScout_TT_HH::NegaScout(int depth, int alpha, int beta) { int Count,i; BYTE type; int a,b,t; int side; int score; if (depth0) { i = IsGameOver(CurPosition, depth); if (i != 0) return i; } side = (m_nMaxDepth-depth)%2; score = LookUpHashTable(alpha, beta, depth, side); if (score != 66666) return score; if (depth = 0) //叶°?子á¨?节¨2点ì?取¨?估¨¤值|ì { score = m_pEval-Eveluate(CurPosition, side ); EnterHashTable(exact, score, depth, side ); return score; } Count = m_pMG-CreatePossibleMove(CurPosition, depth, side); if (depth == m_nMaxDepth) { m_pThinkProgress -SetRange(0, Count); m_pThinkProgress -SetStep(1); } for (i=0;iCount;i++) { m_pMG-m_MoveList[depth][i].Score = GetHistoryScore(m_pMG-m_MoveList[depth][i]); } MergeSort(m_pMG-m_MoveList[depth], Count, 0); int bestmove=-1; a = alpha; b = beta; int eval_is_exact = 0; for ( i = 0; i Count; i++ ) { if (depth == m_nMaxDepth) m_pThinkProgress -StepIt(); type = MakeMove(m_pMG-m_MoveList[depth][i], side); Hash_MakeMove(m_pMG-m_MoveList[depth][i], CurPosition); t = -NegaScout(depth-1 , -b, -a ); if (t a t beta i 0) { a = -NegaScout (depth-1, -beta, -t ); /* re-search */ eval_is_exact = 1; if(depth == m_nMaxDepth) m_cmBestMove = m_pMG-m_MoveList[depth][i]; bestmove =

文档评论(0)

136****0662 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档