博客搬家:最爱午后红茶
源码以及演示地址:https://github.com/QYPan/gobang
如果在落子的时候往后推算几步,可以大概估算一下复杂度。如果往后推算 4 步走法,即给自己和对方各推算两步,每步计算 50 个可落子点;那总共需要计算 50^4 = 6,250,000 个结点;这是一颗非常巨大的博弈树;程序的实际情况是每秒大约算 10000 个结点(有点慢~),那将需要 600 多秒才可确定下一步落子,这样的结果是不可接受的。还有一点就是,推算的层数最好是偶数,因为如果是奇数的话,最后一步并没有考虑到对方落子,防御力会降低。
在这颗博弈树中用极大极小的方法去计算计算机的下一步落子,可以使计算机为 MAX 层,玩家为 MIN 层。我们可以使用 alpha-beta 剪枝来实现搜索的优化。(博弈基础)
在源代码的 computer.c -> alpha_beta()
// 初始值 player = 0, depth = 0, alpha = -inf, beta = inf
alpha_beta(player, depth, alpha, beta)
begin
if 成五 then
返回结果(inf or -inf)
endif
if depth >= depth_limit then
返回估值
endif
if(!player) then // 计算机
if !depth then // 在搜索入口层
// 取落子坐标
y = p[0].y
x = p[0].x
endif
n = cal_points(p[]) // 计算所有可落子点的得分并记录在数组 p[]
for i = 0; i < n; i++
set_in(p[i].y, p[i].x) // 落子
val = alpha_beta(player^1,