寒假作业——五子棋简单实现

时间过的真快,寒假这就快完了.....作业也刚刚完成,100道oj和一个小游戏的作业量感觉秒杀了不少学生(学霸走开).....

oj很多水题就不发了,把五子棋的简单实现奉上,可能会有点帮助,代码写的很乱,不过注释自我感觉还是很全面的.....

这个代码用到的知识都很简单,主要还是思路吧,所以做出来很low,根本不能当作小游戏,权当是简单实现....

这个代码我是参考了别人写的框架,然后自己想的核心,算是个半仿,水平很低,代码还有很多改进的地方,甚至有bug,时间有限,后来功力上涨后在看吧


/*Copyright(c)2016,烟台大学计算机学院 all rights reserved. 
作者:曹欣宇 
指导教师:贺利坚 
完成日期:2017年2月21日 
输入 
  落子坐标 
输出 
  落子后棋盘
样例输入 
见运行图
样例输出 
见运行图 
  */ 
#include 
#include 

#define N 20

//以下为初始化棋盘函数,将棋盘初始化
void init_wzq(char (*game)[N])
{
    int i,j;
    for(i=0; i=4)//横向分两种情况,第一,下的子纵坐标>=4,第二,下的子纵坐标<4
        p1=qizi2-4;
    else
        p1=0;
    for(j=p1; j<=qizi2+4; j++)//从下子左边4个开始看整行是否存在五子连珠,若左边不到四个就到零的话就从零开始。
    {
        if(game[qizi1][j]=='@')
        {
            for(j2=j; j2<=j+4; j2++)
            {
                if(game[qizi1][j2]!='@')
                    m=0;
            }
            if(m==1)
            {
                printf("黑棋获得胜利!\n");
                return 1;
            }
        }
    }
    m=1;
    //以下为竖向
    if(qizi1>=4)//与横向相似
        p2=qizi1-4;
    else
        p2=0;
    for(j=p2; j<=qizi1+4; j++)
    {
        if(game[j][qizi2]=='@')
        {
            for(j2=j; j2<=j+4; j2++)
            {
                if(game[j2][qizi2]!='@')
                    m=0;
            }
            if(m==1)
            {
                printf("黑棋获得胜利!\n");
                return 1;
            }
        }
    }
    m=1;
    //一下为“/”向
    p3=qizi1,p4=qizi2;//这里最好将qizi变量固定,因为\向一会还要用到,如果不变,将影响\向的判断
    while(p4!=0&&p3!=N-1)//将落子的数值通过循环,变到/向的最左下角
    {
        p3++;
        p4--;
    }
    j=p3;
    while(p3!=0&&p4!=N-1)//从之前的左下角,遍历到右上角,检测是否有五子连珠
    {
        if(game[p3][p4]=='@')
        {
            q3=p3,q4=p4;
            for(j2=j; j2<=j+4; q3--,q4++,j2++)
            {
                if(game[q3][q4]!='@')
                    m=0;
            }
            if(m==1)
            {
                printf("黑棋获得胜利!\n");
                return 1;
            }
        }
        j--;
        p3--,p4++;
    }
    m=1;
    //以下为“\”方向
    while(qizi2!=N-1&&qizi1!=N-1)//思路同/向
    {
        qizi1++;
        qizi2++;
    }
    j=qizi1;
    while(qizi1!=0&&qizi2!=0)
    {
        if(game[qizi1][qizi2]=='@')
        {
            p3=qizi1,p4=qizi2;
            for(j2=j; j2<=j+4; p3--,p4--,j2++)
            {
                if(game[p3][p4]!='@')
                    m=0;
            }
            if(m==1)
            {
                printf("黑棋获得胜利!\n");
                return 1;
            }
        }
        j--,qizi1--,qizi2--;
    }
    return 0;
}
//以下为白棋的判断函数,和黑棋几乎一样,相似度如此之高(只是‘@’变为‘O’),还是有改进的余地
int playWhile_wzq(int qizi1,int qizi2,char (*game)[N])
{
    int j,j2,p1,p2,p3,p4,q3,q4,m=1;
    //以下为横向
    if(qizi2>=4)
        p1=qizi2-4;
    else
        p1=0;
    for(j=p1; j<=qizi2+4; j++)
    {
        if(game[qizi1][j]=='O')
        {
            for(j2=j; j2<=j+4; j2++)
            {
                if(game[qizi1][j2]!='O')
                    m=0;
            }
            if(m==1)
            {
                printf("白棋获得胜利!\n");
                return 1;
            }
        }
    }
    m=1;
    //以下为竖向
    if(qizi1>=4)
        p2=qizi1-4;
    else
        p2=0;
    for(j=p2; j<=qizi1+4; j++)
    {
        if(game[j][qizi2]=='O')
        {
            for(j2=j; j2<=j+4; j2++)
            {
                if(game[j2][qizi2]!='O')
                    m=0;
            }
            if(m==1)
            {
                printf("白棋获得胜利!\n");
                return 1;
            }
        }
    }
    m=1;
    //一下为“/”向
    p3=qizi1,p4=qizi2;
    while(p4!=0&&p3!=N-1)
    {
        p3++;
        p4--;
    }
    j=p3;
    while(p3!=0&&p4!=N-1)
    {
        if(game[p3][p4]=='O')
        {
            q3=p3,q4=p4;
            for(j2=j; j2<=j+4; q3--,q4++,j2++)
            {
                if(game[q3][q4]!='O')
                    m=0;
            }
            if(m==1)
            {
                printf("白棋获得胜利!\n");
                return 1;
            }
        }
        j--;
        p3--,p4++;
    }
    m=1;
    //以下为“\”方向
    while(qizi2!=N-1&&qizi1!=N-1)
    {
        qizi1++;
        qizi2++;
    }
    j=qizi1;
    while(qizi1!=0&&qizi2!=0)
    {
        if(game[qizi1][qizi2]=='O')
        {
            p3=qizi1,p4=qizi2;
            for(j2=j; j2<=j+4; p3--,p4--,j2++)
            {
                if(game[p3][p4]!='O')
                    m=0;
            }
            if(m==1)
            {
                printf("白棋获得胜利!\n");
                return 1;
            }
        }
        j--,qizi1--,qizi2--;
    }
    return 0;
}
int main()
{
    char game[N][N];
    int white1=0,white2=0;//白棋的坐标
    int black1=0,black2=0;//黑棋的坐标
    int judge=0;//判断输赢
    int count=0;//判断落子
    printf("简易(麻烦)五子棋,本棋盘黑棋先走\n");
    init_wzq(game);
    show_wzq(game);
    while(1)
    {
        if(count==N*N)
        {
            printf("棋盘已满,平局!\n");
        }
        if(count%2==0)//count为0,2,4,等偶数时,黑棋落子
        {
            printf("请输入您要落子(黑子)的坐标(例如0 1或4 8,4 8为5行9列):");
            scanf("%d %d",&black1,&black2);

            while(black1>N-1||black2>N-1||black1<0||black2<0)
            {
                printf("落子出界,请重新输入!");
                scanf("%d %d",&black1,&black2);
            }
            while(game[black1][black2]!='+')
            {
                printf("此处已经落过子,请重新落子:");
                scanf("%d %d",&black1,&black2);
            }
            game[black1][black2]='@';//这行是参考别人的,感觉很巧妙,大神勿喷....
            judge=playBlack_wzq(black1,black2,game);
            if(judge==1)
            {
                show_wzq(game);
                printf("程序结束\n");
                return 0;
            }
        }
        else//白棋
        {
            printf("请输入您要落子(白子)的坐标(例如0 1或4 8,4 8为5行9列):");
            scanf("%d %d",&white1,&white2);
            if(white1>N-1||white2>N-1||white1<0||white2<0)
            {
                printf("落子出界,请重新输入!\n");
                while(white1<=N-1&&white2<=N-1)
                {
                    scanf("%d %d",&white1,&white2);
                }
            }
            while(game[white1][white2]!='+')
            {
                printf("此处已经落过子,请重新落子:");
                scanf("%d %d",&white1,&white2);
            }
            game[white1][white2]='O';
            judge=playWhile_wzq(white1,white2,game);
            if(judge==1)
            {
                show_wzq(game);
                printf("程序结束\n");
                return 0;
            }
        }
        count++;
        show_wzq(game);
    }
    return 0;
}


寒假作业——五子棋简单实现_第1张图片

寒假作业——五子棋简单实现_第2张图片

你可能感兴趣的:(寒假作业)