
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?
可能的输出: