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