鱼的七秒记忆 发表于 2020-9-19 21:29:41

比较难操作的C语言五子棋

#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
//#define N 16

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



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

void printShuzi()
{
    int i;
    Pos(2,0);
    for(i=0;i<16;i++)
      printf("%2d",i);
    for(i=0;i<16;i++)
    {
      Pos(0,1+i);
      printf("%2d",i);
    }
}
void initQipan()
{
    int i,j;
    for(i=0;i<16;i++)
      for(j=0;j<16;j++)
            qipan='*';
}
void printQipan()
{
    int i,j;
    printShuzi();
    for(i=0;i<16;i++)
    {
      Pos(2,1+i);//自动换行的输出的功能,代替printf("\n");
      for(j=0;j<16;j++)
            printf(" %c",qipan);
    }
}

intpanduan(int x,int y)
{
    char temp;//保存下棋方的颜色,wb
    int count=1;//统计个数,针对的同一个线(水平线)
    int i=1;//走一格
    int j=1;//和i同时用来代表走斜的
    int whoWin=0;//1代表白方,2代表黑方
    temp=qipan;
    //水平的左边
    while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
    //水平的右边
    i=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }

   //解决垂直的方向
   //垂直上方
   i=1;
   count=1;//清理掉之前的数据
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
   //垂直下方
   i=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
   //解决左上的斜线上方
   i=1;
   j=1;
   count=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      j++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
   //解决左上的斜线下方
   i=1;
   j=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      j++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
   //解决右上的斜线上方
   i=1;
   j=1;
   count=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      j++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
   //解决右上的斜线下方
   i=1;
   j=1;
   while(temp==qipan&&x>=0&&x<16&&y>=0&&y<15&&count<5)
    {
      i++;
      j++;
      count++;
      if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
      {
            if(temp=='W')
                whoWin=1;

            else
                whoWin=2;
      }
    }
    return whoWin;
}

int showWhoWin()
{
    int overLeap=0;//1代表结束
    int leap;//用来接收谁赢了
    leap=panduan(x,y);
    if(leap==1)
    {
      overLeap=1;
      system("cls");
      printQipan();
      printf("\n白方胜利\n");
      system("pause");
    }
    if(leap==2)
    {
      overLeap=1;
      system("cls");
      printQipan();
      printf("\n黑方胜利\n");
      system("pause");
    }
    return overLeap;
}

void whitePlay()
{
    printf("\n请白方落子,按下行与列的坐标:");
    scanf("%d%d",&x,&y);//坐标的值
    while(1)//解决一直下错子的问题
    {
      if(qipan=='*')//下子的地方没有其他子
      {
             qipan='W';
             //解决while(1)
             break;
      }
      else
      {
            printf("您下子错误\n");
            printf("请白方落子,按下行与列的坐标:");
            scanf("%d%d",&x,&y);//坐标的值
      }

    }
    printQipan();   

}
void blackPlay()
{

    printQipan();
    printf("\n请黑方落子,按下行与列的坐标:");
    scanf("%d%d",&x,&y);//坐标的值
      while(1)//解决一直下错子的问题
    {
      if(qipan=='*')//下子的地方没有其他子
      {
             qipan='B';
             //解决while(1)
             break;
      }
      else
      {
            printf("您下子错误\n");
            printf("请黑方落子,按下行与列的坐标:");
      }
      scanf("%d%d",&x,&y);//坐标的值

    }
    printQipan();

}
void startGame()
{
    initQipan();
    printQipan();
    while(1)
    {
      whitePlay();
      if(showWhoWin()==1)//system("pause");
             break;
      system("cls");//清理屏幕,是屏幕上的字不重复
      blackPlay();
      if(showWhoWin()==1)//system("pause");
             break;
      system("cls");
      printQipan();
    }
    printf("您是否重新游戏:yor n");
    if(getch()=='n')
    {
      system("cls");
      printf("游戏结束\n");
      exit(0);//因为程序终止
    }
    if(getch()=='y')
    {
      system("cls");
      startGame();
    }

}
int main()
{
    startGame();
    return 0;
}

鱼的七秒记忆 发表于 2020-9-19 21:32:08

这帖子能申精吗?4小时写出来的....@不二如是

不二如是 发表于 2020-9-20 08:28:51

鱼的七秒记忆 发表于 2020-9-19 21:32
这帖子能申精吗?4小时写出来的....@不二如是

内容还需要更多讲解,回帖量也少了一些

乐乐学编程 发表于 2020-9-20 10:15:09

不二如是 发表于 2020-9-20 08:28
内容还需要更多讲解,回帖量也少了一些

申精需要多少回帖,想先了解下
页: [1]
查看完整版本: 比较难操作的C语言五子棋