來猜個數字吧

有了隨機數和簡易的流程控制能力,寫個猜數字遊戲就是很理所當然的事了!

題目說明

我們希望讓舞台上的角色在被點擊之後就立刻之產生一個隨機數,接著詢問使用者要猜的數字是多少,在使用者輸入數字之後,把使用者輸入的數字拿來和隨機數比較,一樣的話就是猜中了,要有回饋的畫面。如果不一樣的話,就要告訴使用者數字太大還是太小,並繼續讓使用者猜測,直到數字正確為止。

解決此問題的演算法

變數:answer-->要被猜測的隨機數

變數:guess-->使用者猜的數字

程式流程如下:

  1. 開始執行程式

  2. 產生一個1~99之間的隨機數,放在變數answer中

  3. 詢問使用者要猜測的數字,放在guess中

  4. 如果guess等於answer,則顯示「你猜對了」,並結束程式

  5. 否則如果guess大於answer,則顯示「你猜的數字太大囉」,前往第3步

  6. 否則,顯示「你猜的數字太小了」,前往第3步

上述的演算法如果使用英文並寫得精簡一點(有一套自已的文字式的語法),即稱為虛擬碼(pseudo code)

表達程式演算的流程也可以使用圖形的方式,標準的圖形流程表示法稱為流程圖Flow chart

開始製作程式

先建立兩個變數,分別是answer以及guess,如下所示:

接著從「當角色被點擊」事件開始,先產生一個隨機數放在變數answer中,並請使用者猜一個數字,放在變數guess中,如下所示:

有了answer和guess之後,接下來就是要比較這兩個數的大小,給予使用者適當的回應。加上這個邏輯的程式積木如下所示:

仔細看一下上述的程式積木,如果可以的話請同學們執行一遍看看,你會發現,其實就只有讓使用者猜一次而已,不管有沒有猜中,在給了使用者回饋訊息之後,然後,就沒有然後了。

在我們的演算法中有指出,如果數字太大或太小,其實是要讓程式的流程再回到前面,也就是回到「詢問並等待」那個積木再往下執行才對,但是,在Scratch中並沒有「goto」這種直接前往某一處程式積木的功能。

在早期的一些程式語言如BASIC、FOTRAN、Pascal等等都有提供goto這種指令,可以讓程式碼直接跳到程式中的任一處再往下執行。這樣的設計方式提供了程式設計師的彈性,但間接地卻造成了程式執行流程的複雜度,使得程式變得不易理解,因此後來的先進的程式語言大多不再提供goto這種指令了。

仔細檢視我們的程式流程,從「詢問並等待積木」開始,一直到最後的「如果」積木,它們是一個如果沒待到數字就不會停止的重複片段,因此,我們可以使用一個重複積木把它包含起來,如下所示:

這個「重複直到」積木會等待一個結束條件,在該條件還沒發生之前會一直重複執行它所含括的所有積木。

基於上述的邏輯,在此使用一個叫做gameover的變數,一開始把它設定為0,如果要結束程式的話,就把它設定為1,如此,在等待條件的地方就可以設定為gameover=1即可,修改後的程式積木如下(別忘了要先建立一個叫做gameover的變數喔):

比較一下和前一個程式的差別,在進入重複迴圈之前,先把gameover設定0,如此就可以順利地進入迴圈中。

原本在答對時使用「停止全部」來結束程式的執行,這次只要把gameover設為1,很神奇地程式也就結束執行了耶!