- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)