猜数游戏就是让系统随机生成一个1~100的随机数,然后用户通过输入猜测的数字让系统做出相应的猜大了或者猜小了或者猜对了的反馈,然后让用户再次输入数字,如此循环,最多十次。系统的优化内还包含了密码及密码的回显,若不需要输入密码操作,直接把程序里的password()去掉即可。
这个程序整体可以分为:进入系统-密码函数-游戏函数。而在密码函数里又包含了:输入密码的回显(即输入密码后不会显示输入的密码,而是“*”),输入密码的存储,输入密码的比对,以及输错三次密码后强制退出的程序。游戏函数里包含了随机数的生成,用户猜测数字的输入及比对,以及十次都未猜中结束游戏。
密码:
密码的存储可以使用整形、浮点型、以及字符型,输入的密码也应保持相应的类型,即存储用的整形,输入也应用整形。不过,我个人推荐用字符型,一是密码一般不可能只有简单的数字,二来用字符型方便密码的回显。
正确密码的存储用一个字符型的数组便能解决:char PWD[10]={"123456"}。此处使用的123456,读者可自行更改,大小写字符、数字及特殊符号都可以使用,不过,在输入期间出现错误时无法使用back键(删除键),系统会自动将其存储为字符。
输入密码的存储同样用一个字符数组解决,不过得为其赋上初始值:char key[10]={0}。此处补充一下,赋值只将key[0]赋值成了0,但不必担心后面的数字,系统会将其自动赋值成0。
密码的输入:因为使用的是字符型数组,所以在输入时需要构架一个for循环框架。不过有一点值得我们注意:输入密码最多位数只能是9位,第十位会留给回车,若读者需要更长的密码输入,可将两个字符型数组加长,即:char PWM[30]={“123456”}。不过,输入回车时,回车也会被当成一个字符存储到数组里面,这样再去比对数组的话就会出现错误,系统会判定两者为不同的答案。因此,我们可以用一句if(key[i]=='\r') key[i]=0;即可。
密码的回显:
密码的回显需要用到头文件conio.h里面的getch()函数,getch()不同于getchar()的地方在于其不会将输入的字符回显到屏幕上,因此在每次录入一个字符后再输出一个“*”,便能达到预期效果。
密码的比对:由于需要比对的是两个字符型数组,因此我们需要用到头文件string.h里面的strcmp(),其一般格式为:strcmp(字符型数组1,字符型数组2)。若前者大于后者,则返还1,反之,则返还-1;若两者相等,则返还0。因此可以在条件语句中加入strcmp(key,PWM)!=0或者strcmp(key,PWM)==0即可。密码输错三次后将强制退出程序,引用头文件Stdlib.h里面的exit(0)即可。清屏操作为system("CLS")。下面代码里的Pr()函数里的内容为:printf("\t\t\t\t\t\t欢迎进入猜数游戏!\n\n\n");下面是sleep()函数(头文件为time.h)的代码:
int sleep(unsigned long x) //无符号长整形x
{ //x单位为毫秒
clock_t start=clock(); //定义开始时间,并记录
clock_t end; //定义结束时间
do
{
if ((end=clock())==(clock_t)-1)
{
return 0;
}
} while(1000*(end-start)/CLOCKS_PER_SEC<x);
return 1; //控制权返还主函数
}
密码的子程序:
void password()
{
int i,j;char key[10]={0},PWD[10]={"123456"};
for(j=0;;j++)
{
printf("\t\t\t\t请输入密码:");
for(i=0;i<10;i++)
{
key[i]=getch();
if(key[i]=='\r')
{
key[i]=0; //将最后输入的回车赋值为0确保其与密码一致
break; //跳出输入程序
}
printf("*"); //回显“*”
}
if(strcmp(key,PWD)!=0) //比较两组数组
{
if(j==2) //第一次输入密码,j=0,此后累加,第三次输入时,虽然j=2
{ //但只要第三次输入的密码没有错,此语句便不会执行
printf("\n\t\t\t\t密码已错误3次!程序终止!");
exit(0);
}
printf("\n\t\t\t\t密码错误!请重新输入!\n");
sleep(500); //延时0.5s后清屏
system("CLS");
Pr(); //因为清屏后所有内容都没了,所以这里重新输入欢迎字符
} //让界面更让人接受(若要求不高可省略)
else
{
system("CLS");
break;
}
}
}
游戏:
游戏里唯一值得说的应该只有产生随机数这点,同样是运用头文件time.h,用srand((int)time(0));进行初始化,再用a=rand()%100+1;将产生的随机数赋值给a。rand()%100+1可以这样理解:rand()是随机产生一个数字,%100是将这个随机产生的数字进行取余,取得的余数只可能是0~99,而后面的+1则是将0~99转成了1~100。若还不能理解,可以这样记:rand()%n意为产生随机数0~n-1,在后面利用加号或减号则是在0~n-1的基础上进行加减。
游戏子函数:
int game()
{
int a,n=1,ges;
int *p=⩾ //此处的*p为指针,可以不用
srand((int)time(0));
a=rand()%100+1;
do
{
printf("\t\t\t\t\t\t请输入猜测的数字:");
scanf("%d",p); //若不用指针*p,可将此处的p更改为&ges
if(a==*p) //若不用指针*p,可将此处改为ges,下同
{
printf("\t\t\t\t\t\t猜对了!\n\t\t\t\t\t\t你一共猜了%2d次!",n);
break;
}
else if(a>*p)
printf("\t\t\t\t\t\t猜小了!\n");
else if(a<*p)
printf("\t\t\t\t\t\t猜大了!\n");
n++;
}while(n<=10);
if(n==11) //玩家只有十次机会,n的初始值为1,所以当n=11时结束游戏
printf("\t\t\t\t\t\t很遗憾都没猜对……");
}
整体代码:
#include<stdio.h>
#include<time.h> //重置随机数+延时
#include<conio.h> //回显
#include<stdlib.h> //随机数+清屏+退出程序
#include<string.h> //密码比较
void password();
int game();
void Pr();
int sleep(unsigned long x);//延时
int main()
{
Pr();
password();
Pr();
game();
}
void password()
{
int i,j;char key[10]={0},PWD[10]={"123456"};
for(j=0;;j++)
{
printf("\t\t\t\t请输入密码:");
for(i=0;i<10;i++)
{
key[i]=getch();
if(key[i]=='\r')
{
key[i]=0;
break;
}
printf("*");
}
if(strcmp(key,PWD)!=0)
{
if(j==2)
{
printf("\n\t\t\t\t密码已错误3次!程序终止!");
exit(0);
}
printf("\n\t\t\t\t密码错误!请重新输入!\n");
sleep(500);
system("CLS");
Pr();
}
else
{
system("CLS");
break;
}
}
}
int game()
{
int a,n=1,ges;
int *p=⩾
srand((int)time(0));
a=rand()%100+1;
do
{
printf("\t\t\t\t\t\t请输入猜测的数字:");
scanf("%d",p);
if(a==*p)
{
printf("\t\t\t\t\t\t猜对了!\n\t\t\t\t\t\t你一共猜了%2d次!",n);
break;
}
else if(a>*p)
printf("\t\t\t\t\t\t猜小了!\n");
else if(a<*p)
printf("\t\t\t\t\t\t猜大了!\n");
n++;
}while(n<=10);
if(n==11)
printf("\t\t\t\t\t\t很遗憾都没猜对……");
}
void Pr()
{
printf("\t\t\t\t\t\t欢迎进入猜数游戏!\n\n\n");
}
int sleep(unsigned long x) //无符号长整形x
{ //x单位为毫秒
clock_t start=clock(); //定义开始时间,并记录
clock_t end; //定义结束时间
do
{
if ((end=clock())==(clock_t)-1)
{
return 0;
}
} while(1000*(end-start)/CLOCKS_PER_SEC<x);
return 1; //控制权返还主函数
}
由于时间函数编者还未有太多接触,故未作过多讲解,读者可在互联网上寻找相关介绍。
感谢阅读!