不一样的围棋问题:

棋子:

typedef struct node{int x;    //x,y表示位置int y;int dot;    //-1代表黑子,1代表白子,0代表空子;int gas;    //气struct node *block;    //指向块头,块头指向自己;
} Node; 

块:

        上下左右相连的同一类型的棋子的整体叫做块,每一块中只有一颗棋子可以作为块头;

棋子的气:

棋盘举阵中棋子的上下左右四个方向上可以下棋子的位置的数量,一颗棋子的气最大为4,最小为0;

块的气:

块的周围方向上可以下棋子的位置的数量,块的周围方向只能是块中棋子的上下左右方向;例如:一个由两个并排下的棋子组成的块,它的气最大为6;

提子:

当某颗棋子(或块)被其它类型的棋子包围时(即气=0时),该棋子(或块)就要被提掉;

判断胜负:

黑白两方被提子数少的一方胜出,被提子数相同的情况下,哪一方留在棋盘上的棋子(块)的气多,哪一方胜出,都相等则平局;

#include<stdio.h>
#include<stdlib.h>
#define null 0 typedef struct node{int x;int y;int dot; //-1代表黑子,1代表白子,0代表空子;int gas;struct node *block;   //指向块头,块头指向null;
} Node; Node *Box[10][10];
int Bh[100]={0};   //为1表示块头,0表是不是;
int Rc[100]={0};   //为1表示被记录过,0表是没有;
int sumB=0;        //记录黑子提子数
int sumW=0;        //记录白字提子数 void initBox(){       //初始化棋盘; int i,j;for(i=0;i<10;i++){for(j=0;j<10;j++){node *r=(node *)malloc(sizeof(node));r->x=i;r->y=j;r->dot=0;r->block=null;if((i==0 && j==0) || (i==0 && j==9)|| (i==9 && j==0) || (i==9 && j==9)) r->gas=2;    //棋盘四角的子气为2  else if((i==0 || j==0) || (i==9 || j==9)) r->gas=3;    //棋盘边上的子气为3 else r->gas=4;  //棋盘中部的子 气为4 Box[i][j]=r;}}
}int GetgasI(node *p,int flag){ //flag==0 表示求棋盘中某颗子的气,否则求某块中某颗子的气 ; int x=p->x,y=p->y;int gas=0;if(flag==0){ //求棋盘中某颗子的气if(x>0){if(Box[x-1][y]->dot==0) gas++;}if(x<9){if(Box[x+1][y]->dot==0) gas++;}if(y>0){if(Box[x][y-1]->dot==0) gas++;}if(y<9){if(Box[x][y+1]->dot==0) gas++;}return gas;}else{      //求某块中某颗子的气if(x>0){if(Box[x-1][y]->dot==0 && Rc[(x-1)*10+y]==0){gas++;Rc[(x-1)*10+y]=1;  //找到一个位置并记录,防止二次查找; }}if(x<9){if(Box[x+1][y]->dot==0 && Rc[(x+1)*10+y]==0){gas++;Rc[(x+1)*10+y]=1; }}if(y>0){if(Box[x][y-1]->dot==0 && Rc[x*10+y-1]==0){gas++;Rc[x*10+y-1]=1; }}if(y<9){if(Box[x][y+1]->dot==0 && Rc[x*10+y+1]==0){gas++;Rc[x*10+y+1]=1; }}return gas;}}int GetgasII(node *p){ //求某块的气 int i,j;int gas=0;for(i=0;i<9;i++){for(j=0;j<9;j++){if(Box[i][j]->block==p) gas+=GetgasI(Box[i][j],1);}}gas+=GetgasI(p,1);for(int k=0;k<100;k++) Rc[k]=0;  //找气完毕,清楚记录; return gas;
}void Getbh(){  //找块头,块中棋子都指向块头,找到块头即找到块 for(int k=0;k<100;k++) Bh[k]=0; //找块头前,先清空原有块头 int i,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(Box[i][j]->block==null  && Box[i][j]->dot!=0) Bh[i*10+j]=1;}}
}void Pop(node *p){ //提子 if(p->dot==0) return ;if(p->block!=null) return ;Bh[(p->x)*10+p->y]=0;//提块中的子 int i,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(Box[i][j]->block==p){if(Box[i][j]->dot==1){sumW++;printf("提白子(%d,%d)成功!\n",i,j);}else{sumB++;printf("提黑子(%d,%d)成功!\n",i,j);}Rc[i*10+j]=0;Box[i][j]->dot=0;Box[i][j]->block=null;}}}//提块头的子 int x=p->x,y=p->y;if(Box[x][y]->dot==1){sumW++;printf("提白子(%d,%d)成功!\n",x,y);}else{sumB++;printf("提黑子(%d,%d)成功!\n",x,y);}Rc[x*10+y]=0;Box[x][y]->dot=0;Box[x][y]->block=null;
}void RefBox(){ //刷新棋盘,每下入一颗棋子,刷新一次棋盘 Getbh();    //刷新块头 node *p;int i,j,k;for(i=0;i<9;i++){for(j=0;j<9;j++){Box[i][j]->gas=GetgasI(Box[i][j],0); //刷新每颗子的气; }}for(k=0;k<100;k++){      //刷新每块的气,块头子的gas值表示该块的气; if(Bh[k]==1){p=Box[k/10][k%10];p->gas=GetgasII(p);if(p->gas==0) Pop(p);      //提掉气为0的块 }}Getbh();    //二次刷新块头,因为有些块头被提掉了
}void Playchess(){  //下子 int x,y,z;scanf("%d %d %d",&x,&y,&z);        //x,y为棋子的位置,z为棋子的类别 while(z!=0){node *p=Box[x][y];if(p->dot!=0) printf("此处有子,下子失败!\n");else{p->dot=z;if(GetgasI(p,0)==0){p->dot=0;printf("死穴,下子失败!\n");}else{p->gas=GetgasI(p,0);if(p->gas==4){        //气为4,说明上下左右无子 ;p->block=null;printf("块头(%d,%d)\n",p->x,p->y);}else{node *q=null;if(x>0){if(Box[x-1][y]->dot==z) q=Box[x-1][y];}if(x<9){if(Box[x+1][y]->dot==z) q=Box[x+1][y];}if(y>0){if(Box[x][y-1]->dot==z) q=Box[x][y-1];}if(y<9){if(Box[x][y+1]->dot==z) q=Box[x][y+1];}if(q==null){     //q为null,说明上下左右有子但无同类子 ;p->block=null;printf("块头(%d,%d)\n",p->x,p->y);}else{if(q->block==null) p->block=q;else p->block=q->block;}}if(p->dot==1)printf("下白子(%d,%d)成功!\n",p->x,p->y);else printf("下黑子(%d,%d)成功!\n",p->x,p->y);}}RefBox();scanf("%d %d %d",&x,&y,&z);}
}void Judge(){  //判断胜负 int sumBG=0,sumWG=0;if(sumW>sumB) printf("白:黑(子)(%d : %d),黑子胜!\n",sumW,sumB);    //被提子少的一方胜出 else if(sumW<sumB) printf("白:黑(%d : %d),白子胜!\n",sumW,sumB);else{for(int i=0;i<100;i++){if(Bh[i]==1){node *p=Box[i/10][i%10];if(p->dot==1) sumWG+=GetgasII(p);else sumBG+=GetgasII(p);}}if(sumWG>sumBG) printf("白:黑(气)(%d : %d),白子胜!\n",sumWG,sumBG); //被提子数一样的情况下,气多的一方胜出 else if(sumWG<sumBG) printf("白:黑(气)(%d : %d),黑子胜!\n",sumWG,sumBG);else printf("白:黑(子)(%d : %d),白:黑(气)(%d : %d),平局!\n",sumW,sumB,sumWG,sumBG);}printf("\n \n");
} void PrintBox(){  //打印棋盘 int i,j;node *r;for(i=0;i<10;i++){for(j=0;j<10;j++){r=Box[i][j];printf("(%d,%d,%d[%d])  ",r->x,r->y,r->dot,r->gas);}printf("\n");}
}int main(){initBox();Playchess();Judge();PrintBox();return 0;
}

