请问关于五子棋中禁手的判断算法之“跳三”

TomDebug 2006-01-06 07:57:25
我在做网络版五子棋,在禁手的详细判断中出现了一点小困难,长连,双四都比较简单,但是双三比较烦,因为有的跳三从表面上看是跳三,但在黑棋继续落子后形成另一禁手的情况下,此跳三并不是真的跳三,也就是说跳三真假的判断必须有禁手来判断,而跳三又是组成禁手的一部分,这里存在一个递归的问题,请教高手赐教!

详细资料请参考以下连接:
http://mice.lzu.edu.cn/wuziqi/jinshou.htm

一起学习和探讨,谢谢了!
...全文
397 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
TomDebug 2006-01-20
  • 打赏
  • 举报
回复
依然没有答案,等待中
。。。。。
fct0906 2006-01-10
  • 打赏
  • 举报
回复
不好意思,没仔细看规则,应该是需要递归的,不过递归倒不会怎么增加难度的。
fct0906 2006-01-09
  • 打赏
  • 举报
回复
这里还不是递归的问题,对于这种情况,只要考虑下一步的情况。
而在写程序时也可以通过这样来判断,也甚至可以归纳出几种模式后直接进行模式匹配,也许这种情况下模式会比较多还是分成两步好些,我没有做过,还不知道,有时间可以试试看呵呵
yxg80 2006-01-09
  • 打赏
  • 举报
回复
ding
TomDebug 2006-01-08
  • 打赏
  • 举报
回复
估计做AI的同志都没有认真考虑过禁手
看到网上的一些同学的算法都是错误的
召唤中....
ruodeer 2006-01-08
  • 打赏
  • 举报
回复
ding
TomDebug 2006-01-07
  • 打赏
  • 举报
回复
回复:jixingzhong(瞌睡虫:化茧重生!)
多谢帮顶
jixingzhong 2006-01-07
  • 打赏
  • 举报
回复
跳三 判断ms 有点麻烦啊 ...
TomDebug 2006-01-07
  • 打赏
  • 举报
回复
回复lcd5:这个是网络版,没有托管AI部分,so....
--------------------------------------------------------------
做如下假设:*为黑棋,-为棋盘,请问 fiftymetre(那些花儿)你的算法判断X点是否为跳三?
------------
---*--------
------------
----**X***--
--------*---
lcd5 2006-01-06
  • 打赏
  • 举报
回复
设计五子棋算法应该攻防兼备,每次是选一个最好的落子点,用极大极小法。
禁手的权值肯定比跳三大
fiftymetre 2006-01-06
  • 打赏
  • 举报
回复
单向跳三判定

