请教一下围棋软件提子的算法?

misa98 2016-12-28 09:07:16

谁会?这个问题比较复杂!

你只要能把围棋提子的算法说明白就行?
...全文
715 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-01-09
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
int xs[10000];
int ys[10000];
int i=0,xx,yy;
int fc,bc;
void push(int x,int y) {
xs[i]=x;
ys[i]=y;
if (i<10000-1) {
i=i+1;
} else {
printf("stack overflow!\n");
exit(1);
}
}
void pop(void) {
i=i-1;
xx=xs[i];
yy=ys[i];
}
int check(int x,int y) {
int c;

c=getpixel(x,y); /* 获取当前点的颜色 */
return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */
}
void seedfilling(int x,int y,int fill_color,int boundary_color) {
fc=fill_color;
bc=boundary_color;
push(x,y);
while (1) {
if (i<=0) return;
pop();
if (check(xx,yy)) {
putpixel(xx, yy, 14);getch(); /* 加上这行显示当前填充状态 */

putpixel(xx, yy, fill_color); /* 画点 */

if (check(xx-1,yy )) push(xx-1,yy );
if (check(xx ,yy+1)) push(xx ,yy+1);
if (check(xx ,yy-1)) push(xx ,yy-1);
if (check(xx+1,yy )) push(xx+1,yy );
/* 去掉下面四句就是四连通 */
if (check(xx-1,yy-1)) push(xx-1,yy-1);
if (check(xx-1,yy+1)) push(xx-1,yy+1);
if (check(xx+1,yy-1)) push(xx+1,yy-1);
if (check(xx+1,yy+1)) push(xx+1,yy+1);
}
}
}
void main() {
int a,b,color;
int gdriver = DETECT, gmode, errorcode;
int poly[10];

initgraph(&gdriver, &gmode, "d:\\bc\\bgi");
a=150;
b=140;
color=4;
poly[0]=110;/* 第一个点的x坐标以及y坐标 */
poly[1]=110;
poly[2]=200;/* 第二点 */
poly[3]=105;
poly[4]=170;/* 第三点 */
poly[5]=120;
poly[6]=150;/* 第四点 */
poly[7]=170;
poly[8]=110;/* 多边形的起点与终点一样 */
poly[9]=110;
drawpoly(5,poly);/* 显示各点连接起来的多边形 */

/* 保证边界对八连通是封闭的 */
setviewport(0,1,600,300,0);
drawpoly(5,poly);/* 显示各点连接起来的多边形 */
setviewport(1,0,600,300,0);
drawpoly(5,poly);/* 显示各点连接起来的多边形 */
setviewport(1,1,600,300,0);
drawpoly(5,poly);/* 显示各点连接起来的多边形 */

/* 恢复默认viewport */
setviewport(0,0,600,300,0);

seedfilling(a,b,color,15); /* 种子填充多边形 */

getch();
closegraph();
}

Talk is cheap, show me the code.
真相重于对错 2017-01-08
  • 打赏
  • 举报
回复
计算量也不会很大,一盘棋的块数,不会超过361
真相重于对错 2017-01-08
  • 打赏
  • 举报
回复
不用什么链表,用几个数组即可。 盘上的一颗棋子,首先只能属于一块棋,还有它的上下左右四个方向,不过四种可能,同色,异色,空(也就是气),边界 有了这些条件,完全可以把盘上所有的棋子,划分为几块棋,依次对这几块棋判断,只要这块棋周边,包括它内部,不存在空,就提掉
真相重于对错 2017-01-08
  • 打赏
  • 举报
回复
提子算法应该围棋里面比较简单的,再复杂一点死活判断,更复杂的应该是大势判断,局部与整体利益的判断等等
misa98 2017-01-08
  • 打赏
  • 举报
回复
上次有个同学给我写了个数据结构,后来我仔细一看,是五子棋的数据结构。 而且他并没有把提子的算法说完全! 当然赵4同学的“种子填充算法”可能是现在提子的一种新方法, 但是我还是请教提子的“递归算法”? 怎么创建链表?怎么递归?
misa98 2017-01-06
  • 打赏
  • 举报
回复
实话实说,提子是围棋软件中最复杂的问题! 问题是,围棋并不是判断某一个棋子有没有气,而是判断一堆棋子有没有气, 听说围棋提子是采用递归的算法,但是具体怎么递归? 首先这个链表就不好建立,怎么创建围棋棋子的链表?
worldy 2017-01-03
  • 打赏
  • 举报
回复
引用 楼主 misa98 的回复:
谁会?这个问题比较复杂! 你只要能把围棋提子的算法说明白就行?
计算有没有气,没有气就是死棋
赵4老师 2017-01-03
  • 打赏
  • 举报
回复
搜“种子填充算法”,“扫描线种子填充算法”
bluesen 2016-12-28
  • 打赏
  • 举报
回复
和画图里面的填充算法差不多
bluesen 2016-12-28
  • 打赏
  • 举报
回复
我在20年前就写过这个算法。给你一点提示:多次扫描

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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