当前位置:首页 » 《随便一记》 » 正文

devc++未成年保护模式系统_MCYH0206的博客

28 人参与  2021年12月29日 13:25  分类 : 《随便一记》  评论

点击全文阅读


       众所周知,现在的各大游戏都有未成年保护模式(非常烦人啊)。当然,这个系统用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点,如果不是则直接退出就行。由于代码过于简单,这里就不写了,获取时间的方法刚才说过了。

       如果你还有更好的方法,欢迎在下面评论提出喔!


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/32352.html

时间  方法  判断  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1