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