界面都搞定了,专心分析逻辑。
五子棋AI最难的是分析整个棋局的局势。
一种办法是遍历五子棋的每一个点,判断每一个点的分数。
如何判断每一个点的得分?根据这个点组成的所有五元组。
比如,对于电脑黑棋=4,白旗=5来说,对于该点组成的每一个五元组,有如下策略表:见下面。。。
当case 0 意味着此无棋子。
当case 4 意味着有一个黑棋棋子。
当case 8 意味着有两个个黑棋棋子。
...
当case 20 意味着有4个白旗棋子或5个黑棋棋子。这个点的得分最高,那么这个点对于黑棋来说就是必须要下的一个点。
这就是通过此策略表电脑能够堵住人下的杀棋的原因。
在实际中发现,此策略表效果惊人。
我使用的策略表如下:
int Game::chart(int count)
{
if(computerColor==4)
{
switch(count)
{
case 0: temp=7;break;
case 4: temp=35;break;
case 8: temp=800;break;
case 12: temp=15000;break;
case 16: temp=800000;break;
case 5: temp=15;break;
case 10: temp=400;break;
case 15: temp=1800;break;
case 20: temp=100000;break;
default: temp=0;
}
}
}
如何遍历所有的五元组?
这里提供一种办法,结构清晰,代码风骚,效率恐怖。
typedef