鱼C论坛

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

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

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

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

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

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

char qipan[16][16];//全局变量,整个文件的都可以用
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[i][j]='*';
}
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[i][j]);
    }
}

int  panduan(int x,int y)
{
    char temp;//保存下棋方的颜色,w  b
    int count=1;//统计个数,针对的同一个线(水平线)
    int i=1;//走一格
    int j=1;//和i同时用来代表走斜的
    int whoWin=0;//1代表白方,2代表黑方
    temp=qipan[x][y];
    //水平的左边
    while(temp==qipan[x][y-i]&&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][y+i]&&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-i][y]&&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+i][y]&&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-i][y-j]&&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+i][y+j]&&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-i][y+j]&&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+i][y-j]&&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[x][y]=='*')//下子的地方没有其他子
        {
             qipan[x][y]='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[x][y]=='*')//下子的地方没有其他子
        {
             qipan[x][y]='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("您是否重新游戏:y  or n");
    if(getch()=='n')
    {
        system("cls");
        printf("游戏结束\n");
        exit(0);//因为程序终止
    }
    if(getch()=='y')
    {
        system("cls");
        startGame();
    }

}
int main()
{
    startGame();
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-13 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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