【C语言探索之旅】 第一部分第八课:第一个C语言小游戏
?
内容简介
1、课程大纲 2、第1部份第8课:第1个C语言小游戏 3、第1部份第9课预告: 函数
课程大纲
我们的课程分为4大部份,每个部份结束后都会有练习题,并会公布答案。还会带大家用C语言编写3个游戏。
C语言编程基础知识
C语言高级技术
用基于C语言的SDL库开发2D游戏
数据结构
第1部份第8课:第1个C语言小游戏
经过前7课的努力,我们终究来到了第1个比较正式的程序:1个C语言小游戏。虽然暂时还不介绍C语言的图形编程,这个游戏还是命令行的情势,但是不论怎样,这都是1个小小的里程碑。我们的目的是让大家看到经过之前几课的学习,你已可以完成1些成心思的事了。虽然我们知道理论是很好的,但是如果我们不能把所学的理论付诸实践,那也很没成心思,我们不就白学了那末多理论。
信不信由你,你其实已有水平实现自己的第1个成心思的程序了。
准备工作和建议
程序的原理
在动手编程之前,得先跟大家说1下这个程序是干甚么的。 我们可以称呼这个游戏为《或多或少》。
游戏的原理是这样:
游戏的目的,固然就是用最少的次数猜到这个“神秘”数字。虽然没有绚丽的图形界面,但是或多或少,这都是你的第1个游戏了,应当值得自豪。
下面演示了1轮的样式,你要编程来实现它:
这个数字是甚么?50 猜小了! 这个数字是甚么?75 猜小了! 这个数字是甚么?85 猜大了! 这个数字是甚么?80 猜大了! 这个数字是甚么?78 猜小了! 这个数字是甚么?79 太棒了,你猜到了这个神秘数字!!
随机抽取1个数 但大家要问了:怎样来随机地抽取1个数呢?不知道怎样办啊,臣妾做不到啊。
诚然,我们还没学习如何来产生1个随机数。让亲爱的电脑兄来做这个是不简单的:它很会做运算,但是要它随机选择1个数,它还不知道怎样做呢。
事实上,为了“尝试”得到1个随机数,我们不能不让电脑来做1些复杂的运算,好吧,归根结柢还是做运算。
我们有两个解决方案:
我们来学习用第2种方案编写这个游戏,固然你也能够以后自己编写第1种方案的代码。
为了生成1个随机数,我们要用到rand()函数(rand是英语“random:随机” 的缩写)。顾名思义,这个函数能为我们生成随机数。但是我们还要这个随机数是在1到100的整数范围内(如果没有限定范围,那会很复杂)。
我们会用到以下的情势: srand(time(NULL)); mysteryNumber = (rand() % (MAX - MIN + 1)) + MIN;
第1行(srand函数)用于初始化随机数的生成器。srand实际上是seed random的缩写,seed在英语中是“种子”的意思。 给出 百度百科 的简单解释: 【srand和rand配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生1系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是1样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列】
【所谓的“伪随机数”指的其实不是假的随机数,这里的“伪”是有规律的意思。其实绝对的随机数只是1种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。计算机生成的伪随机数既是随机的又是有规律的 ―― 1部分遵照1定的规律,1部分则不遵照任何规律。比如“世上没有两片形状完全相同的树叶”,这正点到了事物的特性 ―― 规律性;但是每种树的叶子都有近似的形状,这正是事物的共性 ―― 规律性。从这个角度讲,我们就能够接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。】
【通过time()函数来取得计算机系统当前的日用时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算。其原型为:time_t time(time_t * t); 如果你已声明了参数t,你可以从参数t返回现在的日用时间,同时也能够通过返回值返回现在的日用时间,即从1个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NULL),函数将只通过返回值返回现在的日用时间。】
如果我们在使用rand函数前没有用srand函数制定seed的值,或虽然用了srand函数,但是给它的参数是1个常量,比如srand(1),那末每次程序运行rand产生的数字都是1样的。只有用例如time()函数来给1个每次都不1样的seed值,才能使得rand的返回值不1样,才能做到“随机”。
srand函数只需要在rand函数前面调用1次就够了,也只能调用1次,以后你想要调用rand函数几次都无所谓,但是每一个程序中不能用两次srand函数,切记。
上面代码格式中的MAX和MIN是常量,MAX是英语的“最大”Maximum的缩写,MIN是“最小”Minimum的缩写。顾名思义,MAX和MIN分别是你规定的范围的最大值和最小值。
建议在程序的1开始定义这两个常量:
const int MAX = 100,MIN = 1;
引入的库 为了程序能够顺利运行,我们需要引入3个库: stdio.h
stdlib.h time.h
我们之前的课说过库的作用,库里面提供1些定义好的函数,比如time.h里面就有我们的time()函数,stdlib中有rand和srand函数。
好啦,我不继续流露了。我们已说明了游戏的原理,也给出了1轮游戏的运行例子,也给出了主要的随机数生成代码,该轮到你来完成游戏的代码了。加油。
我的代码 希望大家自己先写代码,查阅1些资料,或温习前面几课的内容。运行成功了或实在写不出来才来看答案。 以下给出我的版本,固然了,这个游戏的代码可以有不同的版本。你完全可以自己发挥。
#include <stdio.h> #include <stdlib.h> #include <time.h>
int main (int argc,char** argv) { int mysteryNumber = 0,guessNumber = 0; const int MAX = 100,MIN = 1; // 生成随机数 srand(time(NULL)); mysteryNumber = (rand() % (MAX - MIN + 1)) + MIN; /* 程序的循环部份, 如果用户没猜中数字,就1直进行循环 */ do { // 要求用户输入所猜数字 printf("这个数字是甚么 ? "); scanf("%d",&guessNumber); // 比较用户输入的数字和神秘数字 if (mysteryNumber > guessNumber) printf("猜小了 ! "); else if (mysteryNumber < guessNumber) printf("猜大了 ! "); else printf ("太棒了,你猜到了这个神秘数字 !! "); } while (guessNumber != mysteryNumber);
return 0; }
程序的解释(从上到下的顺序):
循环也需要1个条件,我们给出的条件是:只要猜的数字和神秘数字不1样,循环就继续。
现在这个游戏还是很基础很简单的,但是可以有以下的改进方案:
你也能够自己增设难度,想出更多好玩的点子来丰富这个游戏。通过完善和改进这个小游戏,你会学到更多。
第1部份第9课预告:函数
今天的课就到这里,1起加油咯。 下1次我们学习第9课,来认识函数这个极其重要和有用的内容吧!
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |