#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define TRUE 1typedef struct {char name[30]; //用户名长度最长28 char password[30]; //密码长度最长28 double money;int times;int win;}game_t;//清空缓存void fflush_in();//登录菜单函数void log_menu();//功能菜单函数void ctrl_menu();//登录函数int log_in(game_t *p,int *count,int *my);//注册函数int add_user(game_t *p,int *count);//登录控制函数void log_ctrl(game_t *p,int *count,int*my);//功能控制函数void ctrl(game_t *p,int *count,int *my);//查看函数void look(game_t *p,int *count,int *my);//查看菜单void look_menu();//查看所有void look_all(game_t *p,int *count);//查看个人void look_my(game_t *p,int *my);//初始化函数int log_start(game_t *p,int *count);//保存函数int exit_save(game_t *p,int *count);//充值函数int pay(game_t *p,int *my);//修改函数void alter(game_t *p,int *count,int *my);//修改菜单void alter_menu();//修改密码int alter_pass(game_t *p,int *my);//注销用户int del(game_t *p,int *count,int *my);//游戏控制函数void game_ctrl(game_t *p,int *my);//游戏菜单void game_menu();//下注int game_pay(game_t *p,int *my,double *mon);//游戏函数void game_play(game_t *p,int *my,double *mon);//游戏int game();//排序控制函数void cmp(game_t *p,int *count);//排序菜单void cmp_menu();//按金额排序函数int cmp_money(const void *px,const void*py);//胜率函数void win_times(game_t *p,int *count);//按胜率排序函数int cmp_win(const void *px,const void *py);int main(){game_t stu[100]={"\0"}; //最多100个用户int count=0; //count表示用户数int my=0; //my表示本人用户下标printf("欢迎使用猜拳游戏\n");if(log_start(stu,&count)==0) //系统初始化 printf("系统初始化成功\n");elseprintf("系统初始化失败\n");log_ctrl(stu,&count,&my); //登陆控制函数return 0;}//初始化函数 0-成功1-失败int log_start(game_t *p,int *count){FILE*fp=NULL;fp=fopen("data","a+");if(NULL==fp)return 1;while(fread(&p[*count],sizeof(game_t),1,fp))*count+=1;fclose(fp);return 0;}//保存函数 0-成功 1-失败int exit_save(game_t *p,int *count){FILE*fp=NULL;fp=fopen("data","w");if(NULL==fp)return 1;;fwrite(p,sizeof(game_t),*count,fp);fclose(fp);return 0;}//功能控制函数void ctrl(game_t *p,int *count,int *my){int chose=0;while(TRUE){chose=0;ctrl_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //查看look(p,count,my);break;case 2: //游戏game_ctrl(p,my);break;case 3: //充值if(pay(p,my)==0)printf("充值成功\n"); elseprintf("充值失败\n"); break;case 4: //修改alter(p,count,my);break;case 5: //排序cmp(p,count);break;case 6: //返回return ;break;default:printf("输入错误,请重新输入\n");}}}//排序控制函数void cmp(game_t *p,int *count){int chose=0;while(TRUE){chose=0;cmp_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //金额qsort(p,*count,sizeof(game_t),cmp_money); printf("排序成功\n");break;case 2: //胜率win_times(p,count);printf("排序成功\n");break;case 3: //返回return ;break;default:printf("输入错误,请重新输入\n");}}}//胜率函数void win_times(game_t *p,int *count){double wins[100]={0.0};double i=0,j=0;int k=0;for(k=0;k<*count;k++){i=p[k].times;j=p[k].win;wins[k]=(i=0?0:(double )j/i*100);}qsort(wins,*count,sizeof(game_t),cmp_win); }//按胜率排序函数int cmp_win(const void *px,const void *py){const game_t *p1=px;const game_t *p2=py;if(p1->money>p2->money)return -1;if(p1->money<p2->money)return 1;elsereturn 0;}//按金额排序函数int cmp_money(const void *px,const void*py){const game_t *p1=px;const game_t *p2=py;if(p1->money>p2->money)return -1;if(p1->money<p2->money)return 1;elsereturn 0;}//排序菜单void cmp_menu(){printf("1.按金额排序 2.按胜率排序 3.返回\n"); }//游戏控制函数void game_ctrl(game_t *p,int *my){int chose=0;double mon=0.0;while(TRUE){chose=0;game_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //下注if(game_pay(p,my,&mon)==0)printf("下注成功,请开始游戏\n");elseprintf("下注失败\n");break;case 2: //猜拳game_play(p,my,&mon);break;case 3: //返回return ;break;default:printf("输入错误,请重新输入\n");}}}//游戏函数void game_play(game_t *p,int *my,double *mon){int result=0;int radio=0;if(*mon==0){printf("请先下注\n");return ;}p[*my].money-=*mon;result=game();srand((unsigned)time(NULL));radio=rand()%5+1;if(result==0){p[*my].money+=0;printf("平局,余额%.2f\n",p[*my].money);p[*my].times+=1;}else if(result==1){p[*my].money+=(*mon)*radio;printf("您胜利了,奖金:%.2f余额:%.2f\n",(*mon)*radio,p[*my].money);p[*my].times+=1;p[*my].win+=1;}else {printf("您输了%.2lf,余额%.2lf\n",*mon,p[*my].money); p[*my].times+=1;}*mon=0.0;}//游戏 0-平局,1-胜,-1-输int game(){int my=0;int radio=0;while(my!=1&&my!=2&&my!=3){printf("1.剪刀 2.石头 3.布\n");printf("请选择:");scanf("%d",&my);fflush_in();switch(my){case 1:printf("您出的是剪刀\n");break;case 2:printf("您出的是石头\n");break;case 3:printf("您出的是布\n");break;default:printf("输入错误,请重新输入\n");}}srand((unsigned)time(NULL));radio=rand()%3+1;if(radio==1)printf("电脑出的是剪刀\n");else if(radio==2)printf("电脑出的是石头\n");else if(radio==3)printf("电脑出的是布\n");switch(radio-my){case 1:case -2:return -1;case 2:case -1:return 1;default:return 0;}}//下注 0-成功 1-失败int game_pay(game_t *p,int *my,double *mon){double money=0.0;if(p[*my].money==0){printf("您的余额为0.00,请充值\n"); return 1;}printf("您的余额为:%.2lf元\n",p[*my].money); printf("请下注:");scanf("%lf",&money);fflush_in();if(money<=0){printf("金额输入有误\n");return 1;}if(money>p[*my].money){printf("余额不足,请充值\n");return 1;}*mon=money;return 0;}//游戏菜单void game_menu(){printf("1.下注 2.猜拳 3.返回\n");}//修改函数 0-成功 1-失败void alter(game_t *p,int *count,int *my){int chose=0;while(TRUE){chose=0;alter_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //改密if(alter_pass(p,my)==0)printf("修改密码成功\n");elseprintf("修改密码失败\n");break;case 2: //注销if(del(p,count,my)==0){printf("注销成功\n");log_ctrl(p,count,my); //登陆控制函数 }elseprintf("注销失败\n");break;case 3: //返回return ;break;default:printf("输入错误,请重新输入\n");}}}//注销用户 0-成功 1-失败int del(game_t *p,int *count,int *my){char pass[30]="\0";int i=0,chose=0;printf("密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';if(!(strcmp(p[*my].password,pass))==0){printf("密码输入错误\n");return 1;}printf("是否注销?\n1.是 2.否\n");printf("请选择:");scanf("%d",&chose);fflush_in();if(chose==1){for(i=*my;i<*count-1;i++){strcpy(p[i].name,p[i+1].name);strcpy(p[i].password,p[i+1].password);p[i].money=p[i+1].money; p[i].times=p[i+1].times; p[i].win=p[i+1].win;}}elsereturn 1;*count-=1;return 0;}//修改密码 0-成功 1-失败int alter_pass(game_t *p,int *my){char pass[30]="\0",pass2[30]="\0";int chose=0;printf("密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';if(!(strcmp(p[*my].password,pass))==0){ printf("密码输入错误\n");return 1;}printf("提示:密码长度为6-28位\n");printf("输入新密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';printf("确认新密码:");fgets(pass2,30,stdin);pass2[strlen(pass2)-1]='\0';if(strcmp(pass,pass2)!=0){printf("两次输入密码不一样\n"); return 1;}if(strcmp(p[*my].password,pass)==0){printf("新密码与原密码相同\n"); return 1;}printf("是否改密?\n1.是 2.否\n");printf("请选择:");scanf("%d",&chose);fflush_in();if(chose==1)strcpy(p[*my].password,pass);elsereturn 1;return 0;}//修改函数菜单void alter_menu(){printf("1.修改密码 2.注销 3.返回\n");}//充值函数int pay(game_t *p,int *my){int i=0;double money=0;char pass[30]="\0";char str[10]="\0",str2[10]="\0";printf("请输入金额:");scanf("%lf",&money);fflush_in();if(money<=0.0)return 1;//验证码for(i=0;i<5;i++){srand((unsigned)time(NULL)+i);str[i]="0123456789abcdefghihklmnopqrstuvwxyz"[rand()%36]; }printf("充值密码:%s",str);printf("\n");printf("请输入充值密码:");fgets(str2,10,stdin);str2[strlen(str2)-1]='\0';if(strcmp(str,str2)!=0){printf("充值密码输入错误\n");return 1;}printf("密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';if(!(strcmp(p[*my].password,pass))==0)return 1;p[*my].money+=money;return 0;}//查看函数void look(game_t *p,int *count,int *my){int chose=0;while(TRUE){chose=0;look_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //个人look_my(p,my);break;case 2: //所有look_all(p,count);break;case 3: //返回return ;break;default:printf("输入错误,请重新输入\n"); }}}//查看所有void look_all(game_t *p,int *count){int i=0; //i表示游戏次数int j=0; //j表示胜利次数int k=0;printf("用户\t金额\t胜率\t\n");for(k=0;k<*count;k++){i=p[k].times;j=p[k].win;printf("%s\t%.2f\t%.2lf%%\t\n",p[k].name,p[k].money,i==0?0:(double )j/i*100);}}//查看个人void look_my(game_t *p,int *my){int i=0; //i表示游戏次数int j=0; //j表示胜利次数i=p[*my].times;j=p[*my].win;printf("用户名:%s\n",p[*my].name);printf("密码:%s\n",p[*my].password);printf("金额:%.2lf\n",p[*my].money);printf("胜率:%.2lf%%\n",i==0?0:(double )j/i*100);}//查看菜单void look_menu(){printf("1.个人 2.所有 3.返回\n");}//功能菜单函数void ctrl_menu(){printf("1.查看 2.游戏 3.充值 4.修改 5.排序 6.返回\n");}//登录控制函数void log_ctrl(game_t *p,int *count,int *my){int chose=0,chose2=0;while(TRUE){chose=0;chose2=0;log_menu();printf("请选择:");scanf("%d",&chose);fflush_in();switch(chose){case 1: //登录if(log_in(p,count,my)==1)printf("登录失败\n"); else {printf("登录成功\n");ctrl(p,count,my);}break;case 2: //注册if(add_user(p,count)==1)printf("注册失败\n");elseprintf("恭喜您,注册成功\n");break;case 3: //退出printf("是否退出?\n1.是 2.否\n");printf("请选择:");scanf("%d",&chose2);fflush_in();if(chose2==1){if(exit_save(p,count)==0)printf("信息保存成功\n"); elseprintf("信息保存失败\n"); exit(0);}elselog_ctrl(p,count,my);break;default:printf("输入错误,请重新输入\n");}}}//登录函数 0-成功 1-失败int log_in(game_t *p,int *count,int *my){int i=0,flag=0;char name[30]="\0",pass[30]="\0";printf("用户名:");fgets(name,30,stdin);name[strlen(name)-1]='\0';flag=0;for(i=0;i<*count;i++)if(strcmp(p[i].name,name)==0){*my=i;flag=1;break;}if(flag==0){printf("用户不存在\n");return 1;}i=0;while(i<3){printf("密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';if(strcmp(p[*my].password,pass)==0){return 0;}printf("密码输入错误,请重新输入\n");i++;}if(i==3){printf("登录失败\n");printf("登录次数超过三次,您将退出系统\n");if(exit_save(p,count)==0) //保存信息printf("信息保存成功\n");elseprintf("信息保存失败\n");exit(1);}return 0;}//注册函数 0-成功 1-失败int add_user(game_t *p,int *count){int i=0;char name[30]="\0";char pass[30]="\0",pass2[30]="\0";if(*count>100){printf("注册用户已满\n");return 1;}printf("提示:用户名长度为3-28\n");printf("用户名:");fgets(name,30,stdin);name[strlen(name)-1]='\0';if(strlen(name)<3||strlen(name)>28){ //用户名长度3-28 printf("用户名长度不合法\n");return 1;}for(i=0;i<*count;i++){if(strcmp(p[i].name,name)==0){printf("已有同名用户名\n");return 1;}}strcpy(p[*count].name,name);printf("提示:密码长度6-28\n");printf("密码:");fgets(pass,30,stdin);pass[strlen(pass)-1]='\0';if(strlen(pass)<6||strlen(pass)>28){ //密码长度6-28 printf("密码长度不合法\n");return 1;}printf("确认密码:");fgets(pass2,30,stdin);pass2[strlen(pass2)-1]='\0';if(!(strcmp(pass,pass2))==0){printf("两次输入密码不一样\n");return 1;}strcpy(p[*count].password,pass);*count+=1;return 0;}//登录菜单函数void log_menu(){printf("1.登录 2.注册 3.退出\n");}//清空缓存void fflush_in(){char c='\0';c=getchar ();while(c!='\n'){c=getchar ();}}。