推荐用DEV-c++编译
新增账号验证
ver1.0.6新增多账号设置登录,修改密码,HELP,密码HASH算法加密,验证码 ,
密码强度检验,输入过滤更加严格,避免输入错误时刷屏现象 ,修复程序意外停止情况,登陆账号显示,保存最高纪录下次登录时显示最高纪录
HDU acm提交通过
//推荐用DEV-C++编译或 code blocks!!!!!
#include<math.h>
#include<string.h>
#include <cstdlib>
#include <time.h>
#include <windows.h>
#include<iostream>
using namespace std;
double jisuan(double x,double y,char ch)
{
if(ch=='+')
return x+y;
if(ch=='-')
return x-y;
if(ch=='*')
return x*y;
if(ch=='/')
return x/y;
}
int kuohaozuhe(int w,int x,int y,int z,char c1,char c2,char c3)
{
int flag=0;
double a[5];
char ch[5];
double s,p,val;
a[1]=w;a[2]=x;a[3]=y;a[4]=z;
ch[1]=c1;ch[2]=c2;ch[3]=c3;
if(ch[1]!='/'||(ch[1]=='/'&&a[2]!=0))// 顺序计算w&x&y&z 0不能做除数
{
s=jisuan(a[1],a[2],ch[1]);
if(ch[2]!='/'||(ch[2]=='/'&&a[3]!=0))
{
p=jisuan(s,a[3],ch[2]);
if(ch[3]!='/'||(ch[3]=='/'&&a[4]!=0))
{
val=jisuan(p,a[4],ch[3]);
if(fabs(val-24)<1e-3)
{
flag=1;
printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf\n",a[1],ch[1],a[2],ch[2],a[3],ch[3],a[4]);
}
}
}
}
if(ch[1]!='/'||(ch[1]=='/'&&a[2]!=0))// 先计算两端结果(w&x)&(y&z)
{
s=jisuan(a[1],a[2],ch[1]);
if(ch[3]!='/'||(ch[3]=='/'&&a[4]!=0))
{
p=jisuan(a[3],a[4],ch[3]);
if(ch[2]!='/'||(ch[2]=='/'&&p!=0))
{
val=jisuan(s,p,ch[2]);
if(fabs(val-24)<1e-3)
{ flag=1;
printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n",a[1],ch[1],a[2],ch[2],a[3],ch[3],a[4]);
}
}
}
}
if(ch[2]!='/'||(ch[2]=='/'&&a[3]!=0))// (w&(x&y))&z
{
s=jisuan(a[2],a[3],ch[2]);
if(ch[1]!='/'||(ch[1]=='/'&&s!=0))
{
p=jisuan(a[1],s,ch[1]);
if(ch[3]!='/'||(ch[3]=='/'&&a[4]!=0))
{
val=jisuan(p,a[4],ch[3]);
if(fabs(val-24)<1e-3)
{ flag=1;
printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf\n",a[1],ch[1],a[2],ch[2],a[3],ch[3],a[4]);
}
}
}
}
if(ch[2]!='/'||(ch[2]=='/'&&a[3]!=0))// w&((x&y)&z)
{
s=jisuan(a[2],a[3],ch[2]);
if(ch[3]!='/'||(ch[3]=='/'&&a[4]!=0))
{
p=jisuan(s,a[4],ch[3]);
if(ch[1]!='/'||(ch[1]=='/'&&p!=0))
{
val=jisuan(a[1],p,ch[1]);
if(fabs(val-24)<1e-3)
{ flag=1;
printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n",a[1],ch[1],a[2],ch[2],a[3],ch[3],a[4]);
}
}
}
}
if(ch[3]!='/'||(ch[3]=='/'&&a[4]!=0))// w&(x&(y&z))
{
s=jisuan(a[3],a[4],ch[3]);
if(ch[2]!='/'||(ch[2]=='/'&&s!=0))
{
p=jisuan(a[2],s,ch[2]);
if(ch[1]!='/'||(ch[1]=='/'&&p!=0))
{
val=jisuan(a[1],p,ch[1]);
if(fabs(val-24)<1e-3)
{ flag=1;
printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n",a[1],ch[1],a[2],ch[2],a[3],ch[3],a[4]);
}
}
}
}
return flag;
}
int yunsuanfupaixu(int w,int x,int y,int z)//运算符排序
{
int flag=0;
int i,j,k;
char ch[6]="0+-*/";
for(i=1;i<5;i++) //运算符排序
{
for(j=1;j<5;j++)
{
for(k=1;k<5;k++)
{
if(kuohaozuhe(w,x,y,z,ch[i],ch[j],ch[k])==1)
{
flag=1;
}
}
}
}
return flag;
}
int shuzipaixu(int w,int x,int y,int z)//数字排序
{
int flag=0;
int a[5]={0,w,x,y,z};
int i,j,k,l;
for(i=1;i<5;i++)
{
for(j=1;j<5;j++)
{
if(i!=j)
{
for(k=1;k<5;k++)
{
if(k!=i&&k!=j)
{
for(l=1;l<5;l++)
{
if(l!=i&&l!=j&&l!=k)
{
if(yunsuanfupaixu(a[i],a[j],a[k],a[l])==1)
flag=1;
}
}
}
}
}
}
}
// if(!flag)
// puts("NO RESULT");
return flag;
}
struct node
{
int hashpas,record;
}info;
int jiancezhanghao(char *name)
{
char place[150]="C:\\Program Files\\";
FILE*user;
strcat(place,name);
strcat(place,".dat");
if((user=fopen(place,"rb"))==NULL)
return 0;
fclose(user);
return 1;
}
int pasjiance(char *pas)
{
int i,flag=0,tem=1;
if(strlen(pas)<7)
{printf("长度小于7\n"); flag=1;}
for(i=1;pas[i]!=0;i++)
if(pas[i]-pas[i-1]==1)
tem++;
if(tem==i)
{ puts("密码递增"); flag=1;}
tem=1;
for(i=1;pas[i]!=0;i++)
if(pas[i]-pas[i-1]==-1)
tem++;
if(tem==i)
{ puts("密码递减"); flag=1;}
tem=1;
for(i=1;pas[i]!=0;i++)
if(pas[i]-pas[i-1]==0)
tem++;
if(tem==i)
{puts("密码字符重复"); flag=1;}
tem=0;
for(i=0;pas[i]!=0;i++)
if(pas[i]>='0'&&pas[i]<='9')
tem++;
if(tem==i)
{puts("全为数字"); flag=1;}
tem=0;
for(i=0;pas[i]!=0;i++)
if(pas[i]>='a'&&pas[i]<='z')
tem++;
if(tem==i)
{puts("全为小写"); flag=1;}
tem=0;
for(i=0;pas[i]!=0;i++)
if(pas[i]>='A'&&pas[i]<='Z')
tem++;
if(tem==i)
{puts("全为大写"); flag=1;}
if(flag)
puts("\n请重新输入密码");
return flag;
}
void yanzhengma(char*username)
{
char yzm[5],pasword[100];
system("CLS");
while(1)
{
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名: %s\n",username);
puts("请输入密码: *******");
printf("请输入验证码: ");
srand(time(0));
for(int k=0;k<4;k++)
{
yzm[k]=rand()%25+'a';
printf("%c",yzm[k]);
}
putchar(10);
yzm[4]=0;
scanf("%s",pasword);
if(strcmp(pasword,yzm)==0)
break;
system("CLS");
}
}
int hash(char* pas)
{
int i,s=0;
for(i=0;pas[i]!=0;i++)
s=s*131+pas[i];
return s;
}
void jishi(char*p,int count,int ms)
{
printf("%s",p);
for(int i=0;i<count;i++)
{
printf("。");
Sleep(ms);
}
putchar(10);
}
int zhuanhuan(char*jb)
{
int s=0,i;
for(i=0;jb[i]!=0;i++)
s=s*10+jb[i]-'0';
return s;
}
int qishiye()
{
int xuanze;
char tem[100];
printf("=============休闲小游戏==============\n\n");
printf("请选择:\n1.创建账号 2.登录账号 3.HELP\n");
while(scanf("%s",tem),xuanze=zhuanhuan(tem),!(xuanze==1||xuanze==2||xuanze==3))
{
printf("输入错误,请重新输入\n");
}
system("CLS");
return xuanze;
}
void xuanxiang1(char*username)
{
FILE* userw;
char pasword[100],passs[100];
char place[150]="C:\\Program Files\\";
int hashpas;
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名:");
while(scanf("%s",username),jiancezhanghao(username))
{
printf("账号已存在,请输入其他账号:");
}
system("CLS");
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名: %s\n",username);
printf("请输入密码:");
while(scanf("%s",pasword),pasjiance(pasword))
{
//轻度检验
}
system("CLS");
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名: %s\n",username);
printf("请输入密码: *******\n");
printf("请再次输入密码:");
while(scanf("%s",passs),strcmp(passs,pasword))
{
printf("密码错误,请重新输入:");
}
// system("CLS");
yanzhengma(username);
strcat(place,username);
strcat(place,".dat");
hashpas=hash(pasword);
userw=fopen(place,"wb");
// fputs(pasword,userw);
// struct node
// {
// int hashpas,record;
// }info;
info.hashpas=hashpas;
info.record=0;
// fwrite(&hashpas,sizeof(int),1,userw);
// int val=0;
fwrite(&info,sizeof(node),1,userw);
fclose(userw);
jishi("正在创建账号,请稍后 ",5,500);
puts("账号创建成功!");
printf("账号: %s 密码: %s\n\n",username,pasword);
system("pause");
system("CLS");
}
void xuanxiang2(char*username)
{
FILE*userr;
char pasword[100];
char place[150]="C:\\Program Files\\";
int intpas;
int hashpas;
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名:");
while(scanf("%s",username),!jiancezhanghao(username))
{
printf("账号不存在,请重新输入:");
}
strcat(place,username);
strcat(place,".dat");
userr=fopen(place,"rb");
fread(&intpas,sizeof(int),1,userr);
fclose(userr);
system("CLS");
printf("=============休闲小游戏==============\n\n");
printf("请输入用户名: %s\n",username);
printf("请输入密码:");
while(scanf("%s",pasword),hashpas=hash(pasword),intpas!=hashpas)
{
//密码检验
puts("密码错误,请重新输入");
}
// system("CLS");
yanzhengma(username);
jishi("正在登陆 ",5,300);
puts("登陆成功");
}
void kaishi(char*username)
{
int a[5],i,flag;
int jibie,tem;
char panduan[20];
int max=0;
char pasword[100];
int val=0;
char jb[100];
FILE *userr;
char place[150]="C:\\Program Files\\";
int xuanze;
strcat(place,username);
strcat(place,".dat");
userr=fopen(place,"rb");
fread(&info,sizeof(node),1,userr);
fclose(userr);
// printf("%d %d ",info.hashpas,info.record);
system("CLS");
printf("===欢迎使用速算24点游戏===\n请选择以下操作\n");
printf("1.开始游戏\n2.修改账号密码\n3.提交HIGHEST RECORD\n\n");
while(scanf("%s",&jb),xuanze=zhuanhuan(jb),!(xuanze>0&&xuanze<4))
{
printf("输入错误,请重新输入:");
}
if(xuanze==2)
{
puts("===游戏账号秘密重置===");
userr=fopen(place,"rb");
{
fread(&info,sizeof(node),1,userr);
fclose(userr);
// fclose(u1); fclose(u2);
puts("请输入新密码");
while(scanf("%s",pasword),pasjiance(pasword))
{
//密码检验
}
info.hashpas=hash(pasword);
userr=fopen(place,"wb");
//fputs(ch,u1);
fwrite(&info,sizeof(node),1,userr);
fclose(userr);
jishi("正在同步至服务器",8,300);
putchar(10);
printf("密码重置成功,新密码 %s\n",pasword);
// strcpy(username,ch);
system("pause");
}
system("CLS");
}
else if(xuanze==3)
{
jishi("正在提交HIGHEST RECORD",8,300);
putchar(10);
printf("提交成功,感谢您的参与\n\n");
system("pause") ;
system("CLS");
}
else
{
system("CLS");
}
while(1)
{
printf("====速算24点 BY青春微凉====\n");
printf("\n 当前登录账号: %s\n\n",username);
userr=fopen(place,"rb");
fread(&info,sizeof(node),1,userr);
max=info.record;
printf(" HIGHEST RECORD: %d\n",info.record);
fclose(userr);
printf(" YOU NOW HAVE %d SCORES\n",val);
printf(" 请输入难度级别\n 范围1 ~ 12之间的整数:");
while(scanf("%s",jb),jibie=zhuanhuan(jb),!(jibie>0&&jibie<13))
{
printf(" 输入错误,请重新输入: ");
}
putchar(10);
tem=jibie;
if(jibie<=3)
jibie=6;
else if(jibie>3&&jibie<=6)
jibie=jibie*3+1;
else if(jibie>=7&&jibie<=10)
jibie=jibie*3;
else if(jibie>=11&&jibie<=12)
jibie=jibie*3+1;
if(tem<=10)
{
srand(time(0)); //根据系统时间设置随机数种子
for(i=1;i<5;i++)
{
a[i] = rand() % jibie;
printf("%d ",a[i]);
}
}
else
{
srand(time(0)); //根据系统时间设置随机数种子
for(i=1;i<3;i++)
{
a[i]=rand()%jibie;
printf("%d ",a[i]);
}
jibie=jibie-5;
srand(time(0)); //根据系统时间设置随机数种子
for(i=3;i<5;i++)
{
a[i] =-rand() % jibie;
printf("%d ",a[i]);
}
}
puts("\n以上数字是否可以计算出24 ? Y/N:");
while(scanf("%s",panduan),!(panduan[0]=='y'||panduan[0]=='Y'||panduan[0]=='n'||panduan[0]=='N'))
{
printf("输入错误,请重新输入: ");
}
flag=shuzipaixu(a[1],a[2],a[3],a[4]);
if(flag==1&&(panduan[0]=='Y'||panduan[0]=='y'))
{
puts("\n YOU ARE CLEVER!");
val=val+tem%13;
}
else if(flag==0&&(panduan[0]=='N'||panduan[0]=='n'))
{
puts("\n YOU ARE CLEVER!");
val=val+tem%13;
}
else
{
puts("\nYOU SHOULD GOOD GOOD STUDY,DAY DAY UP!");
val=val-tem%13;
}
if(val>max)
{
puts(" A NEW RECORD !\n YOU ARE VERY CLEVER ,\n Einstein CAN NOT CATCH UP WITH YOU!");
userr=fopen(place,"rb");
fread(&info,sizeof(node),1,userr);
fclose(userr);
info.record=val;
userr=fopen(place,"wb");
fwrite(&info,sizeof(node),1,userr);
max=val;
fclose(userr);
}
system("PAUSE");
system("CLS");
}
//printf("%s ",username);
}
int main()
{
char username[100];
int xuanze;
loop: xuanze=qishiye();
if(xuanze==1)
{ xuanxiang1(username); kaishi(username);}
else if(xuanze==2)
{
xuanxiang2(username);
kaishi(username);
}
else if(xuanze==3)
{printf("=============休闲小游戏==============\n\n");
printf("欢迎使用本游戏,如有疑问请加\nQQ 772478760\n欢迎关注官方博客\nhttp://blog.csdn.net/qq909157370\n\n");
system("pause");
system("CLS");
goto loop;
}
}