3.7.1 Greg's Gambits:Vadoma夫人知道所有事情

Vadoma夫人知道所有事情!事实上,名字Vadoma是吉普赛人名,意指“知道所有”。她在Greg's Gambits网站上有一个页面,用于回答玩家问的任何问题。我们现在将创建这个页面,从而获知Vadoma夫人技能的秘密。在这个程序中,玩家可以键入一个问题,而Vadoma夫人将回答它。在本章练习中,你将有机会创建第二个页面让Vadoma夫人为玩家提供一个预言:他的命运是什么。

大体上,这个程序将有一个玩家可以单击开始的按钮。有一个提示要求玩家键入一个问题,而Vadoma夫人将会显示答案。Vadoma夫人的成功秘密在于她的知识(也是你的):Math.random()方法。现在将讨论这个方法,但是首先要学习JavaScript的Math对象

3.7.1.1 Math对象

JavaScript的Math对象让你容易地执行许多数学任务。有的任务可以由你自己编程实现,但有的任务很复杂,你更乐意JavaScript为你实现。

例如,在例3.14中声明了一个称为PI的常量,设置为3.14159。然而,JavaScript已经有一个更精确地表示π值的常量,并且可以通过Math对象访问:Math.PI。如果要在一个类似找到圆面积这样的计算中使用这个值,那么可以把一个变量设置为等于Math.PI,然后在计算中使用这个变量:

JavaScript通过Math对象提供8个数学常量:E、PI、2的平方根、1/2的平方根、2的自然对数、10的自然对数、以2为底e的对数和以10为底e的对数。这些常量的大部分很可能不在我们的任何程序中使用。

然而,Math对象也有很多可用的方法。表3-1提供了使用Math对象的方法。

表3-1 Math对象的方法

你现在可能难以理解上面的大部分方法,但是当熟悉它们后,你会发现这些方法是很有用的。pow(x,y)可以求任何数的任何次幂,据此可以改写计算圆面积的代码,即使用Math.pow(radius,2)替换radius*radius可以求radius2。在这个特殊情况中,使用这个方法没有真正节省时间。但是想象要计算一个数的5次或6次幂,那么使用Math.pow(num,6)显然比使用num*num*num*num*num更为方便!下面使用这个方法来计算当半径=radius时的圆面积:

对于Vadoma夫人的页面,我们只需要使用两个方法:Math.random()和Math.floor()。

3.7.1.2 Math.random()和Math.floor()方法

Math.random()方法返回一个0~1之间的数,它在程序中的使用语法如下:

不必多猜,Vadoma夫人不是一个真正的预言者。她将从我们已经创建的答案中选择问题的答案。借助Math.random()方法,她将挑选一个随机答案。

当程序遇到表达式Math.random()时,它将生成一个从0.0~1.0的随机数,包括0.0但不包括1.0。最初,这似乎没有什么用。毕竟,有多少情况需要使用类似0.5024994240225955或0.843290654721918这样的随机数呢?在随机生成这样一些神秘数字的同时,更为常见的是需要在一个特定范围内的随机整数。例如,在模拟抛掷一个骰子时,可能的结果点数是1、2、3、4、5和6。因此,我们通常把随机生成的小数转换为某个范围内的整数,这可能采取几个步骤。

为了便于解释,我们把生成的随机数表示为只有4位小数位(在JavaScript中,这个方法生成的实际数字有更多的小数位),例如Math.random()可能生成0.3792或0.0578。如果用10乘以这个随机数,那么生成的数就在0~9.9999之间,如下所示:

·如果Math,random()=0.3234,那么Math,random()*10=3.2340。

·如果Math,random()=0.0894,那么Math.random()*10=0.8940。

·如果Math.random()=0.1737,那么Math.random()*10=1.7370。

·如果Math.random()=0.9999,那么Math.random()*10=9.9990。

我们把范围提高到从0.000~10,但不包括10。然而,我们仍然没有整数值。但是我们可以使用Math.floor()方法把它下舍入到最近的整数。因此,如果把floor()应用于任何随机数,那么将简单地除去小数部分,如下所示:

