求助大神五子棋alphabeta的迭代加深算法(出现异常)

int AI::AlphaBeta(int depth, int alpha, int beta) {
int val;
total++;
// 对方最后一子连五
if (CheckWin())
return -10000;
// 叶节点
if (depth == 0)
return evaluate();
int count = GetMove(depth);
// 遍历所有走法
for (int i = 1; i <= count; i++) {
MakeMove(s[depth][i].p);
val = -AlphaBeta(depth - 1, -beta, -alpha);
DelMove();
if (val >= beta) {
ABcut++;
return val;
}
if (val > alpha) {
alpha = val;
}
return alpha;
}
}
struct xy AI::gobang() {
int i;
clock_t start, finish;
start = clock();
cout << "电脑思考中......\n";
total = 0;
ABcut = 0;
srand(time(NULL));
// 第一步下中心点
if (step == 0) {
BestMove.x = size / 2;
BestMove.y = size / 2;
return BestMove;
}
// 第二,三步随机
if (step == 2 || step == 1) {
int rx, ry;
do {
rx = rand() % 5 + chessxy[1].x - 2;
ry = rand() % 5 + chessxy[1].y - 2;
} while (chessboard[rx][ry] != 0);
BestMove.x = rx;
BestMove.y = ry;
return BestMove;
}
// 迭代加深搜索
for (int i= 2; i <= SearchDepth; i += 2) {
int depth=i;
int val;
int alpha=-10001;
int beta=10000;
total++;
int count = GetMove(depth);
// 遍历所有走法
for (int j = 1; j<= count; j++) {
MakeMove(s[depth][j].p);
val = -AlphaBeta(depth - 1, -beta, -alpha);
DelMove();
if (val >= beta) {
BestVal = val;
BestMove = s[depth][j].p;
ABcut++;
break;
}
if (val > alpha) {
BestVal=alpha = val;
BestMove = s[depth][j].p;
}
}
if (BestVal == 10000)
break;
}
finish = clock();
ThinkTime = (double)(finish - start) / CLOCKS_PER_SEC;
return BestMove;
}

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

不知道为什么,一看见这种没有缩进的代码就不愿意看。

数学没学好的人,有个词叫"分形几何"!五子棋可以不遍历的,逢三必挨,即使3个不在一条线上但他们的周围没有自己的棋子,也要选颗子挨着,然后就是如果一头被堵的情况下选择堵四还是堵三的问题了,,采用同余数(除数为列数、列数减1,列数加1)以及连续数都可以成为一行,判断连续的区间15X15的棋盘可以判断24、38、52、66等等。所有的下棋都先选必死棋防御(不下就死),然后择防守中带进攻的,最后进攻棋子选择同余集合区间无敌方棋子的下法 。最后想说的是,五子棋有先发优势的,先下的可以让后下的永远赢不了,做AI?可以选择下第九手时换边,或第5手时让后下的连走两步