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