鱼C论坛

 找回密码
 立即注册
查看: 1385|回复: 3

[技术交流] 比较难操作的C语言五子棋

[复制链接]
发表于 2020-9-19 21:29:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. //#define N 16

  6. char qipan[16][16];//全局变量,整个文件的都可以用
  7. int x,y;//代表的是棋盘(数组)下标为x的行 和  下标为y列的一个交点
  8. //函数声明
  9. void initQipan();//棋盘的初始化
  10. void printQipan();//打印棋盘
  11. void Pos(int x, int y);//设置光标位置
  12. void startGame();//游戏开始
  13. int panduan(int x,int y);//判断是否有人连成五子
  14. int showWhoWin();//输出谁赢了
  15. void whitePlay();//白方下子
  16. void blackPlay();//黑方下子
  17. void printShuzi();//打印数字模板



  18. void Pos(int x, int y)//设置光标位置,从哪里开始输出
  19. {
  20.     COORD pos;//表示一个字符在控制台屏幕上的坐标,左上角(0,0)
  21.     HANDLE hOutput;
  22.     pos.X = x;
  23.     pos.Y = y;
  24.     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄
  25.     SetConsoleCursorPosition(hOutput, pos);
  26. }

  27. void printShuzi()
  28. {
  29.     int i;
  30.     Pos(2,0);
  31.     for(i=0;i<16;i++)
  32.         printf("%2d",i);
  33.     for(i=0;i<16;i++)
  34.     {
  35.         Pos(0,1+i);
  36.         printf("%2d",i);
  37.     }
  38. }
  39. void initQipan()
  40. {
  41.     int i,j;
  42.     for(i=0;i<16;i++)
  43.         for(j=0;j<16;j++)
  44.             qipan[i][j]='*';
  45. }
  46. void printQipan()
  47. {
  48.     int i,j;
  49.     printShuzi();
  50.     for(i=0;i<16;i++)
  51.     {
  52.         Pos(2,1+i);//自动换行的输出的功能,代替printf("\n");
  53.         for(j=0;j<16;j++)
  54.             printf(" %c",qipan[i][j]);
  55.     }
  56. }

  57. int  panduan(int x,int y)
  58. {
  59.     char temp;//保存下棋方的颜色,w  b
  60.     int count=1;//统计个数,针对的同一个线(水平线)
  61.     int i=1;//走一格
  62.     int j=1;//和i同时用来代表走斜的
  63.     int whoWin=0;//1代表白方,2代表黑方
  64.     temp=qipan[x][y];
  65.     //水平的左边
  66.     while(temp==qipan[x][y-i]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  67.     {
  68.         i++;
  69.         count++;
  70.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  71.         {
  72.             if(temp=='W')
  73.                 whoWin=1;

  74.             else
  75.                 whoWin=2;
  76.         }
  77.     }
  78.     //水平的右边
  79.     i=1;
  80.    while(temp==qipan[x][y+i]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  81.     {
  82.         i++;
  83.         count++;
  84.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  85.         {
  86.             if(temp=='W')
  87.                 whoWin=1;

  88.             else
  89.                 whoWin=2;
  90.         }
  91.     }

  92.    //解决垂直的方向
  93.    //垂直上方
  94.    i=1;
  95.    count=1;//清理掉之前的数据
  96.    while(temp==qipan[x-i][y]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  97.     {
  98.         i++;
  99.         count++;
  100.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  101.         {
  102.             if(temp=='W')
  103.                 whoWin=1;

  104.             else
  105.                 whoWin=2;
  106.         }
  107.     }
  108.    //垂直下方
  109.    i=1;
  110.    while(temp==qipan[x+i][y]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  111.     {
  112.         i++;
  113.         count++;
  114.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  115.         {
  116.             if(temp=='W')
  117.                 whoWin=1;

  118.             else
  119.                 whoWin=2;
  120.         }
  121.     }
  122.    //解决左上的斜线  上方
  123.      i=1;
  124.      j=1;
  125.      count=1;
  126.    while(temp==qipan[x-i][y-j]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  127.     {
  128.         i++;
  129.         j++;
  130.         count++;
  131.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  132.         {
  133.             if(temp=='W')
  134.                 whoWin=1;

  135.             else
  136.                 whoWin=2;
  137.         }
  138.     }
  139.    //解决左上的斜线  下方
  140.      i=1;
  141.      j=1;
  142.    while(temp==qipan[x+i][y+j]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  143.     {
  144.         i++;
  145.         j++;
  146.         count++;
  147.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  148.         {
  149.             if(temp=='W')
  150.                 whoWin=1;

  151.             else
  152.                 whoWin=2;
  153.         }
  154.     }
  155.    //解决右上的斜线  上方
  156.      i=1;
  157.      j=1;
  158.      count=1;
  159.    while(temp==qipan[x-i][y+j]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  160.     {
  161.         i++;
  162.         j++;
  163.         count++;
  164.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  165.         {
  166.             if(temp=='W')
  167.                 whoWin=1;

  168.             else
  169.                 whoWin=2;
  170.         }
  171.     }
  172.    //解决右上的斜线  下方
  173.      i=1;
  174.      j=1;
  175.    while(temp==qipan[x+i][y-j]&&x>=0&&x<16&&y>=0&&y<15&&count<5)
  176.     {
  177.         i++;
  178.         j++;
  179.         count++;
  180.         if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
  181.         {
  182.             if(temp=='W')
  183.                 whoWin=1;

  184.             else
  185.                 whoWin=2;
  186.         }
  187.     }
  188.     return whoWin;
  189. }

  190. int showWhoWin()
  191. {
  192.     int overLeap=0;//1代表结束
  193.     int leap;//用来接收谁赢了
  194.     leap=panduan(x,y);
  195.     if(leap==1)
  196.     {
  197.         overLeap=1;
  198.         system("cls");
  199.         printQipan();
  200.         printf("\n白方胜利\n");
  201.         system("pause");
  202.     }
  203.     if(leap==2)
  204.     {
  205.         overLeap=1;
  206.         system("cls");
  207.         printQipan();
  208.         printf("\n黑方胜利\n");
  209.         system("pause");
  210.     }
  211.     return overLeap;
  212. }

  213. void whitePlay()
  214. {
  215.     printf("\n请白方落子,按下行与列的坐标:");
  216.     scanf("%d%d",&x,&y);//坐标的值
  217.     while(1)//解决一直下错子的问题
  218.     {
  219.         if(qipan[x][y]=='*')//下子的地方没有其他子
  220.         {
  221.              qipan[x][y]='W';
  222.              //解决while(1)
  223.              break;
  224.         }
  225.         else
  226.         {
  227.             printf("您下子错误\n");
  228.             printf("请白方落子,按下行与列的坐标:");
  229.             scanf("%d%d",&x,&y);//坐标的值
  230.         }

  231.     }
  232.     printQipan();   

  233. }
  234. void blackPlay()
  235. {

  236.     printQipan();
  237.     printf("\n请黑方落子,按下行与列的坐标:");
  238.     scanf("%d%d",&x,&y);//坐标的值
  239.         while(1)//解决一直下错子的问题
  240.     {
  241.         if(qipan[x][y]=='*')//下子的地方没有其他子
  242.         {
  243.              qipan[x][y]='B';
  244.              //解决while(1)
  245.              break;
  246.         }
  247.         else
  248.         {
  249.             printf("您下子错误\n");
  250.             printf("请黑方落子,按下行与列的坐标:");
  251.         }
  252.         scanf("%d%d",&x,&y);//坐标的值

  253.     }
  254.     printQipan();

  255. }
  256. void startGame()
  257. {
  258.     initQipan();
  259.     printQipan();
  260.     while(1)
  261.     {
  262.         whitePlay();
  263.         if(showWhoWin()==1)//system("pause");
  264.              break;
  265.         system("cls");//清理屏幕,是屏幕上的字不重复
  266.         blackPlay();
  267.         if(showWhoWin()==1)//system("pause");
  268.              break;
  269.         system("cls");
  270.         printQipan();
  271.     }
  272.     printf("您是否重新游戏:y  or n");
  273.     if(getch()=='n')
  274.     {
  275.         system("cls");
  276.         printf("游戏结束\n");
  277.         exit(0);//因为程序终止
  278.     }
  279.     if(getch()=='y')
  280.     {
  281.         system("cls");
  282.         startGame();
  283.     }

  284. }
  285. int main()
  286. {
  287.     startGame();
  288.     return 0;
  289. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-19 21:32:08 | 显示全部楼层
这帖子能申精吗?4小时写出来的....@不二如是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 08:28:51 | 显示全部楼层
鱼的七秒记忆 发表于 2020-9-19 21:32
这帖子能申精吗?4小时写出来的....@不二如是

内容还需要更多讲解,回帖量也少了一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 10:15:09 | 显示全部楼层
不二如是 发表于 2020-9-20 08:28
内容还需要更多讲解,回帖量也少了一些

申精需要多少回帖,想先了解下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表