六子棋算法请教

shadowstar 2009-06-28 01:50:23
因为csdn的六子棋比赛才知道六子棋,刚刚知道的第一天下午便写了一个六子棋的小程序,也报名参加了比赛,不过写这个程序不是用来作弊了,而且它也达不到作弊的水平。

暂时这个软件称为ShadowStar ConnectK Chess,可以下K子棋,就是包括六子棋、五子棋、井字棋,或者自己定义下法。

本来我的想法是做一个树,搜索最佳的线路,不过发现太难了。就根据自己的理解写了一个简单的评估函数,可以下K子棋,棋力比较差,但是可以下棋了还是比较兴奋,如果不注意的话还能被它赢了。

我是分析棋盘上的每一个点,找出四个角度、两个方向上的棋子分布情况,再根据这些情况评分。

现在网上基本上找不到六子棋的算法,网上的五子棋算法很多,不过大多数写的都很繁杂,也没有注释。

有两个主要的问题请教一下各位:

1、博弈算法一般的思路是怎样的?我想我的思路可能是一种,就是分析每一个点。可不可以把线段做为评估的主要对象?比如一条线上棋子的分布是:--O-X-OO-(O代表白子X黑子)如果分析白子的话就分成两个线段?

2、请详细解释一下alpha-beta算法,这个网上有很多,可是说的太简单。我只是想知道它的反回值是什么?分值还是坐标?或者树的结点?第一层怎么来的?



其实有很多问题,这两点是我比较困惑的,请各位不吝赐教。
...全文
739 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihan6415151528 2009-07-03
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
void init(char flag[20][20]);//初始化棋盘
void draw(char flag[20][20]);//划出指定棋盘
int test(char flag[20][20],char);//判断是否棋局结束
bool check(int,int);//检查玩家输入坐标是否合法

int main(){
//设置棋盘大小 ,可以设置成变量 x,y
char flag[20][20];
//初始化数据
init(flag);

for(int x =0;x<400; ){//棋盘上总共能乘放下 x*y 个棋子
int i,j;
if(x%4==0){
cout<<"请A方走:";
cin>>i;
cin>>j;
while(flag[i][j]=='X'||flag[i][j]=='O')//判断输入位置是否有棋子
{
cout<<endl;
cout<<"此地已经有棋子!请重新走:";
cin>>i;
cin>>j;
}
if(check(i,j)==false)
{
cout<<endl;
cout<<"输入坐标不合法!请重新输入:";
cin>>i;
cin>>j;
}
flag[i][j]='X';//指定位置放上棋子
draw(flag);
if(test(flag,'X'))//判断是否获胜(A)
{
char replay;
cout<<"A方胜利!是否再来一局?Y/N:";
cin>>replay;
if (replay=='Y'||replay=='y')
{
main();
} else
{
break;
}

}
x+=2;
}else{
cout<<"请B方走:";
cin>>i;
cin>>j;
while(flag[i][j]=='X'||flag[i][j]=='O')
{
cout<<endl;
cout<<"此地已经有棋子!请重新走:";
cin>>i;
cin>>j;
}
if(check(i,j)==false)
{
cout<<endl;
cout<<"输入坐标不合法!请重新输入:";
cin>>i;
cin>>j;
}
flag[i][j]='O';
draw(flag);
if(test(flag,'O'))//判断是否获胜(B)
{
char replay;
cout<<"B方胜利!是否再来一局?Y/N:";
cin>>replay;
if (replay=='Y'||replay=='y')
{
main();
} else
{
break;
}

}
x+=2;
}
}
return 0;
}

void init(char flag[][20]){
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
flag[i][j]='|';
cout<<"-";
cout<<flag[i][j];
}
cout<<endl;
}
}

int test(char flag[][20],char f){
int mark =0;
for(int i=0;i<15;i++){
for(int j=0;j<15;j++){
if(//判断横着,数着,斜着三种成立情况
(f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j])
||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4])
||(f==flag[i][j]&&f==flag[i+1][j+1]&&f==flag[i+2][j+2]&&f==flag[i+3][j+3]&&f==flag[i+4][j+4]))
{
cout<<endl;
mark =1;
}
}
}
return mark;
}

void draw(char flag[][20] ){
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
cout<<"-";
cout<<flag[i][j];
}
cout<<endl;
}
}
bool check(int x,int y){
if(x>20 || y>20 || x<0 || y<0)
return false;
else
return true;
}


shadowstar 2009-07-03
  • 打赏
  • 举报
回复
回复 bigbug9002

如果电脑的水平能达到我自己的水平我就满足了,算法是很重要的,特别对提高效率来说。
怎么把你自己所想的用计算机语言表达出来是算法的关键。

你所说的局势记忆我以前就考虑过,我想应该是AI的研究方向,不过这个比一般的算法更复杂,属于模糊识别。

现在大多数算法采用的是开局库+VCF+局面分数评估+深度搜索的方式。

开局库和你说的局势记忆差不多吧?
bigbug9002 2009-07-03
  • 打赏
  • 举报
回复
我怎么觉得,如果想提高计算机的下棋水平,应该和正真下棋的高手交流啊?不同局势,有不同的下法,只凭计算机算法,怕是不太行吧.主要是把每一步都试出来的话,效率太低了.
所以算法是一方面,局势的记忆也是一方面.
shadowstar 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lihan6415151528 的回复:]
C/C++ code
#include <iostream>
using namespace std;
void init(char flag[20][20]);//初始化棋盘
void draw(char flag[20][20]);//划出指定棋盘
int test(char flag[20][20],char);//判断是否棋局结束
bool check(int,int);//检查玩家输入坐标是否合法

int main(){
//设置棋盘大小 ,可以设置成变量 x,y
char flag[20][20];
//初始化数据
init(flag);

for(int x =0;x<400; …
[/Quote]
这个只是五子棋人人对战的代码。
shadowstar 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xsir317 的回复:]
五子棋的话,可以参考的东西比较多,比如说renlib是有源码的,虽然是打谱软件,但是也有搜索连续进攻获胜的很强大的算法。
[/Quote]
好的,有空的话我看看。
xsir317 2009-07-02
  • 打赏
  • 举报
回复
五子棋的话,可以参考的东西比较多,比如说renlib是有源码的,虽然是打谱软件,但是也有搜索连续进攻获胜的很强大的算法。
bfhtian 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shadowstar 的回复:]
不一定是对点的评分,也可能是对局面的评分。

这个不是关键,只是经验问题,参数可以随时调节。
[/Quote]
现在国内和国际上已经举办了几届的六子棋比赛,可以看下别人的算法
shadowstar 2009-06-28
  • 打赏
  • 举报
回复
不一定是对点的评分,也可能是对局面的评分。

这个不是关键,只是经验问题,参数可以随时调节。
chaojunzheng 2009-06-28
  • 打赏
  • 举报
回复
关注中!
neohope 2009-06-28
  • 打赏
  • 举报
回复
要想写出好的六子棋算法,你需要先是一个六子棋高手
个人觉得对每个点制定评分规则十分重要,再复杂一些的话,需要策略库,向象棋一样,呵呵
仙道彰 2009-06-28
  • 打赏
  • 举报
回复
帮顶
java1109 2009-06-28
  • 打赏
  • 举报
回复
mark

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