python象棋ai⼊门教程-⽤Python编写⼀个国际象棋AI程序最近我⽤Python做了⼀个国际象棋程序并把代码发布在Github上了。这个代码不到1000⾏,⼤概20%⽤来实现AI。在这篇⽂章中我会介绍这个AI如何⼯作,每⼀个部分做什么,它为什么能那样⼯作起来。你可以直接通读本⽂,或者去下载代码,边读边看代码。虽然去看看其他⽂件中有什么AI依赖的类也可能有帮助,但是AI部分全都在AI.py⽂件中。
AI 部分总述
AI在做出决策前经过三个不同的步骤。⾸先,他到所有规则允许的棋步(通常在开局时会有20-30种,随后会降低到⼏种)。其次,它⽣成⼀个棋步树⽤来随后决定最佳决策。虽然树的⼤⼩随深度指数增长,但是树的深度可以是任意的。假设每次决策有平均20个可选的棋步,那深度为1对应20棋步,深度为2对应400棋步,深度为3对应8000棋步。最后,它遍历这个树,采取x步后结果最佳的那个棋步,x 是我们选择的树的深度。后⾯的⽂章为了简单起见,我会假设树深为2。
⽣成棋步树
棋步树是这个AI的核⼼。构成这个树的类是MoveNode.py⽂件中的MoveNode。他的初始化⽅法如下:
def __init__(self, move, children, parent) :变量的命名规则有哪些
self.children = children
self.parent = parent
python入门教程 下载pointAdvantage = None
depth = 1
css导航栏菜鸟教程这个类有五个属性。⾸先是move,即它包含的棋步,它是个Move类,在这不是很重要,只需要知道它是⼀个告诉⼀个起⼦往哪⾛的棋步,可以吃什么⼦,等等。然后是children,它也是个MoveNode类。第三个属性是parent,所以通过它可以知道上⼀层有哪些MoveNode。pointAdvantage属性是AI⽤来决定这⼀棋步是好是坏⽤的。depth属性指明这⼀结点在第⼏层,也就是说该节点上⾯有多少节点。⽣成棋步树的代码如下:
formation of rainstormdef generateMoveTree(self) :
moveTree = [] for move in AllMovesLegal(self.side) :
moveTree.append(MoveNode(move, [], None))
for node in moveTree :
self.board.ve)
self.populateNodeChildren(node)
self.board.undoLastMove()
return moveTreedelphi怎么没落的
变量moveTree⼀开始是个空list,随后它装⼊MoveNode类的实例。第⼀个循环后,它只是⼀个拥有没有⽗结点、⼦结点的MoveNode的数组,也就是⼀些根节点。第⼆个循环遍历moveTree,⽤populateNodeChildren函数给每个节点添加⼦节点:
def populateNodeChildren(self, node) :
简述jsp与html的区别node.pointAdvantage = PointAdvantageOfSide(self.side)
node.depth = Depth()
if node.depth == self.depth :
return
side = self.board.currentSide
legalMoves = AllMovesLegal(side) if not legalMoves :
if self.board.isCheckmate() :
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论