众所周知,现在的各大游戏都有未成年保护模式(非常烦人啊)。当然,这个系统用c++也是可以做出来的,大家如果想给自己编的游戏设置这个系统,可以参考以下方法:
虽然大家都很熟悉这个系统,但先介绍一下它的规定:未满18岁的游戏用户只能在8~22点获取游戏服务,每日不超1.5小时(我们就不考虑节假日了,直接一视同仁),这是旧规定。前几天又出了新规定,每周五、六、日晚上8~9点才能玩游戏。我们新旧规定都介绍一下。
那么要怎样实现呢?
1.实名注册
//我们先定义一个时间的结构体,包括年、月、日、小时、分钟、秒
struct Time
{
int year,month,day,hour,minute,second;
};
//我们再定义一个结构体,包括玩家的出生年月日和年龄
struct Player
{
int y,m,d,age;
};
Player me;//定义一个me
bool judge_num(string num)//用于避免某些玩家乱输入身份证号码
{
int i,k=0;
int xs[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char x[11]={'1','0','X','9','8','7','6','5','4','3','2'};
for(i=0;i<17;i++)
k+=(num[i]-'0')*xs[i];
k%=11;
return (x[k]==num[17]);//采用判断校验码的方式
}
void namek()
{
printf("请输入姓名:");
string num;
bool flag;
cin>>num;
do
{
printf("请输入身份证号码:");
cin>>num;
flag=judge_num(num);
if (flag==0)
printf("输入有误,请重新输入!\n");
}
while(flag==0);
int y,m,d;
y=(num[7]-'0')*1000+(num[8]-'0')*100+(num[9]-'0')*10+(num[10]-'0');
m=(num[11]-'0')*10+(num[12]-'0');
d=(num[13]-'0')*10+(num[14]-'0');
Time now=gottime();//gottime在下面会提到
me.y=y;
me.m=m;
me.d=d;//保存数据
me.age=(now.year-me.y)+(now.month>me.m||now.month==me.m&&now.day>me.d);//计算年龄
}
这里给大家普及一下身份证的校验码计算方法:将身份证号码前17位分别乘以7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,然后模11,得到的余数分别为0,1,2,...,10,对应1,0,X,9,8,7,6,5,4,3,2这11个数字,也就是校验码。我们在判断时只需计算一下校验码,判断是不是合法的即可(也就是说姓名在这儿没用)。
2.获取当前时间
只有获取了当前的时间,才能判断该玩家能否进入游戏。
//然后就需要获取当前时间了,有个很好用的方法:
Time gottime()
{
Time TIME;
time_t now=time(0);
tm*ltm=localtime(&now);
TIME.year=1900+ltm->tm_year;
TIME.month=1+ltm->tm_mon;
TIME.day=ltm->tm_mday;
TIME.hour=ltm->tm_hour;
TIME.minute=ltm->tm_min;
TIME.second=ltm->tm_sec;
return TIME;
}
这样,我们通过调用gottime()函数,就可以获取当前的详细时间了。
3.判断今天星期几(新规定)
这个问题在平时考试时经常出现,计算方法当然是越简单越好,考虑电脑的优质性能,我们采用笨方法(但是很实用,考试除外)
int getwday()
{
int y,m,d;
const int monthS[2][13]=
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31},
};
int i;
scanf("%d%d%d",&y,&m,&d);
//以2021.09.01星期三开始算起
int y1,m1,d1;
for(y1=2021;y1<=y;y1++)
for(m1=9;m1<=m||y1<y&&m1<=12;m1++)
{
printf("%d.%d has %d days\n",y1,m1,y1==y&&m1==m?d:monthS[y1%400==0||y1%100!=0&&y%4==0][m1]);
if (y1==y&&m1==m)
i+=d;
else
i+=monthS[y1%400==0||y1%100!=0&&y%4==0][m1];
}
return (i+1)%7+1;
}
这就是很暴力的一个月一个月的算的方法。
4.时间限制
这里就不写代码了,因为稍有点复杂。方法就是每次关闭游戏时使用clock()函数记录本次游戏的时间,然后保存起来,如果今天之内再次打开游戏则将时间累加,如果一天过去了,则清空保存的数据重新记录。
5.旧规定判断方法
bool baohu()
{
Time jk=gottime();
int m=jk.hour;
if (m<=8||m>=22)
{
cout<<"你好,根据国家政策,保护模式限定8点~22点才能登录游戏,请退出!\n";
return 1;
}
return 0;
}
只需判断时间即可
6.新规定判断方法
先判断是否是在周五~周日,其次判断是否在20~21点,如果不是则直接退出就行。由于代码过于简单,这里就不写了,获取时间的方法刚才说过了。
如果你还有更好的方法,欢迎在下面评论提出喔!