官术网_书友最值得收藏!

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?

可能的輸出:

主站蜘蛛池模板: 苏州市| 新余市| 白河县| 梨树县| 黄石市| 鱼台县| 淳安县| 河池市| 浑源县| 石嘴山市| 洞头县| 荆州市| 隆尧县| 湛江市| 怀化市| 平塘县| 体育| 清水县| 五指山市| 西乌珠穆沁旗| 芮城县| 九龙县| 岑溪市| 穆棱市| 尼勒克县| 观塘区| 临西县| 苍山县| 墨脱县| 鹤山市| 大新县| 织金县| 团风县| 鹰潭市| 正镶白旗| 石柱| 云南省| 广水市| 当阳市| 泗水县| 伊宁县|