五子棋

 

五子棋数组

人人对战   人机对战函数

# include<stdio.h>   
# include<string.h>  //字符数组的函数定义的头文件
# include<stdlib.h>  //standard library标准库头文件
# define kong 0
# define wanjia 1
# define diannao 2    // 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 
int qipan[15][15];    // 15*15的棋盘 
int a,b,c,d,x;  // a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置
void start();  // 程序的主要控制函数 
void draw();   // 画棋盘 
int win(int p,int q);  // 判断胜利 p q为判断点坐标 
void AI(int *p,int *q);     //电脑下子 p q返回下子坐标 
int value(int p,int q);     //计算空点p q的价值 
int qixing(int n,int p,int q);    //返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 
void yiwei(int n,int *i,int *j);  //在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数  游戏

                           /****************主函数*****************/ip

int     main()
{
    char k;
    do{
        x=225;  //棋盘总格子数
        start();
        printf("还要再来一盘吗?输入y或n:"); 
        getchar();
        scanf("%c",&k);
        while(k!='y'&&k!='n')
        { 
            printf("输入错误,请从新输入\n"); 
            scanf("%c",&k); 
        }
        system("cls"); //调用系统DOS的cls命令,清屏。
    }
    while(k=='y');
    printf("谢谢使用!\n");
}get

 

                         /*****************开始*******************/string

