增加了一个储存玩家信息的功能
玩家可以通过昵称登录
人人模式和人机模式中
玩家每胜利一局即可增加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;
}