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

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

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

一起学习和探讨,谢谢了!
...全文
375 12 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
高手觉的分不够
可以加
五子棋游戏 1.课程设计的目的 计算机技术的不断发展给人们的日常工作和生活都带来了许多益处, 从Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家开始,各行各业的人们 无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上 已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不 得不开发适合自己特殊需求的软件。Java语言作为一种面向对象的编程语言,具有分布 式,可移植,高性能等特点。通过系统的学习,就可以使用它开发出功能齐全,满足特 殊需求的应用程序。它对学习者掌握技能,开拓思维都有很大的帮助。 Java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。它 具有面向对象、跨平台、分布应用等特点。它不仅具有更贴近自然的语义,而且有利于 软件的维护和继承。很多程序开发人员得第一选择。为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。 通过自己动手,自主得学习,对Java这门课程有更深得了解与认识,并通过自己动手 ,自主得学习,对Java这门课程有更深得了解与认识,通过本次课设,实现本学期容的回 顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组建的使用方法,图 形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据读 写的基本用法等。 学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立 得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西, 通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来 完成课程设计。 这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。通过此次课 程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreato r等开发工具的运用,拓宽常用类库的应用。 2.设计方案论证 2.1设计思路 (1)棋盘界面设计 在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。棋子的设计方面系统中设 置了两种棋子颜色,yellow或者red, 游戏者可自行选择。棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计 的主要难题。运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以 得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。这样主界面里的棋子就确定了 ,而且也确定了几个所需要的类。可以先定义好这些类了。 有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就 在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋 要有一个控制变量来控制能不能下棋。人可以随意的下子,可是计算机就要计算在哪个 位置下子了。这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要 计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断 赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都 继承或实现线程类或接口,以便各自能随时单独控制接发消息。 (2)算法设计 对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连 珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横, 竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。 对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5 个连续的同类棋子(包含本位置棋子),则判断为"连五"并结束检测循环。基于检测结 果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。 由于不考虑禁手问题,在实现"连五"过程中,我们可以考虑完成"双四","四","双 ","冲四","活","活四"来实现目的。 活四:有两个点能形成"连五"的四就是活四; 冲四:只有一个点能形成"连五"的四叫做"冲四",或者叫做"单四"; 活:己方在落一子就能形成"活四"的叫做"活"。"活"分为"连活"和"" 。连活:在棋盘某一条阳线或阴线上有同色子相连,且在此子两端延长线上有一 端至少有一个,另一端至少有两个无子的交叉点与此子紧密相连。:中间仅间 隔一个无子交叉点的连,但两端延长线均至少有一个无子的交叉点与此子相连。 双:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。 双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的
五子棋游戏 1.课程设计的目的 计算机技术的不断发展给人们的日常工作和生活都带来了许多益处, 从Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家开始,各行各业的人们 无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上 已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不 得不开发适合自己特殊需求的软件。Java语言作为一种面向对象的编程语言,具有分布 式,可移植,高性能等特点。通过系统的学习,就可以使用它开发出功能齐全,满足特 殊需求的应用程序。它对学习者掌握技能,开拓思维都有很大的帮助。 Java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。它 具有面向对象、跨平台、分布应用等特点。它不仅具有更贴近自然的语义,而且有利于 软件的维护和继承。很多程序开发人员得第一选择。为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。 通过自己动手,自主得学习,对Java这门课程有更深得了解与认识,并通过自己动手 ,自主得学习,对Java这门课程有更深得了解与认识,通过本次课设,实现本学期内容的 回顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组建的使用方法, 图形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据 读写的基本用法等。 学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立 得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西, 通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来 完成课程设计。 这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。通过此次课 程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreato r等开发工具的运用,拓宽常用类库的应用。 2.设计方案论证 设计思路 (1)棋盘界面设计 在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。棋子的设计方面系统中设 置了两种棋子颜色,yellow或者red, 游戏者可自行选择。棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计 的主要难题。运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以 得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。这样主界面里的棋子就确定了 ,而且也确定了几个所需要的类。可以先定义好这些类了。 有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就 在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋 要有一个控制变量来控制能不能下棋。人可以随意的下子,可是计算机就要计算在哪个 位置下子了。这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要 计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断 赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都 继承或实现线程类或接口,以便各自能随时单独控制接发消息。 (2)算法设计 对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连 珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横, 竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。 对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5 个连续的同类棋子(包含本位置棋子),则判断为"连五"并结束检测循环。基于检测结 果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。 由于不考虑禁手问题,在实现"连五"过程中,我们可以考虑完成"双四","四","双 ","冲四","活","活四"来实现目的。 活四:有两个点能形成"连五"的四就是活四; 冲四:只有一个点能形成"连五"的四叫做"冲四",或者叫做"单四"; 活:己方在落一子就能形成"活四"的叫做"活"。"活"分为"连活"和"" 。连活:在棋盘某一条阳线或阴线上有同色子相连,且在此子两端延长线上有一 端至少有一个,另一端至少有两个无子的交叉点与此子紧密相连。:中间仅间 隔一个无子交叉点的连,但两端延长线均至少有一个无子的交叉点与此子相连。 双:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。 双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的局面

64,647

社区成员

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

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