download:前端框架及项目面试-聚焦Vue3/React/Webpack(最新升级版)
首先看 getPoint 办法,这个是 AI 的出入口办法,我们要对传入的棋盘数据做一个初始化,调用 initChessData 办法,计算出当前游戏的棋盘行数、列数,并且拷贝了一份棋子数据到本地(深拷贝还是浅拷贝视状况而定)。
this.ai = 3 - point.type;
复制代码
这行代码能够计算出AI是执黑子还是执白子,应该很好了解。
if (started) {
// AI先下,首子天元
int centerX = this.cols / 2;
int centerY = this.rows / 2;
return new Point(centerX, centerY, this.ai);
}
复制代码
这段代码是处置刚开局时 AI 先行落子的状况,我们这边是简单的将落子点肯定为棋盘中心位置(天元)。开局状况的落子我们能够本人定义,并不是固定的,只是说天元的位置比拟好而已。
private Point getBestPoint() {
Point best = null;
// 初始分值为最小
int score = -INFINITY;
/* 遍历一切能下棋的点位,评价各个点位的分值,选择分值最大的点位 */
for (int i = 0; i < this.cols; i++) {
for (int j = 0; j < this.rows; j++) {
if (this.chessData[i][j] != 0) {
// 该点已有棋子,跳过
continue;
}
Point p = new Point(i, j, this.ai);
// 评价该点AI得分
int val = evaluate(p);
// 选择得分最高的点位
if (val > score) {
// 最高分被刷新
score = val;
// 更新最佳点位
best = p;
}
}
}
return best;
}
复制代码
然后就到了我们最主要的办法了 getBestPoint,这个办法用于选择出 AI 的最佳落子位置。这个办法的思绪就是遍历棋盘上一切能下棋的点,然后对这个点停止评分,假如这个点的评分比之前点的评分高,就更新当前最佳落子点位,并更新最高分,一切的落子点都评价完成之后,我们就能肯定最好的点位在哪了。
/**
* 对当前棋位停止评价
*
* @param point 当前棋位
* @return
*/
private int evaluate(Point point) {
// 中心
}
复制代码
最后就是评价函数的完成了。
评价函数
在写评价函数之前,我们要先理解一下五子棋的几种棋型。(还不熟的朋友,五子棋入门理解一下:和那威学五子棋)
在这里,我把五子棋棋型大致分为:连五、活四、冲四、活三、眠三、活二、眠二、眠一 等共8种棋型。
0:空位 1:黑子 2:白子
连五:11111
活四:011110
冲四:21111
活三:001110
眠三:211100
活二:001100
眠二:001120
眠一:001200