void start()
{
    int i,j,a1,b1,c1,d1,moshi;         /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */
    char ch;
    printf("\t╔*******************************************************╗\n");
    printf("\t║                                                       ║\n");
    printf("\t║           〉〉〉〉欢迎来到五子棋对战游戏〈〈〈〈      ║\n");
    printf("\t║                                                       ║\n");
    printf("\t║             |--------------------------- |          ║\n");
    printf("\t║             |  |-----------------------| |          ║\n");
    printf("\t║             |  |                       | |          ║\n");
    printf("\t║             |  |    五 子 棋           | |      ║\n");
     printf("\t║             |  |  对 战 平 台          | |        ║\n");
    printf("\t║             |----------------------------|          ║\n");
    printf("\t║             |----------------------------|          ║\n");
    printf("\t║                                                       ║\n");
    printf("\t║       〉〉〉〉          欢迎使用!!      〈〈〈〈    ║\n");
    printf("\t║                                                ║\n");
    printf("\t║   使用说明:                                          ║\n");
    printf("\t║      1. 输入1选择人机对战模式,输入2选择人人对战模式  ║\n");
    printf("\t║      2. 下子请输入坐标(如2 3,2为列,3为行)         ║\n");
    printf("\t║      3. 中途退出游戏请输入(20 20).                  ║\n");
    printf("\t║                                                       ║\n");
    printf("\t║                    祝您玩得开心愉快!!!                ║\n");
    printf("\t║                                                       ║\n");
    printf("\t║   请选择模式:                                        ║\n");
    printf("\t║           1.人机对战     2.人人对战    3.退出游戏.    ║\n");
    printf("\t║                                                       ║\n");
    printf("\t╚*******************************************************╝\n");
    printf("                              请输入你的选择:                 ");
    scanf("%d",&moshi);   //选择模式:人机或人人 
    if(moshi!=1&&moshi!=2&&moshi!=3) 
    {
        printf("输入错误,请从新输入:"); 
        scanf("%d",&moshi); }
    if(moshi==3)
    return ;
    if(moshi==1)       //人机模式 
    {                                   
        system("cls");    //调用系统DOS的cls命令,清屏。 
        for(j=0;j<15;j++)
            for(i=0;i<15;i++)
                qipan[j][i]=kong;  // 置棋盘全为空
        draw();
        printf("先下请按1,后下请按2. ");  //选择下棋的前后 
        scanf("%d",&i); 
        while(i!=1&&i!=2) 
        { 
            printf("输入错误,请从新输入:"); 
            scanf("%d",&i); 
        }
        if(i==1)    //玩家先手下子 
        {          
            printf("请下子:"); 
            scanf("%d%d",&a,&b); 
            if(a==20&&b==20)  return;
            while((a<0||a>14)||(b<0||b>14))  //判断输入的坐标,当a<0或者a>14 , b<0 或者b>14为坐标输入错误
            { 
                printf("坐标错误!请从新输入:"); 
                scanf("%d%d",&a,&b); }
            a1=a; 
            b1=b;
            x--;   //棋盘格子数相应减小一个
            qipan[b][a]=wanjia;  //玩家下的位置
            system("cls");  //调用系统DOS的cls命令,清屏。
            draw();    //调用画棋盘函数
        }
        while(x!=0)
        {
            if(x==225) 
            { 
                c=7; 
                d=7; 
                qipan[d][c]=diannao ;  //玩家下的位置
                x--; 
                system("cls");
                draw(); 
            }  //电脑先下就下在7 7 
            else 
            { 
                AI(&c,&d);
                qipan[d][c]=diannao;
                x--; 
                system("cls"); 
                draw(); 
            } //电脑下子
            c1=c; 
            d1=d;                 //储存电脑上手棋型 
            if(win(c,d))
            {               // 电脑赢 
                printf("要悔棋吗?请输入y或n:"); 
                getchar();
                scanf("%c",&ch);
                while(ch!='y'&&ch!='n') 
                { 
                    printf("输入错误,请从新输入:");
                    scanf("%c",&ch); }
                if(ch=='n') 
                {   
                    printf(">>*******************************<<\n");
                    printf("**************你输了!!!************\n");
                    printf("**下不过电脑很正常,请不要灰心!!!**\n");
                    printf(">>*******************************<<\n");
                    return; 
                }
                else 
                {
                    x+=2;
                    qipan[d][c]=kong; 
                    qipan[b1][a1]=kong; 
                    system("cls"); 
                    draw(); 
                } // 悔棋 
            }
            printf("电脑下在%d %d\n请输入:",c,d);
            scanf("%d%d",&a,&b);   //玩家下子 
            if(a==20&&b==20)  return;
            if(a==15&&b==15) 
            { 
                x+=2; 
                qipan[d][c]=kong; 
                qipan[b1][a1]=kong; 
                system("cls"); 
                draw();
                printf("请输入:");
                scanf("%d%d",&a,&b); 
            } // 悔棋 
            while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=kong) //判断输入坐标是否错误
            { 
                printf("坐标错误或该位置已有子!请从新输入:");
                scanf("%d%d",&a,&b); }
            a1=a; 
            b1=b; 
            x--; 
            qipan[b][a]=wanjia; 
            system("cls"); 
            draw();
            if(win(a,b)) //调用win函数
            { 
                    printf("*******************************\n");
                    printf("***********你赢了!!!***********\n");
                    printf("****请不要骄傲,继续努力!!!****\n");
                    printf("*******************************\n");
                return;
            }    //玩家赢 
        }
        printf("和局\n");
    }io


    if(moshi==2)  //选择人人对战
    {
        system("cls"); 
        for(j=0;j<15;j++)
            for(i=0;i<15;i++)
                qipan[j][i]=kong; //置棋盘全为空 
        draw();
        while(x!=0)
        {
            printf("玩家1请输入:"); 
            scanf("%d%d",&a,&b);
            if(a==20&&b==20)  return;
            if(a==15&&b==15)   //悔棋
            { 
                x+=2;
                qipan[d][c]=kong; 
                qipan[b1][a1]=kong; 
                system("cls"); 
                draw(); 
                printf("玩家1请输入:");
                scanf("%d%d",&a,&b); }       
            while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=kong) 
            { 
                printf("坐标错误或该位置已有子!请从新输入:"); 
                scanf("%d%d",&a,&b); 
            }
            a1=a;
            b1=b; 
            x--; 
            qipan[b][a]=wanjia; 
            system("cls"); 
            draw();
            printf("玩家1下在%d %d。\n",a,b);
            if(win(a,b))   /* 调用win函数*/
            { 
                printf("玩家1胜,你真棒!!!\n"); return; 
            }    /* 玩家1赢 */
            printf("玩家2请输入:"); 
            scanf("%d%d",&c,&d);
            if(a==20&&b==20)  return;
            if(c==15&&d==15)    //悔棋
            { 
                x+=2; 
                qipan[b][a]=kong;
                qipan[d1][c1]=kong; 
                system("cls");
                draw();
                printf("玩家2请输入:");
                scanf("%d%d",&c,&d); }    
            while((c<0||c>14)||(d<0||d>14)||qipan[d][c]!=kong) 
            { 
                printf("坐标错误或该位置已有子!请从新输入:");
                scanf("%d%d",&c,&d); }
            c1=c; 
            d1=d;
            x--; 
            qipan[d][c]=diannao;
            system("cls"); 
            draw();
            printf("玩家2下在%d %d。\n",c,d);
            if(win(c,d))
            { 
                printf("玩家2胜,你真棒!!!\n"); return;
            }    /* 玩家2赢 */
        }
        printf("和局\n");
    }
}
                          /*************** 画棋盘 ******************/程序

@@@@@@@@@@棋盘及如下代码请留言di