本文整理汇总了Golang中github.com/jacobroberts/chess/engine.Board.CopyBoard方法的典型用法代码示例。如果您正苦于以下问题:Golang Board.CopyBoard方法的具体用法?Golang Board.CopyBoard怎么用?Golang Board.CopyBoard使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/jacobroberts/chess/engine.Board
的用法示例。
在下文中一共展示了Board.CopyBoard方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: NegaScout
// First-level NegaScout search function.
// When called, alpha and beta should be set to the lowest and highest values possible.
func NegaScout(b *engine.Board, depth int, alpha, beta float64) *engine.Move {
if b.IsOver() != 0 || depth == 0 {
b.Lastmove.Score = EvalBoard(b)
return &b.Lastmove
}
var move engine.Move
// not indended for actual use
orderedmoves := b.AllLegalMoves()
var score float64
for i, m := range orderedmoves {
childboard := b.CopyBoard()
childboard.Move(m)
if i != 0 {
score = -NegaScoutChild(childboard, depth-1, -alpha-1, -alpha)
if alpha < score && score < beta {
score = -NegaScoutChild(childboard, depth-1, -beta, -alpha)
}
} else {
score = -NegaScoutChild(childboard, depth-1, -beta, -alpha)
}
alpha = math.Max(alpha, score)
if alpha >= beta {
move = *m.CopyMove()
move.Score = alpha
break
}
}
return &move
}
示例2: NegaScoutChild
// Child level NegaScout search function.
// Unlike its parent, only returns score and not full move
func NegaScoutChild(b *engine.Board, depth int, alpha, beta float64) float64 {
if b.IsOver() != 0 || depth == 0 {
return EvalBoard(b)
}
// not indended for actual use
orderedmoves := b.AllLegalMoves()
var score float64
for i, m := range orderedmoves {
childboard := b.CopyBoard()
childboard.Move(m)
if i != 0 {
score = -NegaScoutChild(childboard, depth-1, -alpha-1, -alpha)
if alpha < score && score < beta {
score = -NegaScoutChild(childboard, depth-1, -beta, -alpha)
}
} else {
score = -NegaScoutChild(childboard, depth-1, -beta, -alpha)
}
alpha = math.Max(alpha, score)
if alpha >= beta {
break
}
}
return alpha
}
示例3: NegaMax
// First-level negamax search function.
func NegaMax(b *engine.Board, depth int) *engine.Move {
if b.IsOver() != 0 || depth == 0 {
b.Lastmove.Score = EvalBoard(b)
return &b.Lastmove
}
var move engine.Move
move.Score = LOSS
for _, m := range b.AllLegalMoves() {
childboard := b.CopyBoard()
childboard.Move(m)
childscore := -NegaMaxChild(childboard, depth-1)
if childscore > move.Score {
move = *m.CopyMove()
move.Score = childscore
if move.Score == WIN {
return &move
}
}
}
return &move
}