最近用WPF写了五子棋人机对战的程序。程序的设计思路是看了网上的一些帖子,借鉴了别人的思想,再经过自己的加工和总结。司令员是有借鉴,程序全部独立完成。这次分两次讨论,今天只讨论解决问题的思路。下次再介绍程序的设计。
首先讲讲我用的算法,看了网上别人的思路,得到启发,再结合数据结构里面的知识在理解一下。其实五子棋的棋盘就是一个矩阵,机器怎么来判断将棋子放在哪个位置呢?我们可以借鉴数据结构里边的加权图。给图的每个单元格加权,权值最大的格子就是机器放置棋子的地方。好了,我们用加权图构成机器需要的数据(即优势最大的点,或者劣势最大的点)。这个是机器洛子最核心的部分,至于其他的暂时省略。
我们怎么样来给每个格子赋权值呢?假如我放了一个子在一个点,这个子周围的所有方向上都有连成五个子的可能。首先我们得奖所有获胜的情况(5连的情况)用长度为5的数组来存每个获胜情况,在用一个2维的数组来存所有获胜情况。当放了一个子,根据落点的坐标来查找获胜表,表里有这个点的话,再将每种获胜情况的点加上一个数值。如果是敌人落一个点在任一地方,就在获胜表里把有这个点的所有获胜情况删掉。再判断3连,4连的情况,根据情况不通加上不同的权。
电脑先分析人的棋盘的权值,在分子电脑棋盘的权值。如果人的权值比较大,就放在权值大的点,这就是防守,反之就是进攻。
当然下棋的人都知道,下棋就是看谁遇见的步数多谁就赢。如果想让电脑更聪明,那可以在上边加权值的方法的基础上用递归的方法来“预见”未来几步。我只是用加权的方法来实现了电脑简单的与人对战。以后会在这个基础上来使程序更加聪明的。