正文

好玩的猜数游戏(新)2007-04-15 19:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/24916.html

分享到:

两年前写了这个小游戏,昨天又看了一下代码,真的很烂----那时侯倒是挺觉得挺不错的,因为刚学,把书上的一个改编了一下.索性重写了一个,虽然算不上很好,但是从程序的结构来看比以前的要好,现在记录起来,做个比较. /*猜数游戏*/       /*程序产生一个随机数,游戏者输入数据进行猜测。管理员可输入密码,       其中普通管理员只能获得答案,超级管理员获得答案并能修改普通管理员密码*/ #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");}

阅读(2916) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册