bool CFiveView::IsTiaosan(int xpos,int ypos,int dir)//同时记录全局变量tjsCount,重新再考虑
{
int iNext,jNext,iMin,iMax,jMin,jMax;
iNext=ypos;
jNext=xpos;
int n,buffer[9]={0,0,0,0,0,0,0,0,0};
n=0;
CString s="";//跟踪用

switch(dir)
{
case 0:
jMin=jNext-4;
jMax=jNext+5;
for(jMin;jMin<jMax;jMin++,n++)//将前3子后3子写入buffer
{
if(jMin<0)
{
buffer[n]=9;//标记越界
}
else if(jMin>20)
{
buffer[n]=8;
}
else
buffer[n]=g_Board[iNext][jMin];
//s.AppendFormat("%d",buffer[n]);
}
//MessageBox(s);

//处理buffer
if(buffer[0]==0&&buffer[5]==0)
{
if(buffer[1]==1&&buffer[2]==1&&buffer[3]==0)
return true;
if(buffer[1]==1&&buffer[2]==0&&buffer[3]==1)
return true;
}
if(buffer[1]==0&&buffer[6]==0)
{
if(buffer[2]==1&&buffer[3]==0&&buffer[5]==1)
return true;
}
if(buffer[2]==0&&buffer[7]==0)
{
if(buffer[3]==1&&buffer[5]==0&&buffer[6]==1)
return true;
}
if(buffer[3]==0&&buffer[8]==0)
{
if(buffer[5]==0&&buffer[6]==1&&buffer[7]==1)
return true;
if(buffer[5]==1&&buffer[6]==0&&buffer[7]==1)
return true;
}

break;
case 1://纵向判别跳3
iMin=iNext-4;
iMax=iNext+5;
for(iMin;iMin<iMax;iMin++,n++)//将前3子后3子写入buffer
{
if(iMin<0)
{
buffer[n]=9;//标记越界
}
else if(iMin>20)
{
buffer[n]=8;
}
else
buffer[n]=g_Board[iMin][jNext];
//s.AppendFormat("%d",buffer[n]);
}
//MessageBox(s);

//处理buffer
if(buffer[0]==0&&buffer[5]==0)
{
if(buffer[1]==1&&buffer[2]==1&&buffer[3]==0)
return true;
if(buffer[1]==1&&buffer[2]==0&&buffer[3]==1)
return true;
}
if(buffer[1]==0&&buffer[6]==0)
{
if(buffer[2]==1&&buffer[3]==0&&buffer[5]==1)
return true;
}
if(buffer[2]==0&&buffer[7]==0)
{
if(buffer[3]==1&&buffer[5]==0&&buffer[6]==1)
return true;
}
if(buffer[3]==0&&buffer[8]==0)
{
if(buffer[5]==0&&buffer[6]==1&&buffer[7]==1)
return true;
if(buffer[5]==1&&buffer[6]==0&&buffer[7]==1)
return true;
}
break;
case 2:
iMin=iNext-4;
iMax=iNext+5;
jMin=jNext-4;
jMax=jNext+5;
for(iMin;iMin<iMax;iMin++,jMin++,n++)//将前3子后3子写入buffer
{
if(iMin<0||jMin<0)//漏洞
{
buffer[n]=9;//标记越界
}
else if(iMin>20||jMax>20)
{
buffer[n]=8;
}
else
buffer[n]=g_Board[iMin][jMin];
//s.AppendFormat("%d",buffer[n]);
}
//MessageBox(s);

//处理buffer
if(buffer[0]==0&&buffer[5]==0)
{
if(buffer[1]==1&&buffer[2]==1&&buffer[3]==0)
return true;
if(buffer[1]==1&&buffer[2]==0&&buffer[3]==1)
return true;
}
if(buffer[1]==0&&buffer[6]==0)
{
if(buffer[2]==1&&buffer[3]==0&&buffer[5]==1)
return true;
}
if(buffer[2]==0&&buffer[7]==0)
{
if(buffer[3]==1&&buffer[5]==0&&buffer[6]==1)
return true;
}
if(buffer[3]==0&&buffer[8]==0)
{
if(buffer[5]==0&&buffer[6]==1&&buffer[7]==1)
return true;
if(buffer[5]==1&&buffer[6]==0&&buffer[7]==1)
return true;
}
break;
case 3:
iMin=iNext-4;
iMax=iNext+5;
jMin=jNext+4;
jMax=jNext-5;
for(iMin;iMin<iMax;iMin++,jMin--,n++)//将前3子后3子写入buffer
{
if(iMin<0||jMin<0)//漏洞
{
buffer[n]=9;//标记越界
}
else if(iMin>20||jMin>20)
{
buffer[n]=8;
}
else
buffer[n]=g_Board[iMin][jMin];
//s.AppendFormat("%d",buffer[n]);
}
//MessageBox(s);

//处理buffer

if(buffer[0]==0&&buffer[5]==0)
{
if(buffer[1]==1&&buffer[2]==1&&buffer[3]==0)
return true;
if(buffer[1]==1&&buffer[2]==0&&buffer[3]==1)
return true;
}
if(buffer[1]==0&&buffer[6]==0)
{
if(buffer[2]==1&&buffer[3]==0&&buffer[5]==1)
return true;
}
if(buffer[2]==0&&buffer[7]==0)
{
if(buffer[3]==1&&buffer[5]==0&&buffer[6]==1)
return true;
}
if(buffer[3]==0&&buffer[8]==0)
{
if(buffer[5]==0&&buffer[6]==1&&buffer[7]==1)
return true;
if(buffer[5]==1&&buffer[6]==0&&buffer[7]==1)
return true;
}
break;
}
return false;
}

TomDebug 2006-01-06
  • 打赏
  • 举报
回复
高手觉的分不够
可以加

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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