可以采用这样的笨算法,运行起来慢点,但是很简单易懂,而且效果很好。如果能够加以优化,则其实是很好的算法:
1、首先遍历整个棋盘,找到一个可以落子的点,然后假设自己在该点落子,再然后判断如果棋子落到这个点上后会对自己有什么利益,比如会不会形成冲4活三、双活三等等,(事先将冲四活三、双活三等效果定义上利益值,当然,如果是五个子连起来了的话,利益值要被定义成最高,最好是无穷大的),将各种效果的利益值相加,得到己方的利益值。
2、将角色互换一下,重复第一步,得到对方的利益值(其实是递桂算法)。
3、将己方的利益值减去对方的利益值,得到该点的总利益值。
4、整个棋盘所有能落子的点都计算出利益值之后,找出利益值最大的那个点,将棋子落到该点。
当然,这个算法可以有很大程度的优化,比如,如果没有相邻的棋子,可以放弃该点。还有一旦找出可以胜利的点,就不再继续往下计算。。。。
模拟算法:
int liyi(角色, 层次)
{
if(层次=0)
return 0;
for(第一个可以落子的点 到 最后一个可以落子的点)
{
int 利益,最大利益;
//递桂...
利益 = 获取本角色利益值() - liyi(角色=相反角色,层次-1);
if(利益>最大利益)
{
最大利益 = 利益;
保存该点。
}
落子到所保存的点。
}
我觉得这个问题的关键是设计一个散列函数来表征启发式信息,
基本原理:
假定将子下在某个位置,然后考核启发函数的值,保存信息,回溯……
当搜索完所有棋盘上的可下位置时,
最终选择启发函数值最大的那个位置落子。
启发函数的一种设计思路:
发现5个相连的本色子,返回Max
四位缺一,返回10//这个权值是我杜撰的,不一定合适
三位缺二,返回6//你可以自己设计
...
以某种算法5位5位的匹配整个棋盘,
将所有的权值加在一起,
作为启发函数的函数值返回
棋盘横向为A1,A2,A3…… 纵向B1,B2…… 假设将棋子放入的点为A5:B5 那么将要判定八个方向有没有相同的棋子,所以要写八个函数, 比如A5:B4 有没有,如果有,继续以A5:B4调用同一个函数(同一个方向上的判定).
LS的好像是胜负判断吧?
我下过一个五子棋的源代码,不过没仔细研究,你可以自己搜索一下,网上有的
其实找一份源码参考着做很好的啊.
可以看到别人是怎么调用,怎么优化
而且实现某一功能基本都有3种方法