加入搜索层数,取局面的最小值,最大值构成递归 ,这里回溯的作用就体现出来
Step* SingleGame::getBestMove()
{
QVector<Step *> steps;
//看看有哪些步骤可以走
getAllPossibleMove(steps);
int maxScore=-100000;
Step* ret;
for(QVector<Step*>::iterator it=steps.begin();it!=steps.end();++it)
{
Step* step=*it;
//试着走一下
fakeMove(step);
int score=getMinScore(_level-1);
unfakeMove(step);
if(score>maxScore)
{
maxScore=score;
ret=step;
}
}
return ret;
}
求最小值
int SingleGame::getMinScore(int level)
{
if(level==0) return calcScore();
QVector<Step*> steps;
getAllPossibleMove(steps);
int minScore=100000;
for(QVector<Step*>::iterator it=steps.begin();it!=steps.end();++it)
{
Step* step=*it;
fakeMove(step);
int score=getMaxScore(level-1);
unfakeMove(step);
if(score<minScore)
{
minScore=score;
}
}
return minScore;
}
求最大值
int SingleGame::getMaxScore(int level)
{
if(level==0) return calcScore();
QVector<Step*> steps;
getAllPossibleMove(steps);
int maxScore=-100000;
for(QVector<Step*>::iterator it=steps.begin();it!=steps.end();++it)
{
Step* step=*it;
fakeMove(step);
int score=getMinScore(level-1);
unfakeMove(step);
if(score>maxScore)
{
maxScore=score;
}
}
return maxScore;
}