Z
zhangxiong
Unregistered / Unconfirmed
GUEST, unregistred user!
// 负极大值搜索引擎
function CNegamaxEngine.NegaMax(nDepth: Integer): Integer;
var
current, score: Integer;
i, Count: Integer;
MoveType: Byte;
begin
current := -20000;
i := IsGameOver(CurPosition, nDepth)
// 检查棋局是否结束
if i <> 0 then
begin
// 棋局结束,返回极大/极小值
Result := i;
exit;
end;
if nDepth <= 0 then
begin
// 返回估值
Result := m_pEval.Evaluate(CurPosition, ((m_nMaxDepth - nDepth) mod 2)=1);
end
else
begin
// 列举出当前局面下一步所有可能的走法
Count := m_pMG.CreatePossibleMove(CurPosition, nDepth, (m_nMaxDepth - nDepth) mod 2);
for i:=0 to Count-1 do
begin
// 根据走法产生新局面
MoveType := MakeMove(m_pMG.m_MoveList[nDepth]);
// 递归调用负极大值搜索下一层的节点
score := -NegaMax(nDepth-1);
// 恢复当前局面
UnMakeMove(m_pMG.m_MoveList[nDepth], MoveType);
if score > current then // 如果score大于已知的最大值
begin
current := score
// 修改当前最大值为score
if nDepth = m_nMaxDepth then
begin
// 靠近根部时保存最佳走法
m_cmBestMove := m_pMG.m_MoveList[nDepth];
end;
end;
end;
Result := current
// 返回极大值
end;
end;
function CNegamaxEngine.NegaMax(nDepth: Integer): Integer;
var
current, score: Integer;
i, Count: Integer;
MoveType: Byte;
begin
current := -20000;
i := IsGameOver(CurPosition, nDepth)
// 检查棋局是否结束
if i <> 0 then
begin
// 棋局结束,返回极大/极小值
Result := i;
exit;
end;
if nDepth <= 0 then
begin
// 返回估值
Result := m_pEval.Evaluate(CurPosition, ((m_nMaxDepth - nDepth) mod 2)=1);
end
else
begin
// 列举出当前局面下一步所有可能的走法
Count := m_pMG.CreatePossibleMove(CurPosition, nDepth, (m_nMaxDepth - nDepth) mod 2);
for i:=0 to Count-1 do
begin
// 根据走法产生新局面
MoveType := MakeMove(m_pMG.m_MoveList[nDepth]);
// 递归调用负极大值搜索下一层的节点
score := -NegaMax(nDepth-1);
// 恢复当前局面
UnMakeMove(m_pMG.m_MoveList[nDepth], MoveType);
if score > current then // 如果score大于已知的最大值
begin
current := score
// 修改当前最大值为score
if nDepth = m_nMaxDepth then
begin
// 靠近根部时保存最佳走法
m_cmBestMove := m_pMG.m_MoveList[nDepth];
end;
end;
end;
Result := current
// 返回极大值
end;
end;