为增加游戏的趣味性, 待猜的数字可使用一个产生 1-500 以内的随机整数, 可按以下方式计算这个整数 (% 为取余操作):
1-500 以内的随机整数 = 随机整数 I9+1
可借助 stdlib.h 中定义的 srand 函数来生成公式右边所需要的随机数, 该函数需要一个数值做为产生随机数的种子 (也就是这个函数的唯一个参数), 通常使用当前时间值作为参数, 当前时间值可以通过 time 函数 (以 0 做为参数调用, 该函数在 time.h 中定义).
比如下面代码产生 2 个随机整数:
- #include?<stdio.h>
- #include?<stdlib.h>
- #include?<time.h>
- 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?<stdio.h>
- #include?<stdlib.h>
- #include?<time.h>
- 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?<stdio.h>
- #include?<stdlib.h>
- #include?<time.h>
- 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<guessnum){
- printf("数字小了!\n");
- }
- else{
- printf("祝贺您, 您猜中了!\n");
- break;
- }
- }
- }
- 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<B, 则 R 的下限设为 A?, 回到第二步.
(3) 如果 A=B, 则退出程序, 提示猜中数字, 进入第四步.
第四步, 在屏幕上输出 A 和 B, 并提示猜中数字.
根据上面的算法来编写以下程序:
- #include?<stdio.h>
- #include?<stdlib.h>
- #include?<time.h>
- //code:myhaspl@myhaspl.com
- //date:2014-01-23
- // 未与作者书面联系, 请勿将本程序用于任何用途
- 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<guessnum){
- ????????????????printf("程序猜的数字为 %d, 数字小了!\n",mynum);
- ????????????????myrange[0]=mynum;
- ????????
- }
- ????????else{
- ????????????????printf("程序猜的数字为 %d,? 被猜的数字为 %d, 猜中了!\n",mynum,guessnum);
- ????????????????break;
- ????????
- }?
- ????????
- }
- }?
运行后, 结果为:
- dp@dp:~/cquick?%?gcc?guessnum.c?-o?myguess
- dp@dp:~/cquick?%?./myguess
程序猜的数字为 250, 数字大了!
程序猜的数字为 125, 数字小了!
程序猜的数字为 187, 数字大了!
程序猜的数字为 156, 数字小了!
程序猜的数字为 171, 数字大了!
程序猜的数字为 163, 数字小了!
程序猜的数字为 167,? 被猜的数字为 167, 猜中了!
dp@dp:~/cquick?%?
来源: http://www.bubuko.com/infodetail-2916056.html