·如果Math.random()=0.3234,那么Math.floor(Math.random()*10)=3。

·如果Math.random()=0.0894,那么Math.floor(Math.random()*10)=8。

·如果Math.random()=0.1737,那么Math.floor(Math.random()*10)=1。

·如果Math.random()=0.9999,那么Math.floor(Math.random()*10)=9。

现在,生成的随机数在0~9之间。最后,如果想要生成一个在1~10之间的随机数,我们可以简单地为这个表达式加1,得到以下各项:

·如果Math.random()=0.3234,那么(Math.floor(Math.random()*10))+1=4。

·如果Math.random()=0.0894,那么(Math.floor(Math.random()*10))+1=9。

·如果Math.random()=0.1737,那么(Math.floor(Math.random()*10))+1=2。

·如果Math.random()=0.9999,那么(Math.floor(Math.random()*10))+1=10。

要在程序中使用这个随机数生成公式,可以把它的值赋予一个整数变量。为了生成需要的任何范围内的随机数,可以根据需要改变公式中的乘数与/或加数。例3.16示范了这种做法。

例3.16 生成给定范围中的随机数 如果newNum是整数变量,那么有以下效果:

·newNum=(Math.floor(Math.random()*10))+1将生成一个1~10(含10)之间的随机数。

·newNum=(Math.floor(Math.random()*100))+1将生成一个1~100(含100)之间的随机数。

·newNum=(Math.floor(Math.random()*10))+4将生成一个4~13(含13)之间的随机数。

·newNum=(Math.floor(Math.random()*2))的结果要么是0,要么是1。

·newNum=(Math.floor(Math.random()*2))+1的结果要么是1,要么是2。

·newNum=(Math.floor(Math.random()*6))+7将生成一个7~12(含12)之间的随机数。

在检查这些例子之后,我们能推断出:要生成N~M的随机整数,可以使用以下公式:

3.7.1.3 开发程序

首先,我们创建Vadoma夫人在玩家提出一个问题之后将会显示的可能答案。现在,我们创建10个可能的答案,当然你也可以提供自己的答案。我们将使用以下答案:

1)Absolutely!

2)No way!

3)Probably...

4)Doubtful...

5)Could be...

6)Madame Vadoma cannot answer such a question.

7)You must find the answer within yourself.

8)Yes,of course!

9)You don't really believe this works,do you?

10)Madame Vadoma wonders about that too.

接下来,我们将创建一个页面。它有一个按钮让用户开始这个游戏,然后提示问题。这个程序将生成一个从1~10之间的随机数,并且通过switch语句显示对应于已生成随机数的那个回答。

3.7.1.4 编写代码

这个页面将成为我们一直在开发的Greg's Gambits网站的一部分。首先,我们将在play_games.html页面上添加一个到这个页面的链接。它应该看起来像这样:

接下来,我们将使用下面的代码创建一个页面。在Student Data Files中有一个文件gregs_fortune.html,你可以为这个文件添加必需的代码。

首先,添加以下标题内容:

接下来,添加Vadoma夫人的图像(madame.jpg)、她的名字和一个让玩家单击开始的按钮。其代码如下:

把这个代码放入页面的内容区,你的页面现在看起来像这样:

现在,我们编写一个名为startFortune()的函数,它生成一个随机数(1~10),然后提示玩家输入一个问题并且使用生成的随机数显示一个答案。我们将使用switch语句决定显示哪一个答案,代码如下:

注意,使用getElementById()方法把回答结果放在页面的内容区。如果玩家问“Will I get an A in this class?”而且生成的随机数是10,那么显示将会看起来像这样:

3.7.1.5 将所有代码放在一起

以下程序将所有代码放在一起:

3.7.1.6 完成

这里是一些样例问题和可能的结果。

输入:

Will I buy a new car this year?

可能的输出:

输入:

Will I ever travel to Mars?

可能的输出: