正文

好玩的猜数游戏(新)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");
}

阅读(2770) | 评论(1)


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

评论

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