- JavaScript程序設計:基礎·PHP·XML
- (美)Elizabeth Drake
- 2225字
- 2020-10-30 18:12:40
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?
可能的輸出:
- 零基礎搭建量化投資系統:以Python為工具
- Magento 2 Theme Design(Second Edition)
- 嚴密系統設計:方法、趨勢與挑戰
- EPLAN實戰設計
- Java程序設計:原理與范例
- C語言課程設計
- Python極簡講義:一本書入門數據分析與機器學習
- 好好學Java:從零基礎到項目實戰
- 動手學數據結構與算法
- Cocos2d-x Game Development Blueprints
- HTML5+CSS3+jQuery Mobile APP與移動網站設計從入門到精通
- DB2SQL性能調優秘笈
- Laravel Design Patterns and Best Practices
- Python數據可視化之matplotlib實踐
- C語言程序設計實驗指導與習題精解