五子棋小程序(进阶版)

增加了一个储存玩家信息的功能
玩家可以通过昵称登录
人人模式和人机模式中
玩家每胜利一局即可增加1积分
并可以在出界面选择查看全部玩家积分和指定玩家积分
应用C语言中文件部分的知识
之前文件学的不咋好
做起来挺费力的
里面卡住的地方是在文件中修改部分数据项
不多bb了,上代码,勿喷勿喷

#include <bits/stdc++.h>
#define SIZE 15
#define WIN 5

using namespace std;

struct information//该结构体储存玩家信息
{
    int l;//储存名字的长度
    char name[25];//储存玩家姓名
    int grade;//储存玩家得分
};
char chessboard[SIZE][SIZE];
int heng,zong;

void prch();//打印棋盘
int menu();//游戏选择界面
int judge(char a);//判断黑子或白子是否胜利
void findfp();//查看玩家信息函数

int main()
{
    int p=menu();
    if(p==1)//人人对战模式
    {
        FILE *fph,*fpb;
        char playerh[25],playerb[25];
        struct information s;
        //在文件玩家信息文件中查找黑子玩家
        if((fph=fopen("g:\\player.txt","a+"))==NULL)
        {
            cout<<"玩家信息文件打开失败"<<endl;
            exit(0);
        }
        cout<<"黑子玩家昵称: ";
        cin>>playerh;
        int mark=0;//标记该玩家是否被找到
        while(fscanf(fph,"%d ",&s.l)!=-1)
        {
            fgets(s.name,s.l+1,fph);//读取名字长度+1,以保存'\0'
            if(strcmp(playerh,s.name)==0)
            {
                mark=1;
                break;
            }
        }
        if(mark==0)
        {
            strcpy(s.name,playerh);
            s.l=strlen(s.name);
            s.grade=10;
            fprintf(fph,"%d ",s.l);
            fputs(s.name,fph);
            fprintf(fph," %d\n",s.grade);
        }
        fclose(fph);
        //在文件玩家信息文件中查找白子玩家
        if((fpb=fopen("g:\\player.txt","a+"))==NULL)
        {
            cout<<"玩家信息文件打开失败"<<endl;
            exit(0);
        }
        cout<<"白子玩家昵称: ";
        cin>>playerb;
        mark=0;
        while(fscanf(fpb,"%d ",&s.l)!=-1)
        {
            fgets(s.name,s.l+1,fpb);//读取名字长度+1,以保存'\0'
            if(strcmp(playerb,s.name)==0)
            {
                mark=1;
                break;
            }
        }
        if(mark==0)
        {
            strcpy(s.name,playerb);
            s.l=strlen(s.name);
            s.grade=10;
            fprintf(fpb,"%d ",s.l);
            fputs(s.name,fpb);
            fprintf(fpb," %d\n",s.grade);
        }
        fclose(fpb);
        prch();
        int flag=0;
        for (int i=0; i<SIZE; i++)//对奇葩内容进行初始化
            for (int j=0; j<SIZE; j++)
                chessboard[i][j] = ' ';
        printf("请输入黑子(@)的坐标,形如:4 4: ");
        while(~scanf("%d%d",&zong,&heng))
        {
            while (heng<1||zong<1||heng>SIZE||zong>SIZE||chessboard[zong-1][heng-1] != ' ')
            {
                printf("输入有误!请重新输入!\n\n");
                if (flag%2==0)
                    printf("请输入黑子(@)坐标,形如:4 4:");
                else
                    printf("请输入白子(O)坐标,形如:4 4:");
                scanf("%d%d",&zong,&heng);
            }
            if (flag%2==0)
                chessboard[zong - 1][heng - 1]='@';
            else
                chessboard[zong - 1][heng - 1]='O';
            prch();
            //判断哪一方获胜
            if(flag%2==0)
            {
                if(judge('@'))
                {
                    printf("黑棋获胜!!!!\n");
                    if((fph=fopen("g:\\player.txt","a+"))==NULL)//为玩家积累得分
                    {
                        cout<<"玩家信息文件打开失败"<<endl;
                        exit(0);
                    }
                    while(fscanf(fph,"%d ",&s.l)!=-1)
                    {
                        fgets(s.name,s.l+1,fph);//读取名字长度+1,以保存'\0'
                        if(strcmp(playerh,s.name)==0)
                        {
                            fscanf(fph,"%d",&s.grade);
                            fseek(fph,-2,SEEK_CUR);
                            s.grade++;
                            fprintf(fph,"d",s.grade);
                            break;
                        }
                    }
                    break;
                }
            }
            else
            {
                if(judge('O'))
                {
                    printf("白棋获胜!!!!\n");
                    if((fpb=fopen("g:\\player.txt","a+"))==NULL)//为玩家积累得分
                    {
                        cout<<"玩家信息文件打开失败"<<endl;
                        exit(0);
                    }
                    while(fscanf(fpb,"%d ",&s.l)!=-1)
                    {
                        fgets(s.name,s.l+1,fpb);//读取名字长度+1,以保存'\0'
                        if(strcmp(playerb,s.name)==0)
                        {
                            fscanf(fpb,"%d",&s.grade);
                            fseek(fpb,-2,SEEK_CUR);
                            s.grade++;
                            fprintf(fpb,"d",s.grade);
                            break;
                        }
                    }
                    break;
                }
            }
            flag++;
            if (flag%2 ==0)
                printf("请输入黑子(@)坐标,形如:4 4:");
            else
                printf("请输入白子(O)坐标,形如:4 4:");
        }
    }
    else if(p==2)//人机对战模式
    {
        FILE *fph,*fpb;
        char playerh[25],playerb[25];
        struct information s;
        //在文件玩家信息文件中查找黑子玩家
        if((fph=fopen("g:\\player.txt","a+"))==NULL)
        {
            cout<<"玩家信息文件打开失败"<<endl;
            exit(0);
        }
        cout<<"黑子玩家昵称: ";
        cin>>playerh;
        int mark=0;//标记该玩家是否被找到
        while(fscanf(fph,"%d ",&s.l)!=-1)
        {
            fgets(s.name,s.l+1,fph);//读取名字长度+1,以保存'\0'
            if(strcmp(playerh,s.name)==0)
            {
                mark=1;
                break;
            }
        }
        if(mark==0)
        {
            strcpy(s.name,playerh);
            s.l=strlen(s.name);
            s.grade=10;
            fprintf(fph,"%d ",s.l);
            fputs(s.name,fph);
            fprintf(fph," %d\n",s.grade);
        }
        fclose(fph);
        prch();
        for (int i=0; i<SIZE; i++)//对奇葩内容进行初始化
            for (int j=0; j<SIZE; j++)
                chessboard[i][j] = ' ';
        printf("请输入黑子(@)的坐标,形如:4 4: ");
        while(~scanf("%d%d",&zong,&heng))
        {
            while (heng<1||zong<1||heng>SIZE||zong>SIZE||chessboard[zong-1][heng-1] != ' ')
            {
                printf("输入有误!请重新输入!\n\n");
                printf("请输入黑子(@)坐标,形如:4 4:");
                scanf("%d%d",&zong,&heng);
            }
            chessboard[zong - 1][heng - 1]='@';
            prch();
            if(judge('@'))
            {
                printf("黑棋获胜!!!!\n");
                if((fph=fopen("g:\\player.txt","a+"))==NULL)
                {
                    cout<<"玩家信息文件打开失败"<<endl;
                    exit(0);
                }
                while(fscanf(fph,"%d ",&s.l)!=-1)
                {
                    fgets(s.name,s.l+1,fph);//读取名字长度+1,以保存'\0'
                    if(strcmp(playerh,s.name)==0)
                    {
                        fscanf(fph,"%d",&s.grade);
                        fseek(fph,-2,SEEK_CUR);
                        s.grade++;
                        fprintf(fph,"d",s.grade);
                        break;
                    }
                }
                break;
            }
            zong=rand()%15+1,heng=rand()%15+1;
            chessboard[zong - 1][heng - 1]='O';
            prch();
            if(judge('O'))
            {
                printf("白棋获胜!!!!\n");
                break;
            }
            printf("请输入黑子(@)坐标,形如:4 4:");
        }
    }
    else if(p==3)//查看玩家信息
    {
        findfp();
    }
    else//退出游戏
        cout<<endl<<"退出游戏"<<endl;
    return 0;
}

