为增加游戏的趣味性,待猜的数字可使用一个产生1-500以内的随机整数,可按以下方式计算这个整数(%为取余操作):
1-500以内的随机整数=随机整数%499+1
可借助stdlib.h中定义的srand函数来生成公式右边所需要的随机数,该函数需要一个数值做为产生随机数的种子(也就是这个函数的唯一个参数),通常使用当前时间值作为参数,当前时间值可以通过time函数(以0做为参数调用,该函数在time.h中定义)。
比如下面代码产生2个随机整数:
#include
#include
#include
int main()
{
srand((int)time(0));
printf("第一个随机数:%d 第二个随机数:%d\n",rand()%499+1,rand()%499+1);
}
dp@dp:~/cquick % gcc a.c -o mytest
dp@dp:~/cquick % ./mytest
第一个随机数:429 第二个随机数:44
可将上面代码组合成本程序的第一个自定义函数getnumber,供main函数调用。最后代码如下:
#include
#include
#include
int getnumber(){
srand((int)time(0));
return rand()%499+1;
}
int main(){
int mynum;
int ispass=0;
while(1){
printf("你好,请输入一个数字:");
scanf("%d",&mynum);
if (mynum>500 ||mynum<1){
printf("数字仅限于1-500之间,请重新运行本程序!\n");
}
else{
printf("\n你输入的数字是:%d\n",mynum);
break;
}
}
printf("number:%d\n",getnumber());
}
dp@dp:~/cquick % gcc guessnum.c -o myguess
dp@dp:~/cquick % ./myguess
你好,请输入一个数字:55
你输入的数字是:55
number:109
程序最后一个printf语句取得要猜的随机整数后,输出到屏幕,这只是测试(游戏中可不能把结果告诉玩家,接下来,将对这个程序继续完善,将去掉这个printf语句)。
(5)反复接受玩家输入,只到数字猜中为止
C程序通过else if语句块可实现一组条件语句块拥有多个不同的条件语句,它的使用形如:
if (条件1){
…
}
else if(条件2){
…
}
Else if(条件3){
…
}
…
…
Else if(条件n){
…
}
Else{
…
}
实现这一步的功能使用了这个语句块结构。
#include
#include
#include
int getnumber(){
srand((int)time(0));
return rand()%499+1;
}
int main(){
int mynum;
int ispass=0;
int guessnum=getnumber();
while (1){
while(1){
printf("你好,请输入一个数字:");
scanf("%d",&mynum);
if (mynum>500 ||mynum<1){
printf("数字仅限于1-500之间\n");
}
else{
printf("\n你输入的数字是:%d\n",mynum);
break;
}
}
if (mynum>guessnum){
printf("数字大了!\n");
}
else if(mynum
dp@dp:~/cquick % gcc guessnum.c -o myguess
dp@dp:~/cquick % ./myguess
你好,请输入一个数字:55
你输入的数字是:55
数字小了!
你好,请输入一个数字:280
你输入的数字是:280
数字小了!
你好,请输入一个数字:350
你输入的数字是:350
数字小了!
你好,请输入一个数字:400
你输入的数字是:400
数字小了!
你好,请输入一个数字:488
你输入的数字是:488
数字大了!
你好,请输入一个数字:420
你输入的数字是:420
数字小了!
你好,请输入一个数字:450
你输入的数字是:450
数字大了!
你好,请输入一个数字:440
你输入的数字是:440
数字大了!
你好,请输入一个数字:430
你输入的数字是:430
祝贺您,您猜中了!
(6)自动猜数算法
能不能让电脑程序拥有智能,让程序来猜数字呢?肯定可以,通过一定的算法就能实现。什么是算法?
算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃拉托斯特尼筛法,线性方程组求解的算法。三国代的刘徽给出求圆周率的算法:刘徽割圆术。
欧几里得算法被人们认为是史上第一个算法。第一次编写程序是Ada Byron于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。
算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。
为了能让程序实现自动猜数,必须假设一个前提:程序不知道要猜的数字,也就是说这个算法中只能与要猜的数字进行比较,而不能直接“知道”要猜的数字值。可将算法设计如下:
第一步,设数字范围R为1-500。
第二步,取范围R以内的中间值A,把A作为程序模仿人类猜测出的数字。
第三步,将猜测的数字A与被猜的结果B比较
(1)如果A>B,则将R的上限设为A,回到第二步。
(2)如果A
(3)如果A=B,则退出程序,提示猜中数字,进入第四步。
第四步,在屏幕上输出A和B,并提示猜中数字。
根据上面的算法来编写以下程序:
#include
#include
#include
int getnumber(){
srand((int)time(0));
return rand()%499+1;
}
int main(){
int mynum;
int ispass=0;
int guessnum=getnumber();
int myrange[2]={1,500};
while (1){
mynum=(myrange[0]+myrange[1])/2;
if (mynum>guessnum){
printf("程序猜的数字为%d,数字大了!\n",mynum);
myrange[1]=mynum;
}
else if(mynum
运行后,结果为:
dp@dp:~/cquick % gcc guessnum.c -o myguess
dp@dp:~/cquick % ./myguess
程序猜的数字为250,数字大了!
程序猜的数字为125,数字小了!
程序猜的数字为187,数字大了!
程序猜的数字为156,数字小了!
程序猜的数字为171,数字大了!
程序猜的数字为163,数字小了!
程序猜的数字为167, 被猜的数字为167,猜中了!
dp@dp:~/cquick %