正在阅读:Java咖啡馆(13): 终结者Java咖啡馆(13): 终结者

2005-09-07 09:55 出处: 作者:Gary Chan 责任编辑:moningfeng

教计算机玩Tic-Tac-Toe

  相对于西洋跳棋、国际象棋和围棋,我们的Tic-Tac-Toe游戏可要简单得多,虽然手动构造游戏树也不是不可行,但那样的做法实在太逊了啦!我们要砍树!

  这里给大家介绍的方法是MiniMax算法。所谓MiniMax算法,就是从当前棋局出发生成一颗n层深的游戏树,从树根开始轮流给每层结点赋予Max和Min的称号,并且按照一定的估计函数给最底层的结点赋值。然后,从下向上依次给每个结点赋值,若一个结点是Max结点,则把它子结点中的最大值赋给它,若是Min结点,则把它子结点中的最小值赋给它。如此这般,便可以得知树根选择哪个子结点才能得到最大效益。

  实际,估计函数是用来限制游戏树深度的。这里介绍的估计函数是自己可能赢棋的通道数减去对手可能赢棋的通道数。以图1举例,假设计算机执圆圈,则圆圈可能赢的通道数是4个,而大叉可能赢的通道数只有2个,所以棋局对应的估计值=4-2=2(见图1)。

  下面我们手动模仿计算机执大叉在开局时进行MiniMax算法的演算过程,让大家有个直观的理解。其中,MiniMax算法的估计函数就是上文介绍的,游戏树的深度为三层(见图2)。


  最底层的结点的赋值都是根据估计函数得到的。在Min层,每个值都是底层结点中值的最小值,这表示充满智慧的对手可能使自己落到的最窘迫的下场。当Min层生成以后,计算机自然知道Min最右边的哪个结点是最划算的,无论对手如何走,自己走正中的那一格总会占有相当的优势。

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品