五子棋小程序(進階版)

增加了一個儲存玩家信息的功能
玩家可以通過暱稱登錄
人人模式和人機模式中
玩家每勝利一局即可增加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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章