1、 C 语言围棋对弈程序设计用 C 语言编写一个围棋对弈棋室的程序,模仿两人对弈的过程,其中包括自动提子功能,和自动点目功能。1、围棋的一些基本常识:(1)围棋棋子的“气”见右图 1 所示黑棋 1 有 4“气” ,分别是水平方向上的左右 各有一气,垂直方向上的上下各有一气,对角上的不是它的气。图 1 棋子外“气”(2)提子(吃子) ,当下在棋盘上的棋子没有外气时便被提掉(死棋) 。图 2、打吃状态 图 3、提子图 2 中黑 1 和白 2 都只有一口外气,图 3 黑先下 7 位白 2 没有外气被提掉。图 4、倒扑提子过程 图 5 死穴图 4 演示了倒扑提子全过程,图中左上为原型,左下黑先黑 41
2、扑,右上白 64 提,右下黑 93 反提把白棋全吃掉。(3)死穴:上图 5 黑 1、3、5、7 四颗黑子中间交差点对白棋来说是死穴,白棋下不进处,但对黑棋不影响可下见图下方。2、自动提子功能实现下在棋盘上的棋子同类别的在某一方位上可能是一颗或是一片(纵横连续的) ,要实现自动提子首要的是计算清楚这些同类棋子的所有外气是多少,如果已经没有外气提掉。一颗棋子下在棋盘上最多有 4 口外气(见图 1) ,在边上有 3 气,在角上只有 2 气。在程序中对于每一颗棋子检测外气描述如下:检测棋子可能有的方向上(上、下、左、右)是否有棋子,如果有,那么在该方向上没有外气。如果在所有的方向上都有棋子,那么它在棋
3、盘上是无外气的。如果在它所有方向上没有同类棋子而且又无外气,那么该颗棋子可以提掉(见图 3) 。如果在某一方向上有同类棋子,必须计算完连在一起同类的所有外气。如果整片无外气,该片可以提掉(见图 4) 。为了方便操作,在程序中对棋子定义了数据结构:typedef structint r; /行号int c; /列号int s; /棋类别int f; /棋子存活期int q; /棋子外气数int l; /棋子队列号int n; /有无棋子QZ;QZ QiZiBF400;QZ BOXBF1919;检测棋盘上某一位置的外气实现函数:int Get_QI(int r,int c)int t=0;if(r
4、0)if(BOXBFr-1c.n=0)t+;if(r0)if(BOXBFrc-1.n=0)t+;if(c0)if(BOXBFr-1c.n=1if(r0)if(BOXBFrc-1.n=1return 0;elseif(GetListsQI(r-1,c,hq)=0)HideCircle(r-1,c,hq);ShowCircle(r,c,tq);return 0;if(r0)ShowCircle(r,c,tq);return 0;elseif(GetListsQI(r+1,c,hq)=0)HideCircle(r+1,c,hq);ShowCircle(r,c,tq);return 0;if(c0)i
5、f(BOXBFrc-1.s=tq)if(GetListsQI(r,c-1,tq)0)ShowCircle(r,c,tq);return 0;elseif(GetListsQI(r,c-1,hq)=0)HideCircle(r,c-1,hq);ShowCircle(r,c,tq);return 0;if(c0)ShowCircle(r,c,tq);return 0;elseif(GetListsQI(r,c+1,hq)=0)HideCircle(r,c+1,hq);ShowCircle(r,c,tq);return 0;BOXBFrc.n=0;DetectQi();return 0;void M
6、akeQi(int r,int c)int tq,hq,color;if(Rearabs(c)if(r!=0)k=c/r;if(r0)for(dr=0;dr0)for(dr=0;dr0)for(dr=0;dr0)for(dr=0;dr k)putpixel(x + i * 8 + k, y + j, color);void DrawCircle(int x,int y,int r,int ecolor,int fcolor)setcolor(ecolor);circle(x,y,r);setfillstyle(1,fcolor);floodfill(x,y,ecolor);void DrawW
7、indow()int i;setfillstyle(1,1);Bar(0,0,639,20,1);setfillstyle(1,7);Bar(0,20,639,479,1);setfillstyle(1,14);Bar(50,50,450,450,8);for(i=0;imy+3-Pos0)/20;c=(ht-mx+3-Pos0)/20;rm0=-1;if(ht-mx=Posc-3Line(PosQiZiBFt.c-10,PosQiZiBFt.r-10,PosQiZiBFt.c-10,PosQiZiBFt.r-6,14);Line(PosQiZiBFt.c-10,PosQiZiBFt.r-10
8、,PosQiZiBFt.c-6,PosQiZiBFt.r-10,14);Line(PosQiZiBFt.c-10,PosQiZiBFt.r-6,PosQiZiBFt.c-6,PosQiZiBFt.r-10,14);floodfill(PosQiZiBFt.c-9,PosQiZiBFt.r-9,14);setfillstyle(1,4);Line(Posc-10,Posr-10,Posc-10,Posr-6,4);Line(Posc-10,Posr-10,Posc-6,Posr-10,4);Line(Posc-10,Posr-6,Posc-6,Posr-10,4);floodfill(Posc-
9、9,Posr-9,4);int MouseInit(int Xmin,int Xmax,int Ymin,int Ymax)int retcode;union REGS regs;regs.x.ax=0;int86(51,retcode=regs.x.ax;if(retcode=0)return 0;regs.x.ax=7;regs.x.cx=Xmin;regs.x.dx=Xmax;int86(51,regs.x.ax=8;regs.x.cx=Ymin;regs.x.dx=Ymax;int86(51,return retcode;void HideMouse(MOUSEH *hw)int i,
10、j;for(i=0;imx-8+j,hw-my-8+i,hw-bfij);void MouseRead(MOUSEH *hd)union REGS r1;int dx,dy,ky;dor1.x.ax=3;int86(51,dx=r1.x.cx;dy=r1.x.dx;hd-mkey=r1.x.bx;while(dx=hd-mxHideMouse(hd);hd-mx=r1.x.cx;hd-my=r1.x.dx;void DrawMouse(MOUSEH *ht)int i,j;for(i=0;ibfij=getpixel(ht-mx-8+j,ht-my-8+i);Line(ht-mx,ht-my-
11、3,ht-mx,ht-my+3,4);Line(ht-mx-3,ht-my,ht-mx+3,ht-my,4);void Init()int i,j;for(i=0;i=10n=(Rear+1)/10;n10=n%10;n100=(Rear+1)/100;OutCh(Nbn100,8,Posc-7,Posr-2,cr);OutCh(Nbn10,8,Posc-2,Posr-2,cr);OutCh(Nbn0,8,Posc+3,Posr-2,cr);void OutNumber(int x,int y,int number,int color)char n10;sprintf(n,“%d“,numbe
12、r);setcolor(color);outtextxy(x,y,n);void DrawRect(int r,int c)int l,color;BOXBFrc.n=0;BOXBFrc.f=0;for(l=0;l0if(r0)if(BOXBFrc-1.n=0)t+;if(c0)if(BOXBFr-1c.n=1if(r0)if(BOXBFrc-1.n=1return 0;elseif(GetListsQI(r-1,c,hq)=0)HideCircle(r-1,c,hq);ShowCircle(r,c,tq);return 0;if(r0)ShowCircle(r,c,tq);return 0;
13、elseif(GetListsQI(r+1,c,hq)=0)HideCircle(r+1,c,hq);ShowCircle(r,c,tq);return 0;if(c0)if(BOXBFrc-1.s=tq)if(GetListsQI(r,c-1,tq)0)ShowCircle(r,c,tq);return 0;elseif(GetListsQI(r,c-1,hq)=0)HideCircle(r,c-1,hq);ShowCircle(r,c,tq);return 0;if(c0)ShowCircle(r,c,tq);return 0;elseif(GetListsQI(r,c+1,hq)=0)H
14、ideCircle(r,c+1,hq);ShowCircle(r,c,tq);return 0;BOXBFrc.n=0;DetectQi();return 0;void MakeQi(int r,int c)int tq,hq,color;if(Rear0)if(BOXBFr-1c.s!=BOXBFrc.s)if(GetListsQI(r-1,c,BOXBFr-1c.s)=0)HideCircle(r-1,c,BOXBFr-1c.s);if(r0)if(BOXBFrc-1.s!=BOXBFrc.s)if(GetListsQI(r,c-1,BOXBFrc-1.s)=0)HideCircle(r,c-1,BOXBFrc-1.s);if(cmx=320;hw-my=240;DrawWindow();Init();while(1)DrawMouse(hw);MouseRead(hw);if(hw-mkey=1)if(hw-mx=580OnPos(hw,Rm);if(Rm0=1MakeQi(Rm1,Rm2);OutNumber(340,6,Rear+1,15);DetectQi();MoveQI(Rm1,Rm2);if(GMove=1