眾所周知,現在的各大游戲都有未成年保護模式(非常煩人啊),當然,這個系統用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,int m,int 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;
//以2021.09.01星期三開始算起
int y1,m1,d1;
for(y1=2021;y1<=y;y1++)
for(m1=9;m1<=m||y1<y&&m1<=12;m1++)
i+=y1==y&&m1==m?d:monthS[y1%400==0||y1%100!=0&&y%4==0][m1];//省掉if和else
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點,如果不是則直接退出就行,由于代碼過于簡單,這里就不寫了,獲取時間的方法剛才說過了,
如果你還有更好的方法,歡迎在下面評論提出喔!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301845.html
標籤:其他
