社区
C++ 语言
帖子详情
请问关于五子棋中禁手的判断算法之“跳三”
TomDebug
2006-01-06 07:57:25
我在做网络版五子棋,在禁手的详细判断中出现了一点小困难,长连,双四都比较简单,但是双三比较烦,因为有的跳三从表面上看是跳三,但在黑棋继续落子后形成另一禁手的情况下,此跳三并不是真的跳三,也就是说跳三真假的判断必须有禁手来判断,而跳三又是组成禁手的一部分,这里存在一个递归的问题,请教高手赐教!
详细资料请参考以下连接:
http://mice.lzu.edu.cn/wuziqi/jinshou.htm
一起学习和探讨,谢谢了!
...全文
397
12
打赏
收藏
请问关于五子棋中禁手的判断算法之“跳三”
我在做网络版五子棋,在禁手的详细判断中出现了一点小困难,长连,双四都比较简单,但是双三比较烦,因为有的跳三从表面上看是跳三,但在黑棋继续落子后形成另一禁手的情况下,此跳三并不是真的跳三,也就是说跳三真假的判断必须有禁手来判断,而跳三又是组成禁手的一部分,这里存在一个递归的问题,请教高手赐教! 详细资料请参考以下连接: http://mice.lzu.edu.cn/wuziqi/jinshou.htm 一起学习和探讨,谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
高手觉的分不够
可以加
GetwayWorker的
五子棋
demo
tp5+GetwayWorker实现,
算法
部分抄的别人一个workerman的
五子棋
(2版).zip
五子棋
(2版).zip
五子棋
人机对战完整代码
目录 〇,前言 一,
五子棋
棋盘 二,
五子棋
比赛规则 1,行棋顺序 2,
判断
胜负
三
,重要棋型解释 1,五连: 2,活四: 3,冲四: 4,活
三
: 四,禁手规则 1,
三
三
禁手 2,四四禁手 3,长连禁手 五,代码解释 1,棋子表示 2,棋盘表示 3,flat技术 4,棋型
判断
和禁手
判断
4.1 活四 4.2 冲四 4.3 活3 5,AI
算法
6,AI的.........
第6-5课:
五子棋
游戏的相关
算法
五子棋
的复杂程度要超过之前介绍的奥赛罗棋,它不仅规则多,概念也多,比如“冲二”、“冲
三
”、“活二”、“
三
三
禁手”、“四四禁手”等,对这些模型的
判断
其
算法
非常重要,如果不能正确
判断
这些型,估值函数就无法实现。这一课我们将介绍一些
五子棋
游戏的
算法
,当然,也包括棋盘的数据模型设计。 棋盘模型
五子棋
(Five In a Row,FIR)流行非常广泛,在不同的国家有不同的名称,标准的
五子棋
棋盘是 ...
人工智能博弈树极大极小搜索
算法
alpha-beta剪枝实现
五子棋
,带禁手
由于2020的特殊情况,导致了一个被拖了挺久的大作业。。。。
五子棋
其实大家很多时候会在闲暇时刻和朋友随便玩玩,这不仅让我回忆起了高中时候摸鱼休息就喜欢和同学在自己打的格子中用铅笔来一盘
五子棋
,回想起来确实是至今以来最快乐的一段时光。 高考前最后一次晚自习,当时离开时好像没什么不舍,但不知是什么驱使着我在临走之前留下了这样一张照片,小小的教室里承载了许多光阴,或许我们只是这间教室匆匆岁月中的一位过客,但于我而言,这段时光却是无法取代的。 OK,言归正传,咱们来谈谈
五子棋
。
五子棋
相关知识 先来看看什么是五
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章