




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电脑围棋程序编写思路荷蒲 荷蒲围棋软件的编写思路。在围棋程序的实现中,较为关键的是围棋电子棋盘的设计。其他所有功能都是围绕围棋电子棋盘展开的。电子围棋盘的核心是围棋棋盘的数据描述。 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
2、 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、暂停,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 CurrentWh
4、o1; /备份上一次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;
5、 /默认电脑执黑先行 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;
6、qipanij.zt=0; /清空棋谱记录,全部设为无效点。QiPu0x留作它用 for (int i=0;i<500;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的棋子应当从棋盘上拿掉。 围棋气数的计算问题,应当说是围棋软件的核心问题。 “
7、气”是指棋子在棋盘上可以连接的交叉点,也是棋子的出路。 围棋的气数计算,要考虑一个围棋子的连通问题。 下面的图形中,交叉点的X代表棋子的气, 图1 图1中右上角的黑子,有两个交叉点和它的直线相接,因此它有两口气。左上角的黑子有三口气,而下边的黑子有四口气。 图2 图2中右边的黑子有四口气,中间连接在一起的两个黑子有六口气,而右边连接在一起的三个黑子有八口气。连接在一起的棋子越多,气也越多。 图3 图2中同样是四个连接在一起的黑子,左边的四个黑棋有十口气,中间的黑棋只有九口气,而右边的黑棋仅有八口气。 从上面分析,可以得出,计算一个棋子的气,还有分析该棋子周围的情况,因此我们利用递归函数来解决围
8、棋气数的计算。实现方法看下面程序断。 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=已计算,避免重复计算同一个子的
9、气 int goqi; /气数 /以上变量声明为全局变量 void str_qi(int x,int y,int hb) /本函数计算 x,y 处的hb颜色棋子的气 gozixy=1; /标记本子已经计算过气 /右临子 if (x+1<=19)/如果没有超出棋盘边线 if (gox+1y=2)&&(gokongx+1y=0) /如果右临点为空并且该点未曾计算过气则 goqi+; /气数加一 gokongx+1y=1; /标记本空点已经计算过气 else if (gox+1y=hb)&&(gozix+1y=0) /否则如果右临点为
10、和本子同色子并且该子未曾计算过气则 str_qi(x+1,y,hb); /递归调用到右临子 /左临子 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)/如果没有超出棋盘
11、边线 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+; /气数加
12、一 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;
13、/串气初值 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、围棋的提
14、子(吃子) 提子:就是把没有气的棋子从棋盘上拿掉。 下面函数实现提子功能。 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;
15、 围棋程序设计的核心,基本完成,下面是输赢的判断问题。 6、围棋胜负判断 围棋盘上共有三百六十一个交叉点,一盘棋的胜负就是由对局双方所占据的交叉点的多少所决定的。更精确地说就是由双方活棋所占据的地域的大小来决定的。一个交叉点为一子,每方以一百八十又二分之一子为归本数,超过此数者为胜,不足此数者为负。 按我国现行的围棋规则规定,由于黑棋先走,有一定的先手威力,应由执黑的一方贴出2(34)子。所以黑所占的地域必须超过183(14)子(180 (12)2(34)才能取胜。比如黑棋数出来有185个子,即黑棋1(34)子。而白方的地域只要超过177(34)子(180(12)2(34)即可获
16、胜。 图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) su
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亭湖中考模拟考试题目及答案
- 田径2期末考试题及答案
- 数字化渲染与建筑设计表达-洞察及研究
- 2025年公职人员考试时事政治考试题库(附答案)
- 高中学校巡课工作方案
- 虚拟模块仓库管理办法
- qc质量改善管理办法
- 中国铁塔工程管理办法
- 上海工程招标管理办法
- 人身险代理人管理办法
- 2023-2025年中考语文试题分类汇编:记叙文阅读(辽宁专用)解析版
- 2025年公路检测工程师《水运结构与地基》试题及答案
- 2025年教科版新教材科学三年级上册全册教案设计(含教学计划)
- 从+“心”+出发遇见更好的自己-开学第一课暨心理健康教育主题班会-2025-2026学年高中主题班会
- 隔爆水棚替换自动隔爆装置方案及安全技术措施
- 2025年苏教版新教材数学二年级上册教学计划(含进度表)
- 叙事医学培训课件
- 催产素引产术的护理PPT课件
- 2022年会计师事务所预算管理制度
- 车辆使用完全手册
- 林地恢复施工组织设计方案
评论
0/150
提交评论