请教判断五子棋五子连线赢的高效率算法?

207 2003-04-21 10:11:47
15*15的棋盘网络版五子棋,求教判断赢的高效方法呢?
除了边界情况,每下一个子就判断一次,似乎就效率太低了。
请指教,谢谢!
...全文
418 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cymwllbggyje 2003-04-25
  • 打赏
  • 举报
回复
我是这样做的,以刚刚下完的那一点为基点,逐一向4个方向寻找跟当前下的那一点同一颜色的如果超5就判断赢。
cylon 2003-04-25
  • 打赏
  • 举报
回复
应该怎么让电脑判断下在哪里呢?就是怎么给每个点评分比较好呢。我前几天在做这个,现在对这个算法不太清楚,做的很弱智
liuw992000 2003-04-23
  • 打赏
  • 举报
回复
gz
jiangchun_xn 2003-04-23
  • 打赏
  • 举报
回复
我大一时写过五子棋。。在
http://www.csdn.net/cnshare/soft/4/4662.shtm
不过现在想想是垃圾了
整体判断:判断只需要向四个方向a
.
.
b
从a到b判断后,从b再到a就是重复。。。
单位判断:大部分都是这种,有一个最显见的规则,棋局中出现连线5子胜只可能出现在最后一步中,这一步判断很好做。效率不会很底。。沿着有子的走,到空结束

选择方向(4个不可逆方向中一个)
沿方向走,
有子
i++;
否则
break;

沿反方向
有子
j++
否则
break;

j+i==5 则返回(true);
换方向(不要存在可逆方向,4个都判断了结束)
Riemann 2003-04-23
  • 打赏
  • 举报
回复
呵呵,dcyu复出了,欢迎欢迎。
BlueSky2008 2003-04-22
  • 打赏
  • 举报
回复
char map[22][22];

struct direction{
int x;
int y;
}d[4]={{0,1},{1,1},{1,0},{-1,1}};//四个方向

bool JudgeWin(int x,int y,char player){
int num; //记录一个方向上相同的子数
int cx,cy;
for(int i = 0; i<4; i++){
num = 1;
//求一个方向上相同的子数
cx = x + d[i].x;
cy = y + d[i].y;
while(map[cx][cy]==player){
num++;
cx += d[i].x;
cy += d[i].y;
}
//求反方向上相同的子数
cx = x - d[i].x;
cy = y - d[i].y;
while(map[cx][cy]==player){
num++;
cx -= d[i].x;
cy -= d[i].y;
}

if(num>=5)return 1;
}
return 0;
}
BlueSky2008 2003-04-22
  • 打赏
  • 举报
回复
正应该“每下一个子就判断一次”。应为赢棋只会发生在刚下的子处。只要做局部的判断就行了。
dcyu 2003-04-22
  • 打赏
  • 举报
回复
只在当前下子点的八个方向判断就行了,速度不会很慢的,大概就几十次运算。
偶把大一时写的五子棋的部分代码帖出来,咳,老古董了。

void JudgeWin()
{
int i;
for(i=0;i<4;i++)
{
JudgeWinLine(i,5);
if(win) break;
}

}

void JudgeWinLine(direction,num)
int direction,num;
{
int k;
int count=1;
int posx,posy;
switch(direction)
{
case 0:
posx=1;posy=0;
break;
case 1:
posx=0;posy=1;
break;
case 2:
posx=1;posy=1;
break;
case 3:
posx=1;posy=-1;
break;
}

for(k=1;k<=4;k++)
{
if(x+k*posx<0&&x+k*posx>=15&&y+k*posy<0&&y+k*posy>=15)
break;
if(chess[x+k*posx][y+k*posy]==chess[x][y])
count++;
else break;
}

for(k=-1;k>=-4;k--)
{
if(x+k*posx<0&&x+k*posx>=15&&y+k*posy<0&&y+k*posy>=15)
break;
if(chess[x+k*posx][y+k*posy]==chess[x][y])
count++;
else break;
}

if(count==5) win=TRUE;

}
zhaoao 2003-04-22
  • 打赏
  • 举报
回复
gz
ZhangYv 2003-04-21
  • 打赏
  • 举报
回复
还有这个帖子可以看看。
http://expert.csdn.net/Expert/topic/1510/1510841.xml?temp=.4815027
重庆大学出版的《PC游戏编程-人机博弈》不错,有兴趣可以买本看看。
zzwu 2003-04-21
  • 打赏
  • 举报
回复
[注]"每下一个子就判断一次"的否定命题就是"有些步不去判断".
zzwu 2003-04-21
  • 打赏
  • 举报
回复
"每下一个子就判断一次,似乎就效率太低了。"

某一步不判能行吗?
ZhangYv 2003-04-21
  • 打赏
  • 举报
回复
应该在估值核心那块来做这个问题吧。五子棋我没做过不清楚,你可以参考其他人这部分的做法。
http://www.easthot.net/topic.asp?TOPIC_ID=12&FORUM_ID=3&CAT_ID=2&Topic_Title=%CE%D2%BA%DC%BE%C3%D2%D4%C7%B0%D0%B4%B5%C4%CE%E5%D7%D3%C6%E5%B5%C4%D4%B4%B4%FA%C2%EB%2CVisual+C%2B%2B6%2E0%B5%C4%2E&Forum_Title=VC%2B%2B%2CVC%2Enet+%BF%AA%B7%A2%C2%DB%CC%B3

33,010

社区成员

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

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