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

来源:互联网 发布:淘宝店铺进货虚拟 编辑:程序博客网 时间:2024/04/30 13:41

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

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

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

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


/*Copyright(c)2016,烟台大学计算机学院 all rights reserved. 作者:曹欣宇 指导教师:贺利坚 完成日期:2017年2月21日 输入   落子坐标 输出   落子后棋盘样例输入 见运行图样例输出 见运行图   */ #include <stdio.h>#include <stdlib.h>#define N 20//以下为初始化棋盘函数,将棋盘初始化void init_wzq(char (*game)[N]){    int i,j;    for(i=0; i<N; i++)    {        for(j=0; j<N; j++)            game[i][j]='+';    }}//以下为展示棋盘函数,将棋盘展示出来void show_wzq(char (*game)[N]){    int i,j;    for(i=0; i<N; i++)    {        for(j=0; j<N; j++)        {            printf("%c ",game[i][j]);        }        printf("\n");    }}//黑棋的判断输赢函数int playBlack_wzq(int qizi1,int qizi2,char (*game)[N]){    int j,j2,p1,p2,p3,p4,q3,q4,m=1;    //以下为横向    if(qizi2>=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;}





0 0
原创粉丝点击