# 來猜個數字吧

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

## 題目說明

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

## 解決此問題的演算法

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

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

程式流程如下：

1. 開始執行程式
2. 產生一個1\~99之間的隨機數，放在變數answer中
3. 詢問使用者要猜測的數字，放在guess中
4. 如果guess等於answer，則顯示「你猜對了」，並結束程式
5. 否則如果guess大於answer，則顯示「你猜的數字太大囉」，前往第3步
6. 否則，顯示「你猜的數字太小了」，前往第3步

{% hint style="info" %}
上述的演算法如果使用英文並寫得精簡一點（有一套自已的文字式的語法），即稱為虛擬碼（pseudo code）

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

## 開始製作程式

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_AuOpJa-Zz4FnJhiC9%2F-L_B0YuY7QcxBBGmMGAr%2F2019-03-05_12-04-16.png?alt=media\&token=028d761f-5dc0-4fae-8b54-b5d9d8fc1689)

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_AuOpJa-Zz4FnJhiC9%2F-L_B1avK_QdgdjPZ3oB9%2F2019-03-05_12-08-55.png?alt=media\&token=2ce6d116-c23e-4669-95e2-4983fd7407c5)

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_C5qnHgpT0MyBmN66p%2F-L_C6x_VrKzcRdLPJUp7%2F2019-03-05_17-11-55.png?alt=media\&token=5327f15c-ddc3-4668-b9b8-0d6a8afd2c27)

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

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

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

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_C5qnHgpT0MyBmN66p%2F-L_C9FWeNBbG1YlT1ROt%2F2019-03-05_17-21-51.png?alt=media\&token=b8e5eb73-5401-4622-90ba-152a21e65952)

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

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_C5qnHgpT0MyBmN66p%2F-L_CBc0eQVjZc2Klippr%2F2019-03-05_17-32-18.png?alt=media\&token=321b740d-f97b-4858-b9f1-c9510a4edd66)

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

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