




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电脑围棋程序编写思路荷蒲 荷蒲围棋软件的编写思路。在围棋程序的实现中,较为关键的是围棋电子棋盘的设计。其他所有功能都是围绕围棋电子棋盘展开的。电子围棋盘的核心是围棋棋盘的数据描述。 1、首先定义围棋子信息: #define EDGE 23/棋盘最大格数 #define MAXMM 500 /最大手数 /color表示棋子颜色,x,y表示在棋盘上的坐标 /num表示下子的顺序。=0表示提前摆放的子。 /zt 表示棋子状态 /qs 表示棋子的气数 /sm 表示有说明信息 typedef struct qizi int color,x,y,num,zt,qs,sm; qizi; qizi qipuMAXMM; /棋谱信息 qizi qipanEDGEEDGE; /棋盘信息 2、紧接着要考虑的是下棋相关信息。 int nk=0; /显示棋子序号,nk=2显示序号,1=气数 int BoardLines=19; /棋盘线数,默认19 bool ComputerPlaying; /1=该计算机下 0=人下 bool Computerp1=0; /1=计算机下黑 0=人下 bool Computerp2=0; /1=计算机下白 0=人下 int PlayType=0; /2=人-人,1=人-计算机,13=人-网络,0=没有开始,-1=删除棋盘上死子,-2=暂停,3=布黑子,4=布白子,9=演示,11=学习 int PlayType1=0; /2=人-人,1=人-计算机,13=人-网络,0=没有开始,-1=删除棋盘上死子,-2=暂停,3=布黑子,4=布白子,11=学习 int MoveCount,MoveCount1; /计步器,记录落子手数,自然顺序 int Playnum=0,Playnum1=0; /要标识的围棋手数,下棋顺序 int CurrentX; /记录热子X坐标, int CurrentY; /记录热子Y坐标 char CurrentWho; /记录当前棋子颜色,0=黑 1=白 2=空(终局等,待写) char CurrentWho1; /备份上一次CurrentWho int timew=0,timeb=0; /计时器设定数据 int sdy1=0,sdy2=0; /学习功能上使用 int gz; /规则0=中国规则,1=日本规则,2=应氏规则 bool plays1=true; /学习持黑 bool plays2=false; /学习持白 3、围棋电子棋盘的数据初始化。 /数据初始化 void wqinit(void) BoardLines=19; /19X19路标准围棋盘 MoveCount=0; /一步棋未下,自然顺序 MoveCount1=0; /一步棋未下 ComputerPlaying=1; /默认电脑执黑先行 CurrentWho=0; /默认黑先; 黑方=0;白方=1;空方=2; CurrentX=0; /当前一步棋的X坐标,水平从左至右为1.19 CurrentY=0; /当前一步棋的Y坐标,垂直从上到下为1.19 timew=0,timeb=0; Playnum=0; /下棋顺序 Playnum1=0; /下面是棋盘初始化 for (int i=0;i=BoardLines;i+) for (int j=0;j=BoardLines;j+) qipanij.color=2; qipanij.x=0; qipanij.y=0; qipanij.num=0; qipanij.zt=0; /清空棋谱记录,全部设为无效点。QiPu0x留作它用 for (int i=0;i500;i+) qipui.color=2; qipui.x=0; qipui.y=0; qipui.num=0; qipui.zt=0; qipui.sm=0; qpsm1i.n=0; qpsm1i.t=0; strcpy(qpsm1i.sm,/); 4、根据围棋规则编写的一些相关处理函数模块 围棋棋子的吃子,是根据围棋棋子的气数来计算的。气数为0的棋子应当从棋盘上拿掉。 围棋气数的计算问题,应当说是围棋软件的核心问题。 “气”是指棋子在棋盘上可以连接的交叉点,也是棋子的出路。 围棋的气数计算,要考虑一个围棋子的连通问题。 下面的图形中,交叉点的X代表棋子的气, 图1 图1中右上角的黑子,有两个交叉点和它的直线相接,因此它有两口气。左上角的黑子有三口气,而下边的黑子有四口气。 图2 图2中右边的黑子有四口气,中间连接在一起的两个黑子有六口气,而右边连接在一起的三个黑子有八口气。连接在一起的棋子越多,气也越多。 图3 图2中同样是四个连接在一起的黑子,左边的四个黑棋有十口气,中间的黑棋只有九口气,而右边的黑棋仅有八口气。 从上面分析,可以得出,计算一个棋子的气,还有分析该棋子周围的情况,因此我们利用递归函数来解决围棋气数的计算。实现方法看下面程序断。 int goEDGEEDGE; /*表示棋盘 其中第0路和第20路为沉余数据 在 (X,Y)下黑子 goxy=0;/ 0表示黑 在 (X,Y)下白子 goxy=1;/ 1表示白子 在 (X,Y)提子 goxy=2; /2表示空子 当前棋步脱先pass则 当前棋步 X坐标=0,y=0 否则 1=x=19, 1=x=19, */ int gokongEDGEEDGE; /0=该空点未曾计算过气,1=已计算,避免重复计算公气 int goziEDGEEDGE; /0=该子未计算串气,1=已计算,避免重复计算同一个子的气 int goqi; /气数 /以上变量声明为全局变量 void str_qi(int x,int y,int hb) /本函数计算 x,y 处的hb颜色棋子的气 gozixy=1; /标记本子已经计算过气 /右临子 if (x+1=1) /果没有超出棋盘边线 if (gox-1y=2)&(gokongx-1y=0) /如果左临点为空并且该点未曾计算过气则 goqi+; /气数加一 gokongx-1y=1; /标记本空点已经计算过气 else if (gox-1y=hb)&(gozix-1y=0) /否则如果左临点为和本子同色子并且该子未曾计算过气则 str_qi(x-1,y,hb); /递归调用到左临子 /下临子 if (y-1=1)/如果没有超出棋盘边线 if (goxy-1=2)&(gokongxy-1=0) /如果下临点为空并且该点未曾计算过气则 goqi+; /气数加一 gokongxy-1=1; /标记本空点已经计算过气 else if (goxy-1=hb)&(gozixy-1=0) /否则如果下临子点为和本子同色子并且该子未曾计算过气则 str_qi(x,y-1,hb); /递归调用到下临子 /上临点 if (y+1=19)/如果没有超出棋盘边线 if (goxy+1=2)&(gokongxy+1=0) /如果上临点为空并且该点未曾计算过气则 goqi+; /气数加一 gokongxy+1=1; /标记本空点已经计算过气 else if (goxy+1=hb)&(gozixy+1=0) /否则如果上临点为和本子同色子并且该子未曾计算过气则 str_qi(x,y+1,hb); /递归调用到上临子 int str_lib(int x,int y, int hb) int i,j; for (i = 1; i = 19; i+) for (j = 1; j = 19; j+) goziij = 0; /初始化变量,表示该子未计算串气 gokongij = 0; /初始化变量,表示该空点未计算串气 goqi=0; /串气初值 str_qi(x,y,hb); /调用串气子程序 return(goqi); /全局变量goqi带回串气值 void shuanqi(void) int i,j,cc,qq; for (i = 1; i =19; i+) for (j = 1; j = 19; j+) goij=qipanij.color; for (i = 1; i =19; i+) for (j = 1; j =19; j+) if (goij!=2) cc=goij; qq=str_lib(i,j,cc); qipanij.qs=qq; 5、围棋的提子(吃子) 提子:就是把没有气的棋子从棋盘上拿掉。 下面函数实现提子功能。 void chizi(void) int i,j,qq,cc; shuanqi(); for (i = 1; i =19; i+) for (j = 1; j = 19; j+) qq=qipanij.qs; cc=qipanij.color; if (qq=0 & cc!=2 & cc!=CurrentWho) qipanij.color=2; qipanij.x=i; qipanij.y=j; qipanij.num=0; qipanij.zt=0; 围棋程序设计的核心,基本完成,下面是输赢的判断问题。 6、围棋胜负判断 围棋盘上共有三百六十一个交叉点,一盘棋的胜负就是由对局双方所占据的交叉点的多少所决定的。更精确地说就是由双方活棋所占据的地域的大小来决定的。一个交叉点为一子,每方以一百八十又二分之一子为归本数,超过此数者为胜,不足此数者为负。 按我国现行的围棋规则规定,由于黑棋先走,有一定的先手威力,应由执黑的一方贴出2(34)子。所以黑所占的地域必须超过183(14)子(180 (12)2(34)才能取胜。比如黑棋数出来有185个子,即黑棋1(34)子。而白方的地域只要超过177(34)子(180(12)2(34)即可获胜。 图4 下面函数实现计算围棋的地域功能。在计算前,应当先去掉围棋中的死子。 / 计算围棋的地域 int sum3; /sum0=黑子数量,sum1=白子数量 int summ(void) int i=0,j=0,c=2,k=2; sum0=0; sum1=0; sum2=0; for (i=1;i=19;i+) k=qipani1.color; for (j=1;j=19;j+) c=qipanji.color; switch (c) case 2: if (k=2) sum2+; else sumk+; break; case 0: if (k=0) sumc+; else if(k=2) sumc=sumc+sum2+1; k=c; sum2=0; else if(k=1) sumc+; k=c; sum2=0; break; case 1: if (k=1) sumc+; else i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 9.2 金属的化学性质说课稿-2024-2025学年九年级化学鲁教版(2024)下册
- 《“爱拼才会赢”》实践课教学设计
- 国有土地使用权转让合同
- 第5课 古代非洲与美洲 教学设计- 2023-2024学年高一下学期统编版(2019)必修中外历史纲要下
- 自考本科传播学概论课件
- 中医试题及答案03
- 双语商务英语合同终止协议及后续技术支持协议
- 信托投资公司外汇借款利率调整及风险管理合同
- 高新技术园区物业前期全面服务合同
- 餐饮企业厨师长全面承包运营合同
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T31011-2024)
- 2025年综合类-殡葬资格考试-殡葬服务历年真题摘选带答案(5卷100道集锦-单选题)
- 写字楼招商管理办法
- 小学生AI科普课件
- DGJ08-70-2021 建筑物、构筑物拆除技术标准
- 老师每年体检管理制度
- 矿山爆破施工管理制度
- GCP质量控制培训课件
- 肺康复指南科普讲课件
- 煤矿目视化管理制度
- 合作利润分成合同协议书
评论
0/150
提交评论