两年前写了这个小游戏,昨天又看了一下代码,真的很烂----那时侯倒是挺觉得挺不错的,因为刚学,把书上的一个改编了一下.索性重写了一个,虽然算不上很好,但是从程序的结构来看比以前的要好,现在记录起来,做个比较. /*猜数游戏*/ /*程序产生一个随机数,游戏者输入数据进行猜测。管理员可输入密码, 其中普通管理员只能获得答案,超级管理员获得答案并能修改普通管理员密码*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h> #define MAX 85#define BACKSPACE 8 const char ADMCODES[] = "nihao";//超级管理员个人身份密码const int SUPERADM = -110; //超级管理员密码 const int WRONG = 0;const int RIGHT = 1;const int QUIT = -1;const int EASY = 1;const int COMMON = 2;const int HARD = 3; int commonAdm = 0; //普通管理员密码 int CreateKey(int *range);//显示游戏规则并创建一个随机数 int Quit();/*放弃后可再来一次*/int Guess(int range);//玩家猜测一个数int Judge(int key, int answer);//判断答案是否正确 void Congratulation(int n);//恭喜答对 void SuperAdministrators(int key);//处理超级管理员int AdmMenu();//超级管理员管理菜单int Check();//核实超级管理员个人身份密码 void GetCode(char code[], int max);//输入密码 void ChangeCode();//修改密码 int main(void){ int range = 0;//根据玩家选择的难度,确定随机数的范围 int rightAnswer;//判断是否为正确答案,是则为RIGHT,否则为WRONG int count = 0;//累积玩家猜测的次数 int key, answer;//分别存储正确答案和玩家猜测的答案 while (1)//可以玩多次 { key = CreateKey(&range);//显示游戏规则并创建一个随机数 if (key == QUIT)//选择离开 { if (Quit() == WRONG)//再玩一次 continue; else //确实要离开 break; } count = 0; do { answer = Guess(range);//玩家猜测一个数 rightAnswer = Judge(key, answer);//判断答案是否正确 ++count; } while (rightAnswer == WRONG);//判断答案直到答对或选择离开 if (rightAnswer == QUIT)//选择离开 { if (Quit() == WRONG) continue; else break; } Congratulation(count);//恭喜答对 getchar();getchar(); } getchar(); return 0;} int CreateKey(int *range)//显示游戏规则并创建一个随机数 { int selection; int key; puts("\n\n猜数游戏: 电脑随机产生一个数字,你可以输入一个数字来进行猜测."); do { puts("\n1--容易等级."); puts("\n2--中等难度."); puts("\n3--高难度."); puts("\n-1--离开."); puts("\n请输入一个选择."); scanf("%d", &selection); } while (selection != -1 && selection < 1 || selection > 3); if (selection == EASY) *range = 100; else if (selection == COMMON) *range = 1000; else if (selection == HARD) *range = 10000; else return QUIT; printf("\n\n正在产生随机数,请等待。。。\n"); sleep(800); //暂停800毫秒 srand((unsigned)time(NULL)); key = rand() % *range + 1; return key; //返回随机数 } int Quit()/*放弃后可再来一次*/{ int choice; puts("\n哦,你放弃了!是真的要退出还是只想换一个数字?\n"); puts("请输入数字 0 选择再来一次,否则按其他数字键选择退出\n"); scanf("%d", &choice); return choice;} int Guess(int range)//玩家猜测一个数 { int guessValue; do { printf("\n\n选择一个 1 到 %d 之间的数字进行猜测:", range); puts("或者输入 -1 选择离开 :"); scanf("%d", &guessValue); } while (guessValue<1 && guessValue!=QUIT && guessValue!=SUPERADM && guessValue!=commonAdm || guessValue > range); return guessValue;} int Judge(int key, int answer)//判断答案是否正确 { int result = WRONG;//初始化为答案错误 //优先判断特殊值 if (answer == QUIT) result = QUIT; else if (answer == commonAdm) printf("\n哦,原来你是管理员,答案是 %d", key); else if (answer == SUPERADM) SuperAdministrators(key);//超级管理员 else if (answer > key) printf("\n你输入的数字 %d 太大了!\n", answer); else if (answer < key) printf("\n你输入的数字 %d 太小了!\n", answer); else result = RIGHT; return result;//返回result值,判断答案是否正确 } void SuperAdministrators(int key)//处理超级管理员{ int selection; if (Check() == WRONG)//退出游戏 { puts("对不起!你把你的个人身份密码给忘了。拜拜!"); getchar(); exit(0) ; } while (1)//进入超级管理员管理菜单,直到玩家选择看答案或着选择离开 { selection = AdmMenu(); if (selection == 1)//获取答案 { printf("\n答案是 %d", key); break; } else if (selection == 2)//修改普通管理员密码 ChangeCode(); else //退出游戏 { getchar(); exit(0) ; } }} int Check()//核实超级管理员个人身份密码 { char code[MAX]; int count = 0; puts("\n什么!你竟然是超级管理员!"); puts("为安全起见,请输入你的个人身份密码:"); GetCode(code, MAX); while(0 != strcmp(code, ADMCODES) && count < 3) { puts("输入错误,请重试!"); ++count; GetCode(code, MAX); } if(count == 3) return WRONG; else return RIGHT; } int AdmMenu()//超级管理员管理菜单 { int selection; puts("\n\n老板你好,您准备做些什么呢?"); do { puts("\n1--获取答案."); puts("\n2--修改密码."); puts("\n3--离开游戏."); puts("\n请输入一个选择."); scanf("%d", &selection); } while (selection < 1 || selection > 3); return selection;} void GetCode(char code[], int max)//输入密码 { char ch; int i = 0; fflush(stdin); while((ch = getch()) != '\r' && i < MAX) { if (ch == BACKSPACE) { if (i > 0)//用空格代替前一个数,并删除该空格 { code[--i] = '\0'; printf("\b \b"); } else putchar(7); //bell } else { code[i++] = ch; printf("*"); } } code[i] = '\0';} void ChangeCode()//修改密码 { int code_1, code_2; int count = 0; puts("请输入新密码(注意:密码应该为整型数据):"); scanf("%d", &code_1); do { if (count > 3) { puts("你太累了,请离开电脑去休息一会!再见!"); getchar();getchar(); exit(0) ; /*退出游戏*/ } puts("确认新密码:"); scanf("%d",&code_2); ++count; } while (code_1 != code_2) ;/*循环输入确认密码,直到用户输入正确或超过三次,自动退出*/ commonAdm = code_1; puts("\n 已建立新密码!"); printf("新的密码为 %d\n", code_1); } void Congratulation(int n)//恭喜答对 { printf("\n\n恭喜你答对了! 你总共猜了 %d 次!", n); if (n < 6) printf("\n这么快?你真是个天才!\n\n"); else if (n < 10) printf("\n还不错!你的智商至少在100以上!\n\n"); else printf("\n一般般,还需要继续努力哟!\n\n");}

评论