> For the complete documentation index, see [llms.txt](https://nkust.gitbook.io/scratch-3/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nkust.gitbook.io/scratch-3/liu-cheng-kong-zhi-de.md).

# 流程控制的練習

在前面的例子中我們使用到的「重複無限次」積木，讓我們想要一直不斷地執行的作業無限期地重覆，直到按下「停止執行按鈕」才會停止這些作業。

在問題的解決步驟中會有許多種不同的變化，在基本上以步驟的流程來看，大概不會脫離以下三種流程執行的結構：

* 循序執行結構
* 選擇結構
* 重複結構

## 循序執行

循序執行非常直覺，就是當一個事件發生的時候，例如角色被點擊的時候，或是某一個按鍵被按下去的時候，依附於該事件積木下的程式積木依序一個一個地執行下去，這就是循序執行的方式。

{% hint style="danger" %}
而在Scratch中比較特別的是，由於它可以平行地處理所有的事件，因此雖然大家都是循序地在執行每一個積木，但是依附在不同事件中的積木，它們的執行先後次序卻無法判斷，這是在設計程式時要特別留意的地方。
{% endhint %}

以下是循序執行的例子：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZg9eRo9JBcyJmAu9zH%2F-LZg9rHWN8BBB3bZG-Pc%2F2019-02-27_07-36-03.png?alt=media\&token=c9bb8d45-2b00-416c-bdfe-b8526ac8b307)

在這個例子中，Scratch舞台上的角色在按下開始執行按鈕之後，會以10點為一步，總共前進了4步。

## 重複結構&#x20;

從上面的例子中，同學們應該可以看到有許多的步驟其實是一直不斷地重複出現，每一步都是前進10點、換下一個造型、等待一秒，總共重複了4次，因此在畫面上看起來是前進了4步。如果以此種寫法的話，要前進10步就要使用30個積木，相信應該沒有人會這麼做。對於這些重複的事情，很明顯地就需要使用合適的積木來指定某些積木要重複的次數，以上面這個例子，可以修改為如下：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZg9eRo9JBcyJmAu9zH%2F-LZgB52PDO-HOKsx9DZo%2F2019-02-27_07-42-18.png?alt=media\&token=4ed8bfe1-cc0f-4a08-8665-76d2236d364c)

使用重複程式積木，可以自由地指定要重複的積木內容以及次數，很有效率地解決了前面所提到的問題，而且，因為只要在次數的地方指定一-個想要重複的數字，此時就可以讓舞台上的角色一次走更多步。

## 選擇結構

當角色在畫面上走了許多步之後，就會遇到一些可能發生的情況，例如角色走著走著就碰到了舞台的邊界。在前面單元中的例子，我們使用了「碰到邊緣就反彈」的程式積木來解決這個問題，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZgBL3HEixGxkPzIHzR%2F-LZgCTyvo83qeX4A9Rsx%2F2019-02-27_07-47-44.png?alt=media\&token=6fa9e445-f060-4bf5-886f-590961676653)

而碰到邊緣就反彈這個積木，假設我們只考慮在舞台中進行左右移動的話，其實隱含了以下的邏輯判斷：

> 碰到邊緣時，如果現在的角度是 90 度，就把面向的角度改為-90度，否則就把面向的角度改為90度。

由於它會牽涉到目前的角度，因此在程式中需要使用到「方向」這個數值，修改角度的積木如下：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZgmE7gvsnb82HtMTpL%2F-LZgmLR9U5O69WMAnLAH%2F2019-02-27_10-29-07.png?alt=media\&token=b8626f5f-46de-48b6-861f-f3a43df69544)

再加上偵測碰到邊緣的積木，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZgmE7gvsnb82HtMTpL%2F-LZgneN7gU0ixv_TUmtz%2F2019-02-27_10-35-21.png?alt=media\&token=f2faf90b-01fe-4ea8-989c-4e654bc0f84e)

也就是上面這一段程式積木，「基本上」在水平方向上約略等於「碰到邊緣就反彈」這個程式積木。我們把它整合到原有的程式，就變成如下所示的樣子：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-LZgmE7gvsnb82HtMTpL%2F-LZgodnzkIVV4E_WwkjG%2F2019-02-27_10-37-47.png?alt=media\&token=1349000a-ef0e-4c30-9c97-360e53bbba1a)

{% hint style="danger" %}
碰到邊緣就反彈這個積木可以處理任何的角度，而上面取代的程式碼只考慮到水平反轉而已，請同學們留意。
{% endhint %}
