www.gusucode.com > 经典游戏中国象棋VC++源代码-源码程序 > 经典游戏中国象棋VC++源代码-源码程序\code\主程序\HistoryHeuristic.cpp
//Download by http://www.NewXing.com // HistoryHeuristic.cpp: implementation of the CHistoryHeuristic class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "HistoryHeuristic.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CHistoryHeuristic::CHistoryHeuristic() { } CHistoryHeuristic::~CHistoryHeuristic() { } void CHistoryHeuristic::ResetHistoryTable() { memset(m_HistoryTable,10,8100*4); } int CHistoryHeuristic::GetHistoryScore(CHESSMOVE *move) { int nFrom,nTo; nFrom=move->From.y*9+move->From.x;//原始位置 nTo=move->To.y*9+move->To.x; //目标位置 return m_HistoryTable[nFrom][nTo];//返回历史得分 } void CHistoryHeuristic::EnterHistoryScore(CHESSMOVE *move, int depth) { int nFrom,nTo; nFrom=move->From.y*9+move->From.x;//原始位置 nTo=move->To.y*9+move->To.x; //目标位置 m_HistoryTable[nFrom][nTo]+=2<<depth;//增量为2的depth次方 } void CHistoryHeuristic::MergeSort(CHESSMOVE *source, int n, BOOL direction) { int s=1; while(s<n) { MergePass(source,m_TargetBuff,s,n,direction); s+=s; MergePass(m_TargetBuff,source,s,n,direction); s+=s; } } void CHistoryHeuristic::Merge(CHESSMOVE *source, CHESSMOVE *target, int l, int m, int r) { //从小到大排序 int i=l; int j=m+1; int k=l; while(i<=m && j<=r) if(source[i].iScore<=source[j].iScore) target[k++]=source[i++]; else target[k++]=source[j++]; if(i>m) for(int q=j; q<=r;q++) target[k++]=source[q]; else for(int q=i; q<=m;q++) target[k++]=source[q]; } void CHistoryHeuristic::MergePass(CHESSMOVE *source, CHESSMOVE *target, const int s, const int n, const BOOL direction) { int i=0; while(i<=n-2*s) { //合并大小为s的相邻二段子数组 if(direction) Merge(source,target,i,i+s-1,i+2*s-1); else Merge_A(source,target,i,i+s-1,i+2*s-1); i=i+2*s; } if(i+s<n)//剩余的元素个数小于2s { if(direction) Merge(source,target,i,i+s-1,n-1); else Merge_A(source,target,i,i+s-1,n-1); } else for(int j=i;j<=n-1;j++) target[j]=source[j]; } void CHistoryHeuristic::Merge_A(CHESSMOVE *source, CHESSMOVE *target, int l, int m, int r) { //从大到小排序 int i=l; int j=m+1; int k=l; while(i<=m && j<=r) if(source[i].iScore>=source[j].iScore) target[k++]=source[i++]; else target[k++]=source[j++]; if(i>m) for(int q=j;q<=r;q++) target[k++]=source[q]; else for(int q=i;q<=m;q++) target[k++]=source[q]; }