1 #include<iostream>//标准流
2 #include<ctime>//生成随机种子
3 #include<algorithm>//用于随机打乱数列
4 #include<vector>//保存历史
5 #include<windows.h>//暂停 设置颜色
6 #include<fstream>//文件流
7 #include<cstring>//字符串 快读
8 #define IL inline//内联函数加速调用
9 using namespace std;
10
11
12
13 int mode=2;
14 /*
15 0:Complete mode
16 1:Developer mode
17 2:Test mode
18 */
19
20 int TIME=0;//字符输出间隙(毫秒)
21
22 const int total[5]={21,6,5,5,5};
23 int stats[5];
24
25 const int a=10,b=11,c=12,d=13,e=14,f=15;//颜色
26
27 int array[43];//存数量
28
29 bool book[43];//记录是否查询
30
31 int tot=0;
32
33 bool flag;
34
35 vector<int> history;
36 vector<string> sentence;
37
38 IL void SetColor(unsigned short BackGroundColor,unsigned short ForeColor)
39 {
40 HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
41 SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
42 }
43
44 IL void gotoxy(int x, int y)
45 {
46 COORD pos;
47 pos.X = x - 1;
48 pos.Y = y - 1;
49 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
50 }
51
52 IL void sp(const char* str,int sleeptime=TIME)//SlowPrint
53 {
54 int i=0;
55 while(str[i]!='\0')
56 {
57 printf("%c", str[i]);
58 if(str[i]=='*') Sleep(sleeptime*30);//*则延长至30倍时间
59 if(str[i]=='\n'||str[i]==','||str[i]=='.') Sleep(sleeptime);//特殊符号再延长一倍
60 if(str[i]=='\b') Sleep(sleeptime*4);
61 Sleep(sleeptime);
62 i++;
63 }
64 }
65
66 IL void sp(string str,int sleeptime=TIME)
67 {
68 int i=0;
69 while(str[i]!='\0')
70 {
71 printf("%c", str[i]);
72 if(str[i]=='*') Sleep(sleeptime*30);//*则延长至30倍时间
73 if(str[i]=='\n'||str[i]==','||str[i]=='.') Sleep(sleeptime);//特殊符号再延长一倍
74 if(str[i]=='\b') Sleep(sleeptime*4);
75 Sleep(sleeptime);
76 i++;
77 }
78 }
79
80 IL void spsp(const char* str, int sleeptime=1)//freestyle的SlowPrint
81 {
82 int i=0;
83 while(str[i]!='\0')
84 {
85 printf("%c", str[i]);
86 Sleep(sleeptime);
87 i++;
88 }
89 }
90
91 //签名
92 IL void myname_small(int x,int y)
93 {
94 SetColor(15,0);
95 //H
96 gotoxy(x,y);
97 cout<<"■■■";
98 for(int i=y+1;i<y+3;i++){gotoxy(x,i);cout<<"■ ■";}
99 //S
100 gotoxy(x+4*2,y);cout<<"■";
101 gotoxy(x+5*2,y+1);cout<<"■";
102 gotoxy(x+6*2,y+2);cout<<"■";
103 gotoxy(x+7*2,y+1);cout<<"■";
104 gotoxy(x+8*2,y);cout<<"■";
105 //H
106 gotoxy(x+10*2,y);
107 cout<<"■■■";
108 for(int i=y+1;i<y+3;i++){gotoxy(x+10*2,i);cout<<"■ ■";}
109 }
110
111 //隐藏光标
112 HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
113 COORD coord;
114 IL void hide()
115 {
116 CONSOLE_CURSOR_INFO cursor_info={1,0};
117 SetConsoleCursorInfo(hout, &cursor_info);
118 }
119
120 IL void freestyle()
121 {
122
123 //spsp(" ********\n ************\n ####....#.\n #..###.....##....\n ###.......###### ### ###\n ........... #...# #...#\n ##*####### #.#.# #.#.#\n ####*******###### #.#.# #.#.#\n ...#***.****.*###.... #...# #...#\n ....**********##..... ### ###\n ....**** *****....\n #### ####\n ###### ######\n##############################################################\n#...#......#.##...#......#.##...#......#.##------------------#\n###########################################------------------#\n#..#....#....##..#....#....##..#....#....#####################\n########################################## #----------#\n#.....#......##.....#......##.....#......# #----------#\n########################################## #----------#\n#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n########################################## ############");
124 SetColor(f,c);
125 spsp(" ........................... \n .............**.......... \n ......**/@@@@@@@@@@@@@@]*....... \n . .....,/@@@[`*.*.**.****\\@@@\\*.... \n .....**/@@[*....... .. ......*,\\@@`*...... \n ....*,@@[**...... .....***O@@`..... \n ..**/@^.......... ...........\\@\\*... \n .*,@@**.......... ............=@\\... \n. ......,@@`............. ......*.....*=@@*. .. .\n. ....=@^*...*优*`*优* ...秀*秀*秀..*@@\\.. .\n. .....*@@*...,优/优/@O*.. ..*@秀@秀@@\\*..,@@*.... \n. .....=@^**.=优@优@@优^.. ..*\\O秀@秀O`*..*\\@*.. ...\n .. ...=@^..*,优\\O@优^**. ..*\\秀@秀@/`...*@@*......\n... ...=@^..**/@O优@=@o@^. ..**/@/*@秀^...*@@*.....\n.......*@@*...=@/`**[[[*. ..*@[*.=@@/*...,@@*. . \n. ......\\@`.*............ ..............*@@^.. . .\n .*@@`*........... ............*=@/*. \n .,@@^.... . .. ....*=@^*.. \n ...*\\@^*..... ..........*/@/*... \n ...**=@@`.... .. . ....**/@@`*... \n ......*\\@@\\****...............*/@@`*...... \n ........**.*\\@@@]**........*,/@@@/**.*..... \n ............*[\\@@@@@@@@@@@@[`*........... \n ................*.*.***.................. \n . ......................... .. . . \n");
126 Sleep(1500);
127 system("cls");
128 gotoxy(26,11);
129 SetColor(f,c);
130 sp("欢 迎 来 抽 小 优 秀 !\n",30);
131 Sleep(1000);
132 gotoxy(20,12);
133 sp("祝同学们抽奖大吉大利,小优秀红红火火!",30);
134 Sleep(1000);
135 gotoxy(35,13);
136 sp("Desigh and code by SOAF(send-off-a-friend)折柳",15);
137 myname_small(40,20);
138 Sleep(1000);
139 system("cls");
140 }
141
142 IL void init(){//初始化
143 memset(book,0,sizeof(book));
144 memset(stats,0,sizeof(stats));
145 tot=0;
146 flag=1;
147 //由于限定了小优秀的个数,所以必须先定量生成序列
148 int now=0;
149 for(int i=0;i<=4;i++)
150 for(int j=1;j<=total[i];j++)
151 array[++now]=i;
152 random_shuffle(array+1,array+43);//STL打乱
153 //for(int i=1;i<=42;i++) cout<<array[i]<<endl;//用于测验有没有打乱
154 sentence.push_back("祝你数小优秀数到手抽筋!!!");
155 sentence.push_back("愿你万事如意,努力有成功,买卖有收获,愿你发小优秀在今朝,兴小优秀在此刻!!!");
156 sentence.push_back("送你一个小优秀篮,低层装满小优秀;中间呈放小优秀;四周堆满小优秀;上面铺满了小优秀!!!");
157 sentence.push_back("祝抽奖大吉大利,小优秀红红火火!!!");
158 sentence.push_back("一份付出有大收获,一份繁忙有小优秀!!!");
159 sentence.push_back("小优秀茂盛达三江,江深水远凭你游,游到龙宫,再现王者风采.祝福抽奖大吉,秀到成功!!!");
160 sentence.push_back("你定能小优秀兴隆小优秀滚滚,宏图大展蒸蒸日上!!!");
161 sentence.push_back("吉祥如意罩着,招财进宝护着,财神爷看着,各路神仙把场捧着,小优秀不得才怪!!!");
162 sentence.push_back("恭祝小优秀滚滚达三江,小优秀兴隆通四海!!!");
163 sentence.push_back("愿你小优秀兴隆,小优秀广进,和气生小优秀,万事如小优秀,小优秀不断,开心走远!!!");
164 sentence.push_back("祝你得小优秀似春笋,一节更比一节高!!!");
165 sentence.push_back("祝你小优秀如海潮,后浪推着前浪跑,一浪更比一浪强!!!");
166 sentence.push_back("绽放花朵送小优秀,鞭炮响亮送小优秀,横幅红字送小优秀,崭新面貌迎小优秀!!!");
167 sentence.push_back("看你一脸福相,我就知道你是得小优秀的好材料!一双明目,照亮“小优秀”途和未来;一张笑脸,喜迎八方小优秀来;一只玉手,巧似福猫招小优秀快");
168 sentence.push_back("祝你小优秀兴隆,小优秀广进如滔滔江水连绵不绝!!!");
169 sentence.push_back("祝你小优秀不断,如黄河泛滥一发不可收拾!!!");
170 sentence.push_back("祝你小优秀大吉喜无边,小优秀滚滚伴君来;小优秀兴隆万事顺,小优秀通四海源贯南北;小优秀兴旺万事顺,繁荣昌盛小优秀滚滚来!!!");
171 sentence.push_back("奉天承运,皇帝诏曰:朕命人所管天象,发现将遇小优秀天气,点缀春雨,此乃吉兆,把握好此契机,你的小优秀一定兴隆,蒸蒸日上!!!");
172 //sentence.push_back("");
173 }
174
175 IL bool judge(string str)
176 {
177 if(str=="yes"||str=="y"||str=="YES"||str=="Y"||str=="ok"||str=="OK") return 1;
178 return 0;
179 }
180
181 IL bool judge()
182 {
183 string t;
184 cin>>t;
185 return judge(t);
186 }
187
188 IL void egg(int num);//鸭子下蛋了……
189
190 IL int read()//快读 防输入卡bug 指令
191 {
192 string str;
193 int ans=0;
194 cin>>str;
195 //instruction
196 if(str=="help")
197 {
198 cout<<"指令如下\n";
199 cout<<"save\t\t将所有数据(学号、小优秀个数、状态)保存至save.txt\n";
200 cout<<"show\t\t展示所有人的小优秀个数\n";
201 cout<<"list\t\t展示所有人是否已经抽过\n";
202 cout<<"show&list\t上面两个都展示\n";
203 cout<<"history\t\t输出历史记录\n";
204 cout<<"empty\t\t清空所有人的状态\n";
205 cout<<"refresh\t\t刷新所有人小优秀的个数\n";
206 cout<<"init\t\t全部初始化\n";
207 cout<<"cls\t\t清空屏幕\n";
208 cout<<"break\t\t结束抽奖\n";
209 cout<<"over\t\t同上\n";
210 cout<<"STATS\t\t统计信息\n";
211 cout<<"main\t\t重启\n";
212 return 0;
213 }
214 if(str=="save")//保存至save.txt
215 {
216 history.push_back(-1);
217 ofstream fout("save.txt",ios::out/*|ios::binary|ios::app*/);
218 for(int i=1;i<=42;i++) fout<<i<<" "<<array[i]<<" "<<book[i]<<endl;
219 return 0;
220 }
221 if(str=="show")//展示所有人的小优秀个数
222 {
223 history.push_back(-2);
224 cout<<"学号\t个数\n";
225 for(int i=1;i<=42;i++) cout<<i<<"\t"<<array[i]<<endl;
226 return 0;
227 }
228 if(str=="list")//展示所有人是否已经抽过
229 {
230 history.push_back(-3);
231 cout<<"学号\t状态\n";
232 for(int i=1;i<=42;i++) cout<<i<<"\t"<<(book[i]?"Yes":"No")<<endl;
233 return 0;
234 }
235 if(str=="show&list")//将上面两个都展示
236 {
237 history.push_back(-4);
238 cout<<"学号\t个数\t状态\n";
239 for(int i=1;i<=42;i++) cout<<i<<"\t"<<array[i]<<"\t"<<(book[i]?"Yes":"No")<<endl;
240 return 0;
241 }
242 if(str=="history")//输出历史记录
243 {
244 for(unsigned int i=0;i<history.size();i++)
245 {
246 cout<<i<<"\t";
247 if(history[i]<0) cout<<"Order:";
248 if(history[i]<=42&&history[i]>0){
249 cout<<"inquiry "<<history[i]<<endl;
250 continue;
251 }
252 if(history[i]<=-100){
253 cout<<"TIME "<<-history[i]-100<<endl;
254 continue;
255 }
256 switch(history[i]) {
257 case 0:{
258 cout<<"error instruction\n";
259 break;
260 }
261 case -1:{
262 cout<<"save\n";
263 break;
264 }
265 case -2:{
266 cout<<"show\n";
267 break;
268 }
269 case -3:{
270 cout<<"list\n";
271 break;
272 }
273 case -4:{
274 cout<<"show&list\n";
275 break;
276 }
277 case -5:{
278 cout<<"history\n";
279 break;
280 }
281 case -6:{
282 cout<<"empty\n";
283 break;
284 }
285 case -7:{
286 cout<<"cancel previous\n";
287 break;
288 }
289 case -8:{
290 cout<<"refresh\n";
291 break;
292 }
293 case -9:{
294 cout<<"cls\n";
295 break;
296 }
297 case -10:{
298 cout<<"break(gameover)\n";
299 break;
300 }
301 case -11:{
302 cout<<"init\n";
303 break;
304 }
305 case -12:{
306 cout<<"STATS\n";
307 break;
308 }
309 case -13:{
310 cout<<"mode ?\n";
311 break;
312 }
313 case -14:
314 case -15:
315 case -16:{
316 cout<<"mode "<<-13-history[i]-1<<endl;
317 break;
318 }
319 case -17:{
320 cout<<"main\n";
321 break;
322 }
323 case -99:{
324 cout<<"TIME error\n";
325 break;
326 }
327 case -18:{
328 cout<<"sentence\n";
329 break;
330 }
331 case -19:{
332 cout<<"message\n";
333 break;
334 }
335 default:{
336 cout<<"Undefined\n";
337 break;
338 }
339 }
340 }
341 if(history.empty()) cout<<"No history\n";
342 else cout<<history.size()<<" in total\n";
343 history.push_back(-5);
344 return 0;
345 }
346 if(str=="empty")//清空状态
347 {
348 history.push_back(-6);
349 cout<<"Are you sure you want to clear the list?(y/n)\n";
350 if(judge()) memset(book,0,sizeof(book)),tot=0;
351 else cout<<"Instruction cancel\n",history.push_back(-7);
352 return 0;
353 }
354 if(str=="refresh")//刷新小优秀的个数
355 {
356 history.push_back(-8);
357 cout<<"Are you sure to refresh the number of small excellent?(y/n)\n";
358 if(judge()) random_shuffle(array+1,array+43);//STL打乱
359 else cout<<"Instruction cancel\n",history.push_back(-7);
360 return 0;
361 }
362 if(str=="init")//初始化
363 {
364 history.push_back(-11);
365 cout<<"Are you sure you want to initialize?(y/n)";
366 if(judge()) init();
367 else cout<<"Instruction cancel\n",history.push_back(-7);
368 return 0;
369 }
370 if(str=="cls")
371 {
372 history.push_back(-9);
373 return -2;
374 }
375 if(str=="break"||str=="over")
376 {
377 history.push_back(-10);
378 tot=42;
379 flag=1;
380 return 0;
381 }
382 if(str=="STATS")
383 {
384 history.push_back(-12);
385 cout<<"优秀\t\t总数\t\t已获得\t\t剩余\n";
386 for(int i=0;i<=4;i++)
387 cout<<i<<"\t\t"<<total[i]<<"\t\t"<<stats[i]<<"\t\t"<<total[i]-stats[i]<<endl;
388 return 0;
389 }
390 if(str=="mode")
391 {
392 int t;
393 cin>>t;
394 if(t<3&&t>=0) mode=t,history.push_back(-13-t-1);
395 else history.push_back(-13);
396 return 0;
397 }
398 if(str=="main")
399 {
400 history.push_back(-17);
401 return -3;
402 }
403 if(str=="TIME")
404 {
405 int t;
406 cin>>t;
407 if(t<=200&&t>=0) TIME=t,history.push_back(-100-t);
408 else history.push_back(-99);
409 return 0;
410 }
411 if(str=="sentence")
412 {
413 sp(sentence[rand()%sentence.size()]);
414 history.push_back(-18);
415 return 0;
416 }
417 if(mode==2&&str=="message")
418 {
419 cout<<"请开始留言,并以‘#’结束\n";
420 ofstream mout("message.txt",ios::out|ios::app);
421 getchar();
422 char ch=getchar();
423 mout<<time(0)<<endl;
424 while(ch!='#'){
425 mout<<ch;
426 ch=getchar();
427 }
428 mout<<endl;
429 cout<<"留言成功!\n";
430 return 0;
431 }
432 for(unsigned int i=0;i<str.size();i++)//这才是读取......
433 {
434 if(str[i]>'9'||str[i]<'0'){
435 history.push_back(0);
436 return -1;
437 }
438 ans=ans*10+str[i]-'0';
439 }
440 history.push_back(ans);
441 if(ans>=43||ans<=0) return -1;
442 return ans;
443 }
444
445 int main()
446 {
447 system("color f0");
448
449 if(mode!=1)//非开发者模式
450 {
451 TIME=30;
452 hide();
453 freestyle();
454 }
455 if(mode==0){
456 system("title 元旦快乐!");
457 sp("说明:本抽奖程序自带检查,支持指令。输入help以查看指令。\n重新打开本程序后,数据将会刷新。\n所以即使不小心关了,只要“确认读取上次的记录”即可\n",10);
458 sp("大家应该都不会输错学号吧?\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b输错了也没关系就是了 \n",10);
459 sp("感谢大家测试bug!\n祝大家小优秀兴隆,小优秀广进如滔滔江水连绵不绝!!!\n",10);
460 }
461 if(mode==1){
462 TIME=0;
463 system("title Developer mode");
464 sp("说明:\n现在是Developer mode\nOrder:\nsave\nshow\nlist\nshow&list\nhistory\nempty\nrefresh\ninit\ncls\nbreak(over)\nSTATS\n参数:\n语速快(间隙=0ms)\n鸭子下蛋\n封面关闭\n光标显示\n允许输入指令\n");
465 }
466 if(mode==2){
467 system("title Test mode");
468 sp("说明:\n现在是测试模式。\n欢迎测试bug\n参数:\n语速正常(间隙=30ms)\n没有鸭子下蛋\n封面开启\n光标已隐藏\n允许输入指令\n");
469 sp("在输入学号页面输入help以寻求指令帮助\n");
470 }
471 system("pause");
472 system("cls");
473
474 //开始
475
476 system("color f0");
477
478 srand(time(NULL));
479
480 init();
481
482 cout<<"是否读取上次的记录?(yes/no)\n";
483
484 if(judge()){
485 ifstream fin("save.txt",ios::in);
486 int n;
487 for(int i=1;i<=42;i++) fin>>n>>array[i]>>book[i];
488 }
489 else{
490 ofstream fout("save.txt",ios::out/*|ios::binary|ios::app*/);
491 for(int i=1;i<=42;i++) fout<<i<<" "<<array[i]<<" "<<book[i]<<endl;
492 cout<<"已自动保存\n";
493 Sleep(500);
494 }
495 system("cls");
496
497 tot=0;
498 int num;
499 sp("开 始 抽 奖!!!\n",TIME*2);
500 while(true)
501 {
502 SetColor(f,0);
503 if(tot>=42&&flag)
504 {
505 cout<<"所有人都抽完了,是否结束?(y/n)\n不再询问这个问题(stop/s)\n";
506 string t;cin>>t;
507 if(judge(t)) break;
508 if(t=="stop"||t=="s") flag=0;
509 }
510
511 if(mode==2) cout<<"如果你对这个程序有什么问题,欢迎留言!\n留言方式:输入message\n";
512 cout<<"输入您的学号:";
513
514 num=read();
515
516 if(num==-2){//cls
517 system("cls");
518 cout<<"Instruction executed successfully";
519 for(int i=0;i<33;i++) cout<<"\b \b",Sleep(50);
520 continue;
521 }
522 if(num==-1){
523 SetColor(a,0);
524 cout<<"别瞎输,OK?\n\n\n";
525 Sleep(200);
526 continue;
527 }
528 if(num==-3){
529 system("cls");
530 main();
531 return 0;
532 }
533 if(num==0){
534 cout<<"Instruction executed successfully\n";
535 continue;
536 }
537 if(mode!=2) egg(num);
538 SetColor(c,0);
539 sp("恭喜!!!",TIME*3);
540 SetColor(f,0);
541 if(array[num]) SetColor(c,0),sp(sentence[rand()%sentence.size()]),cout<<endl;
542
543 switch(array[num]) {
544 case 1:{
545 sp("小优秀 * 1 !\n");
546 break;
547 }
548 case 2:{
549 sp("小优秀 * 2 !\n");
550 break;
551 }
552 case 3:{
553 sp("小优秀 * 3 !\n");
554 break;
555 }
556 case 4:{
557 sp("小优秀 * 4 !\n");
558 sp("看来你小优秀蛮多嘛。分点给大家哈!\n",TIME/2);
559 break;
560 }
561 default:{
562 if(num!=30)
563 sp("奖励俗蠊最高领导人王宇翔的一个吻!!!\n");
564 else
565 sp("自己亲自己一下?(开玩笑,别生气哈)\n");
566 sp("Sorry,没有小优秀咯……\n");
567 break;
568 }
569 }
570 if(book[num]) SetColor(f,6),cout<<"此学号已经抽过了\n";
571 else tot++,stats[array[num]]++;
572 book[num]=true;
573 SetColor(f,0);
574 cout<<endl<<endl;
575 }
576 cin.get();
577 cin.get();
578 system("cls");
579 SetColor(c,0);
580 system("title GOOD LUCK");
581 sp("\t\t\t\tover\n所有的学号都抽完了!\n\n请到save.txt中查看保存的数量\n\n没有得到小优秀也不要灰心\n\n不要一下子把运气用完了嘛~\n\n总之,祝大家元旦快乐!!!\a\a\a");
582 cin.get();
583 return 0;
584 }
585 /*
586
587 0 = 黑色 8 = 灰色
588 1 = 蓝色 9 = 淡蓝色
589 2 = 绿色 A = 淡绿色
590 3 = 浅绿色 B = 淡浅绿色
591 4 = 红色 C = 淡红色
592 5 = 紫色 D = 淡紫色
593 6 = 黄色 E = 淡黄色
594 7 = 白色 F = 亮白色
595
596
597
598 char ch=getchar();
599 int ans=0;
600 while(ch<'0'||ch>'9'&&ch!='s'&&ch!='\n')
601 {
602 ch=getchar();
603 }
604
605
606 switch() {
607 default:
608 }
609
610
611
612
613
614 */
615
616 void egg(int num)
617 {
618 if(num==30)
619 {
620 SetColor(d,1);
621 sp("恭喜本学号蠊\b\b翔哥,你这辈子都别想中小优秀了!!!!\n");
622 Sleep(3000);
623 }
624 if(num==8)
625 {
626 SetColor(f,8);
627 sp("Coder 表示他应该\b\b\b\b绝对没有作弊……\n",TIME/2);
628 }
629 if(num==5)
630 {
631 SetColor(e,0);
632 sp("腾总元旦快乐!\n");
633 }
634 if(num==35)
635 {
636 SetColor(e,0);
637 sp("吉祥如意罩着,招财进宝护着,财神爷看着,各路神仙把场捧着,小优秀不发(给我们)才怪!\nKing!求发小优秀!!!\n");
638 }
639 SetColor(f,0);//颜色还原
640 }