运行结果:

不一样的围棋问题(C语言)相关推荐

  1. 用C语言实现SGF格式围棋棋谱解析器

    这是本人(liigo)独立实现的SGF格式围棋棋谱文件解析器,本文介绍其实现细节.网络上肯定可以找到完善的开源的SGF解析器,这是毋庸置疑的,我不直接使用它们,也不参考它们的实现代码,而是自己独立编码 ...

  2. c语言围棋对弈程序设计,C语言围棋对弈程序设计.doc

    C语言围棋对弈程序设计 用C语言编写一个围棋对弈棋室的程序,模仿两人对弈的过程,其中包括自动提子功能,和自动点目功能. 1.围棋的一些基本常识: (1)围棋棋子的"气" 见右图1所 ...

  3. c语言围棋对弈程序设计,C语言围棋对弈程序设计(59页)-原创力文档

    C语言围棋对弈程序设计 用C语言编写一个围棋对弈棋室的程序,模仿两人对弈的过程,其中包括自动提子功能,和自动点目功能. 1.围棋的一些基本常识: (1)围棋棋子的"气" 见右图1所 ...

  4. c语言围棋程序代码,围棋编程C++或C语言.doc

    围棋编程C或C语言 #include"stdio.h" void Way_1(int x[19][19],int i,int j) //(i,j) 为白子落子位置 { if(i&g ...

  5. python围棋程序在屏幕上找棋盘_用C语言编程 在屏幕上显示围棋棋盘

    展开全部 -- 以怎么不用 MS VC++6 ?? 编C语言一般都用啊 还有\xCD是C语言 Ascii代码 表示一个图形 用循环32313133353236313431303231363533e58 ...

  6. c语言围棋原理,围棋中的数学原理

    围棋是我国传统"四艺"之一,文献所载可以追溯到春秋战国时期.如今,围棋已经变成国际通行的棋种.可是你知道吗,围棋不仅是我国的文化遗产,其中还隐藏着很多有趣的数学小知识. (1)&q ...

  7. C语言字符串围棋盘放麦粒,围棋高手(民间)用C编写的围棋程序。

    围棋高手(民间)用C编写的围棋程序. #include void main() { int n,m,x,y,temp,j=0,i=0 ; printf("输入棋盘的横格数,竖格数:\n&qu ...

  8. c语言围棋ai算法代码,晒晒围棋代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 for(;first!=last;++first) { int x = first->first, y = first->second; bo ...

  9. AI一分钟 | 柯洁战胜AI“求报道”,期待正式与围棋AI下让子棋;小米MIUI 10全面启动,主打人工智能人机交互

    一分钟AI 柯洁战胜AI求报道 称与zero下差距不会超过3子 小米MIUI 10全面启动 主打人工智能人机交互 AI医药研发公司晶泰科技完成1500万美元B轮融资,红杉领投,谷歌跟投,腾讯追加投资 ...

最新文章

  1. CSDN实现自动点赞
  2. 动态获得资源的路径大小写问题
  3. nsswitch.conf文件详解
  4. MySQL-查询结果缓存
  5. bios设置_大白菜U盘启动BIOS设置教程
  6. 循环-20. 猜数字游戏(15)
  7. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的企业员工考勤管理系统
  9. aspen plus v11使用教程_Aspen Plus11.0安装教程
  10. python diango 增删改查_python中关于django对数据库Mysql的增删改查操作详解
  11. 10 分钟实现 Spring Boot 发送邮件功能
  12. Python 爬虫案例
  13. Hadoop大数据简介
  14. 解决想从证书导出p12文件但是该证书中没有密码无法导出P12文件的问题
  15. 禁止在计算机上玩电子游戏,如何禁止孩子玩电脑游戏防止过度沉迷影响学习成绩...
  16. 破解新浪微博js加密登陆超详细
  17. GSAP动画效果三——3D动画
  18. 龙芯源码编译mysql_龙芯服务器安装总结
  19. 图片与视频的相互转换
  20. OpenCV_车辆检测实战

热门文章

  1. 朴素贝叶斯分类(上):如何让机器判断男女?
  2. 为什么说支付宝推出余额宝值得赞赏?
  3. Anaconda下pytorch的详细安装步骤
  4. Android packages Android常见APP对应包名
  5. 下载pytorch0.4版本方法
  6. java galgame 手机,galgame模拟器安卓下载-galgame手机模拟器下载 v1.97-说说手游网
  7. 晗枫emlog仿小刀网修复版模板
  8. 异常:non-compatible bean definition of same name and class【com.xxx.xxx.XXX】
  9. MySQL各版本下载
  10. 反应迟钝的 Resin