c语言程序设计大作业吧 关注:46贴子:147

C语言大作业之五子棋游戏设计

只看楼主收藏回复

本人前段时间设计了一个五子棋c语言程序,代码全部是自己手敲的,在此分享给大家一下,有什么不足的地方希望大家指正



IP属地:湖北1楼2020-12-27 15:15回复
    首先是使用说明:


    IP属地:湖北2楼2020-12-27 15:16
    回复
      接下来就把我定义的一些函数和他们的功能给大家分享一下:
      1.这些是结构体和全局变量
      //棋子节点
      typedef struct stu
      {
      int x;//棋子横坐标
      int y;//棋子纵坐标
      int z;//z=1表示该节点为白子,z=2表示该节点为黑子
      }stu;
      typedef struct s
      {
      char name[20];//玩家姓名
      int number;//赢的场次数
      }s;
      stu arr[200];//存放棋子情况的结构体数组
      s prr[100];//存放玩家信息的结构体数组
      int brr[21][21];//存放棋盘每个位置情况的结构体数组
      int sum=0;//棋子数量
      int num=0;//玩家数量
      void huiqi(int sum,stu*arr);
      int panduan(int a,int sum,stu*arr);


      IP属地:湖北3楼2020-12-27 15:17
      回复
        2.
        //主菜单
        void zhucaidan()
        {
        int a=31,i;
        for(i=0;i<=a;++i)
        printf("#");
        printf("\n# 欢迎来到五子棋游戏 #");
        printf("\n#------------------------------#");
        printf("\n# 1、系统说明 #");
        printf("\n# 2、开始游戏 #");
        printf("\n# 3、排行榜 #");
        printf("\n# 0、退出 #");
        printf("\n# #\n");
        for(i=0;i<=a;++i)
        printf("#");
        printf("\n请选择:");
        }


        IP属地:湖北4楼2020-12-27 15:17
        回复
          3.
          //系统说明菜单
          void xitongshuoming()
          {
          int a=36,i;
          for(i=0;i<=a;++i)
          printf("#");
          printf("\n# 系统说明 #");
          printf("\n#-----------------------------------#");
          printf("\n# 本游戏为玩家对战游戏,双方玩家可 #");
          printf("\n# 通过w、s、a、d进行上下左右移动, #");
          printf("\n# 按回车键落子,按空格键悔棋。需要 #");
          printf("\n# 注意的是:每个玩家在每次落子后只 #");
          printf("\n# 能悔一步棋,最先连成五子的玩家获 #");
          printf("\n# 胜,祝您玩的开心!! #");
          printf("\n# #\n");
          for(i=0;i<=a;++i)
          printf("#");
          printf("\n");
          system("pause");
          }


          IP属地:湖北5楼2020-12-27 15:18
          回复
            4.
            //在指定位置输出函数
            void gotoxy(int x,int y)
            {
            COORD coord={x,y};
            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
            }


            IP属地:湖北6楼2020-12-27 15:18
            收起回复
              5.
              //棋盘函数
              void Draw()
              {
              // 画棋盘
              int i,j;
              for(i=1;i<=MAX;++i)
              {
              for(int j=1;j<=MAX;++j)
              {
              if(i==1)
              {
              if(j==1)
              printf("┏ ");
              else if(j==MAX)
              printf("┓ \n");
              else if(j%2)
              printf("┳ "); // 横向占两个坐标位,竖向占一个坐标位
              else
              printf("━ ");
              }
              else if(i==MAX)
              {
              if(j==1)
              printf("┗ ");
              else if(j==MAX)
              printf("┛ \n");
              else if(j%2)
              printf("┻ ");
              else
              printf("━ ");
              }
              else
              {
              if(j==1)
              {
              if(i% 2)
              printf("┣ ");
              else
              printf("┃ ");
              }
              else if(j==MAX)
              {
              if(i% 2)
              printf("┫ \n");
              else
              printf("┃ \n");
              }
              else
              {
              if(i%2)
              {
              if(j%2)
              printf("╋ ");
              else
              printf("━ ");
              }
              else
              {
              if(j%2)
              printf("┃ ");
              else
              printf(" ");
              }
              }
              }
              }
              }
              //棋盘数组初始化
              for(i=0;i<21;i++)
              for(j=0;j<21;j++)
              brr[i][j]=0;//起初棋盘所有位置都为空
              }


              IP属地:湖北7楼2020-12-27 15:18
              回复
                6.
                //下棋操作
                int xiaqi(int sum,stu*arr)
                {
                int x=40,y=20,i,mark,kk=1;//开始时棋盘光标位置,mark表示该位置是否有棋子,kk表示是否允许悔棋
                char b;//获得用户输入字符
                while(1)
                {
                gotoxy(x,y);
                b=getch();
                //是否悔棋
                if(b==' ')
                {
                if(kk)
                {
                gotoxy(100,20);
                printf("无法悔棋!!\n");
                Sleep(300);//延时
                gotoxy(100,20);//覆盖掉错误提示信息
                printf(" ");
                continue;
                }
                else
                {
                huiqi(sum,arr);
                kk=1;//每次悔棋后设置kk为1,不允许再次悔棋直到下一次落子后
                arr[sum-1].x=0;
                arr[sum-1].y=0;
                arr[sum-1].z=0;
                brr[arr[sum-1].y/2][arr[sum-1].x/4]=0;//更新棋盘数组
                sum--;
                continue;
                }
                }
                //是否落子
                if(b=='\r')
                {
                mark=0;
                //落子前先判断该位置有没有棋子
                for(i=0;i<sum;i++)
                {
                if(arr[i].x==x&&arr[i].y==y)
                {
                gotoxy(100,20);
                printf("该位置已有棋子!!\n");
                Sleep(300);//延时
                gotoxy(100,20);//覆盖掉错误提示信息
                printf(" ");
                mark=1;
                break;
                }
                }
                //该位置已有棋子则结束本次落子操作
                if(mark)
                continue;
                //没有棋子则可以落子
                if(sum%2==0)
                {
                printf( "●" );
                //记录下白子的坐标和颜色信息
                arr[sum].x=x;
                arr[sum].y=y;
                arr[sum].z=1;
                brr[arr[sum].y/2][arr[sum].x/4]=1;//更新棋盘数组
                sum++;
                //落子后判断白子是否赢
                if(sum>8)
                {
                if(panduan(1,sum,arr))
                {
                gotoxy(100,20);
                printf("白子获胜!!\n");
                gotoxy(0,44);
                system("pause");
                return 1;
                }
                }
                kk=0;//每次落子后令kk=0,允许悔棋
                continue;
                }
                else
                {
                printf( "○" );
                //记录下黑子的坐标和颜色信息
                arr[sum].x=x;
                arr[sum].y=y;
                arr[sum].z=2;
                brr[arr[sum].y/2][arr[sum].x/4]=2;//更新棋盘数组
                sum++;
                //落子后判断黑子是否赢
                if(sum>8)
                {
                if(panduan(2,sum,arr))
                {
                gotoxy(100,20);
                printf("黑子获胜!!\n");
                gotoxy(0,44);
                system("pause");
                return 2;
                }
                }
                kk=0;//每次落子后令kk=0,允许悔棋
                continue;
                }
                }
                //若不落子而是上下左右移动
                //判断是否来到棋盘边缘
                if(x==0&&(b=='a'||b=='A'))
                continue;
                else if(x==80&&(b=='d'||b=='D'))
                continue;
                else if(y==0&&(b=='w'||b=='W'))
                continue;
                else if(y==40&&(b=='s'||b=='S'))
                continue;
                //上下左右移动
                if(b=='w'||b=='W')
                y-=2;
                else if(b=='s'||b=='S')
                y+=2;
                else if(b=='d'||b=='D')
                x+=4;
                else if(b=='a'||b=='A')
                x-=4;
                }
                }


                IP属地:湖北8楼2020-12-27 15:19
                回复
                  7.
                  //悔棋操作
                  void huiqi(int sum,stu*arr)
                  {
                  int x,y,z,i;
                  x=arr[sum-1].x;
                  y=arr[sum-1].y;
                  z=arr[sum-1].z;
                  if(x==0)
                  {
                  if(y==0)
                  printf("┏ ");
                  else if(y==40)
                  printf("┗ \n");
                  else
                  printf("┣ ");
                  }
                  else if(x==80)
                  {
                  if(y==0)
                  printf("┓ ");
                  else if(y==40)
                  printf("┛ \n");
                  else
                  printf("┫ ");
                  }
                  else
                  {
                  if(y==0)
                  printf("┳ ");
                  else if(y==40)
                  printf("┻ ");
                  else
                  printf("╋ ");
                  }
                  }


                  IP属地:湖北9楼2020-12-27 15:20
                  回复
                    8.
                    //判断一个棋子是否为棋盘四角棋子
                    int sijiao1(stu a)
                    {
                    if((a.x==0&&a.y==0)||(a.x==0&&a.y==40)||(a.x==80&&a.y==0)||(a.x==80&&a.y==40))
                    return 1;
                    else
                    return 0;
                    }


                    IP属地:湖北10楼2020-12-27 15:20
                    回复
                      9.
                      //判断棋盘上的一个位置是否为棋盘四角
                      int sijiao2(int x,int y)
                      {
                      if((x==0&&y==0)||(x==0&&y==40)||(x==80&&y==0)||(x==80&&y==40))
                      return 1;
                      else
                      return 0;
                      }


                      IP属地:湖北11楼2020-12-27 15:21
                      回复
                        10.
                        //判断输赢函数,赢了返回1,没赢返回0
                        int panduan(int a,int sum,stu*arr)//a=1判断白子,a=2判断黑子
                        {
                        int i,j,count=1;//count记录连在一起的棋子数量
                        //判断上下方向是否能成五子
                        for(i=a-1;i<sum;i+=2)
                        {
                        if(sijiao1(arr[i]))//判断一个棋子是否为棋盘四角棋子
                        continue;
                        if(sijiao2(arr[i].x,arr[i].y-2)||sijiao2(arr[i].x,arr[i].y+2))//判断棋子的上下相邻棋子是否为棋盘四角棋子
                        continue;
                        if(brr[arr[i].y/2+1][arr[i].x/4]==a&&brr[arr[i].y/2-1][arr[i].x/4]==a&&brr[arr[i].y/2+2][arr[i].x/4]==a&&brr[arr[i].y/2-2][arr[i].x/4]==a)//判断该棋子的上下方向能否连成五子
                        return 1;
                        }
                        //判断左右方向是否能成五子
                        for(i=a-1;i<sum;i+=2)
                        {
                        if(sijiao1(arr[i]))//判断一个棋子是否为棋盘四角棋子
                        continue;
                        if(sijiao2(arr[i].x-4,arr[i].y)||sijiao2(arr[i].x+4,arr[i].y))//判断棋子的左右相邻棋子是否为棋盘四角棋子
                        continue;
                        if(brr[arr[i].y/2][arr[i].x/4+1]==a&&brr[arr[i].y/2][arr[i].x/4-1]==a&&brr[arr[i].y/2][arr[i].x/4+2]==a&&brr[arr[i].y/2][arr[i].x/4-2]==a)//判断该棋子的左右方向能否连成五子
                        return 1;
                        }
                        //判断左下到右上方向是否能成五子
                        for(i=a-1;i<sum;i+=2)
                        {
                        if(sijiao1(arr[i]))//判断一个棋子是否为棋盘四角棋子
                        continue;
                        if(sijiao2(arr[i].x-4,arr[i].y+2)||sijiao2(arr[i].x+4,arr[i].y-2))//判断棋子的左下到右上相邻棋子是否为棋盘四角棋子
                        continue;
                        if(brr[arr[i].y/2-1][arr[i].x/4+1]==a&&brr[arr[i].y/2+1][arr[i].x/4-1]==a&&brr[arr[i].y/2-2][arr[i].x/4+2]==a&&brr[arr[i].y/2+2][arr[i].x/4-2]==a)//判断该棋子的左下到右上方向能否连成五子
                        return 1;
                        }
                        //判断右下到左上方向是否能成五子
                        for(i=a-1;i<sum;i+=2)
                        {
                        if(sijiao1(arr[i]))//判断一个棋子是否为棋盘四角棋子
                        continue;
                        if(sijiao2(arr[i].x-4,arr[i].y-2)||sijiao2(arr[i].x+4,arr[i].y+2))//判断棋子的右下到左上相邻棋子是否为棋盘四角棋子
                        continue;
                        if(brr[arr[i].y/2+1][arr[i].x/4+1]==a&&brr[arr[i].y/2-1][arr[i].x/4-1]==a&&brr[arr[i].y/2+2][arr[i].x/4+2]==a&&brr[arr[i].y/2-2][arr[i].x/4-2]==a)//判断该棋子的右下到左上方向能否连成五子
                        return 1;
                        }
                        return 0;
                        }


                        IP属地:湖北12楼2020-12-27 15:21
                        回复
                          11.
                          //开始游戏函数
                          int kaishi(int num,s*prr)
                          {
                          int i,t,mark=1;
                          char n[20],nu[20];
                          system("cls");
                          printf("请输入玩家一姓名:");
                          fflush(stdin);
                          gets(n);
                          printf("请输入玩家二姓名:");
                          fflush(stdin);
                          gets(nu);
                          Draw();
                          t=xiaqi(sum,arr);
                          //玩家一获胜
                          if(t==1)
                          {
                          for(i=0;i<num;i++)//查看玩家一是否已经在玩家数组中
                          {
                          if(strcmp(n,prr[i].name)==0)//如果玩家一在
                          {
                          prr[i].number++;
                          mark=0;
                          break;
                          }
                          }
                          if(mark) //如果玩家一不在
                          {
                          strcpy(prr[num].name,n);
                          prr[num].number++;
                          num++;
                          }
                          mark=1;
                          for(i=0;i<num;i++)//查看玩家二是否已经在玩家数组中
                          {
                          if(strcmp(nu,prr[i].name)==0)//如果玩家二在
                          {
                          mark=0;
                          break;
                          }
                          }
                          if(mark) //如果玩家二不在
                          {
                          strcpy(prr[num].name,nu);
                          num++;
                          }
                          }
                          //玩家二获胜
                          else
                          {
                          for(i=0;i<num;i++)//查看玩家二是否已经在玩家数组中
                          {
                          if(strcmp(nu,prr[i].name)==0)//如果玩家二在
                          {
                          prr[i].number++;
                          mark=0;
                          break;
                          }
                          }
                          if(mark) //如果玩家二不在
                          {
                          strcpy(prr[num].name,nu);
                          prr[num].number++;
                          num++;
                          }
                          mark=1;
                          for(i=0;i<num;i++)//查看玩家一是否已经在玩家数组中
                          {
                          if(strcmp(n,prr[i].name)==0)//如果玩家一在
                          {
                          mark=0;
                          break;
                          }
                          }
                          if(mark) //如果玩家一不在
                          {
                          strcpy(prr[num].name,n);
                          num++;
                          }
                          }
                          return num;
                          }


                          IP属地:湖北13楼2020-12-27 15:22
                          回复
                            12.
                            //排行榜函数
                            void paihangbang(int num,s*prr)
                            {
                            char p[20];
                            int n,i,j;
                            if(num==0)
                            {
                            printf("\n排行榜为空!!\n");
                            system("pause");
                            return;
                            }
                            //冒泡排序
                            for(i=0;i<num-1;i++)
                            for(j=i+1;j<num;j++)
                            if(prr[i].number<prr[j].number)
                            {
                            strcpy(p,prr[i].name);
                            strcpy(prr[i].name,prr[j].name);
                            strcpy(prr[j].name,p);
                            n=prr[i].number;
                            prr[i].number=prr[j].number;
                            prr[j].number=n;
                            }
                            //输出
                            printf("\n玩家姓名 获胜场数\n");
                            for(i=0;i<num;i++)
                            printf("%-8s %d\n",prr[i].name,prr[i].number);
                            printf("\n");
                            system("pause");
                            }


                            IP属地:湖北14楼2020-12-27 15:22
                            回复
                              13.
                              int main()
                              {
                              int c;//获得用户输入的选项
                              while(1)
                              {
                              system("cls");
                              zhucaidan();
                              scanf("%d",&c);
                              switch(c)
                              {
                              case 0:printf("\n谢谢使用!!\n");
                              return 0;
                              case 1:system("cls");
                              xitongshuoming();
                              break;
                              case 2:num=kaishi(num,prr);
                              break;
                              case 3:paihangbang(num,prr);
                              break;
                              default:printf("\n输入错误!!\n");
                              break;
                              }
                              }
                              return 0;
                              }


                              IP属地:湖北15楼2020-12-27 15:22
                              回复