高水平的人类棋手在中局总是努力增大行动力(mobility)、减少边缘子(frontier disc)数量, 还要考虑到边角结构。这些如何编写进程序呢?最成功的方法是把局面分解成许多局部结构, 这也是在Zebra中所使用的方法。对于每个结构,如每行、每列、长度为4~8的斜线、3×3角区(例 如a1、a2、a3、b1、b2、b3、c1、c2、c3)、5×2角区(例如a1、a2、b1、b2、c1、c2、d1、d2、e1、e2)、 以及边+相邻星位(例如a1、a2、a3、a4、a5、a6、a7、a8、b2、b7),Zebra都有一个对应的估值。 为了评估局面的价值,将对应于上面所列盘面结构的46个估值相累加;如果下棋的棋手具有奇偶性(parity), 还要加上相应的附加值;其结果就是对局最终棋子数之差的估值。
估值函数所使用的模式(pattern)集表明程序的知识,因此选择好的模式很重要。 另一方面是它的速度;复杂的模式会使程序变慢。Zebra所使用的模式可以十分快速地进行运算, 而且还很强大,足以牢固理解对局位置方面的知识。
现在主要的问题是:有大量不同的局部模式需要赋予对应的估值——单单是不同的边结构就有3321个; 当算上所有的结构时,会有上万个。更槽糕的是,不同结构所对应的估值又是高度依赖于不同的对局阶段。 毫无疑问,为所有结构确定估值的过程必须能自动完成。通过取得包含高手对局的大型数据库, 计算出所有对局每个对局阶段各个结构的统计数据,就可以做到这点。Zebra花了大约一周的时间分析了100 000个对局, 为大约1 000 000个不同盘面模式确定合适的估值。