前言:自AlphaGo战胜世界著名九段围棋手李世石之后,我就对棋类人工智能产生了极大的兴趣,并想要自己实现象棋的人工智能。然而那个时候我还在读高二,没有这么深厚的代码基础,所以那个时候也就只能想想了。但是现在不一样了,通过学习编程,已经可以让我在棋类人工智能这个领域向前探索了。
小编推荐一个学C语言/C++的学习群:948954484,入群即送C/C++全套学习资料,满满的干货!
首先说明一下本系列博客描述的人工智能算法不是基于机器学习、深度学习这么高深的知识,而是一种穷举找最优走法的算法。之所以AlphaGo不能使用这种算法战胜李世石,是因为围棋棋局局势的判断是极为复杂的,想要穷举所有的情况,全世界所有的计算机一起运行一百万年也无法找到最优走法。所以DeepMind团队的大佬就想出了另一种解决方案就是让AlphaGo自己学习高水平棋手间的对局,从而提升AlphaGo的棋力。然而象棋的棋局判断还是比较容易的,杀掉对面的老将就可以获胜,杀掉对面的车马炮等棋子就可以提高自己的胜率/降低对方的胜率。具体的算法在之后的篇章详细讲解。
实现本系列博客中算法的编程工具是Qt5.5.1。
小编推荐一个学C语言/C++的学习群:948954484,入群即送C/C++全套学习资料,满满的干货!
既然实现象棋人工智能的算法的本质是穷举,那么就要找到所有的通路,所谓的通路就是能够走棋的那些“路”们,走不通的那些“路”就要直接被pass掉。
1.先把棋盘抽象出来,象棋棋盘有10行9列,行标设为0~9,列标设为0~8。以左上角的坐标为(0,0),假设初始时上方为红棋,下方为黑棋。则初始时所有棋子的坐标为:
车1(红方):(0,0);车2(红方):(0,8);
马1(红方):(0,1);马2(红方):(0,7);
相1(红方):(0,2);相2(红方):(0,6);
士1(红方):(0,3);士2(红方):(0,5);
将(红方):(0,4);
炮1(红方):(2,1);炮2(红方):(2,7);
兵1(红方):(3,0);兵2(红方):(3,2);兵3&