void findfp()//查看玩家信息函数
{
    printf("***************************************\n");
    printf("**********  1.查看指定玩家  ***********\n");
    printf("**********  2.查看全部玩家  ***********\n");
    printf("***************************************\n");
    printf("           您的选择是:");
    int check;
    while(cin>>check)//容错,防止输入错误
    {
        if(check==1||check==2)
            break;
        else
            cout<<"输入有误,请重新输入: ";
    }
    FILE *fp;
    if((fp=fopen("g:\\player.txt","a+"))==NULL)
    {
        cout<<"玩家信息文件打开失败"<<endl;
        exit(0);
    }
    struct information s;
    if(check==2)
    {
        while(fscanf(fp,"%d ",&s.l)!=-1)
        {
            fgets(s.name,s.l+1,fp);//读取名字长度+1,以保存'\0'
            fscanf(fp,"%d",&s.grade);
            cout<<"玩家姓名: ";
            for(int i=0; s.name[i]!='\0'; i++)
                cout<<s.name[i];
            cout<<"     "<<"玩家积分: "<<s.grade;
            cout<<endl;
        }
        cout<<endl<<"已显示全部"<<endl;
        fclose(fp);
    }
    else
    {
        char checkname[25];//待查找玩家名字
        cout<<"请输入查找玩家的昵称:  ";
        cin>>checkname;
        int mark=0;//是否查找到的标记
        while(fscanf(fp,"%d ",&s.l)!=-1)
        {
            fgets(s.name,s.l+1,fp);//读取名字长度+1,以保存'\0'
            if(strcmp(checkname,s.name)==0)
            {
                fscanf(fp,"%d",&s.grade);
                cout<<"玩家姓名: ";
                for(int i=0; s.name[i]!='\0'; i++)
                    cout<<s.name[i];
                cout<<"     "<<"玩家积分: "<<s.grade;
                mark=1;
                break;
            }
        }
        if(mark==0)
            cout<<endl<<"该玩家未注册"<<endl;
        else
            cout<<endl<<"查找完成"<<endl;
    }
}

void prch()//打印棋盘
{
    printf("    ");
    for (int i=1; i<=SIZE; i++)
        printf(" %-3d",i);
    printf("\n");
    printf("    ___________________________________________________________\n");
    for (int i=0; i<SIZE; i++)
    {
        if (i>=0)
            printf("%-3d",i+1);
        else
            printf("   ");
        printf("|");
        for (int j=0; j<SIZE; j++)
            printf(" %-2c|", chessboard[i][j]);
        printf("\n    ___________________________________________________________\n");
    }
    printf("\n\n");
}

int menu()//游戏选择界面
{
    int num;
    printf("************ 五子棋小游戏  ************\n");
    printf("******  1.人人对战  2.人机对战  *******\n");
    printf("******  3.查看信息  4.退出游戏  *******\n");
    printf("***************************************\n");
    printf("           您的选择是:");
    while(cin>>num)//容错,防止输入错误
    {
        if(num==1||num==2||num==3||num==4)
            break;
        else
            cout<<"输入有误,请重新输入: ";
    }
    return num;
}

int judge(char a)//判断黑子或白子是否胜利
{
    for (int i=0; i<SIZE; i++)
    {
        for (int j=0; j<SIZE; j++)
        {
            if (chessboard[i][j] == a)
            {
                int count_a = 1;

                //竖直方向
                for (int x=i-1,times=0; x>=0; x--,times++)
                {
                    if (chessboard[x][j]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int y=i+1,times=0; y<SIZE; y++,times++)
                {
                    if (chessboard[y][j]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //横方向
                count_a=1;
                for (int x=j-1,times=0; x>=0; x--,times++)
                {
                    if (chessboard[i][x]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int y=j+1,times=0; y<SIZE; y++,times++)
                {
                    if (chessboard[i][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //上斜下方向
                count_a=1;
                for (int x=i-1,y=j-1,times=0; i>=0&&j>=0; x--,y--,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int x=i+1,y=j+1,times=0; i<SIZE&&j<SIZE; x++,y++,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //下斜上方向
                count_a=1;
                for (int x=i+1,y=j-1,times=0; x<SIZE&&y>=0; x++,y--,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int x=i-1,y=j+1,times=0; x>=0&&y<SIZE; x--,y++,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

            }
        }
    }
    return false;
}

猜你喜欢

转载自blog.csdn.net/qq_46126537/article/details/106959034