# 使用清單和廣播建立兩個角色間的對話

## 讓角色說話

在Scratch的程式設計中，對話是經常被使用的功能，傳統使用說話的方法，是透過以下的方式，循序來完成：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GANFmnoB12Dtz3t_d%2F-L_GBoNAikXTjnEqazQq%2F2019-03-06_12-11-35.png?alt=media\&token=12c39f11-7006-473b-8860-21ca5a67fdf1)

這樣的做法如果要說的內容很多的話，就會發現積木的長度太長了，程式會變得不好維護。而且最嚴重的問題是，如果在新增了很多（例如超過100句話）的說出積木之後，臨時想要說話的速度要加快一點，想想看要修改100個積木中的秒數，會是多麼煩瑣的事？！

## 利用清單來簡化角色說話的程序

因為我們已經會使用清單了，所以可以把這樣的作業利用清單來完成。首先，建立一個清單變數dialog，然後把所有要說的話放在這個清單中，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GCuQb6xxrQxq_iFRZ%2F-L_GDwEzu6ab-H0zabFJ%2F2019-03-06_12-20-48.png?alt=media\&token=4920bdd8-0986-45a9-b4d6-50a499efceef)

接下來，就是我們所熟悉的，利用一個迴圈把所有的話都說出來，程式積木如下：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GCuQb6xxrQxq_iFRZ%2F-L_GEX8be4EcVS37MvGQ%2F2019-03-06_12-23-21.png?alt=media\&token=0c31864e-ff89-43a9-8313-155a530c776b)

同學們可以仔細想一下這個程式，如果要說的內容有所改變的話，此程式積木內容是否需要跟著改變呢？

## 新增一個角色&#x20;

現在讓我們新增加一個角色，讓他們可以完成對話的功能。舞台的介面如下：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_Glxq-5ULf3QRImVIS%2F2019-03-06_14-53-21.png?alt=media\&token=eb365142-c3c1-4e95-acbf-53f67e109e26)

接著把dialog改為dialogA，然後新增一個清單叫做dialogB，清單的資料項目則改為對話的內容，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_GnJzE3FvK6f09o4pd%2F2019-03-06_14-59-50.png?alt=media\&token=bd8a21f3-f897-4c4e-9104-33190a27ea56)

因為把資料加入清單是屬於初始化的操作，因此在哪一個角色中都是可以使用的，我們把它放在貓咪的程式碼中，執行之後，舞台中即可看到兩個清單的內容，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_GnbRGf0amABcUNw88%2F2019-03-06_15-01-06.png?alt=media\&token=ab92a07c-9948-4d7d-9660-1eb4df6d937c)

因為有兩個清單，我們希望每個角色各自負責說明自己的清單中內容。看前面不一樣的地方是，之前的例子是一口氣把所有的清單都說完，因此只要使用一個重複迴圈就可以了，但是，現在的情況是，每個角色各講一次，因此我們需要有兩個索引變數各自指向目前正要說出的清單索引值，在此，我們設計一個為indexa，另外一個則是indexb，一開始都要把它們設定為1，也就是要開始說第一句話。

## 開始來進行廣播

啟始對話的事件，以貓咪為主，因此我們讓貓咪的角色被點擊事件中加入以下的程式積木：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_GqGMubseOZaAU9W6J%2F2019-03-06_15-12-38.png?alt=media\&token=978c6970-1d37-4d8e-9d10-4ab64690074b)

{% hint style="info" %}
上述的程式因為是初始化用，所以別忘了要把兩個索引變數都設定為1喔。
{% endhint %}

在說出一句話之後，別忘了要把自己的索引值加1，表示接下來如果要說話的話，是下一句話喔。

貓咪被點擊之後會發出一個叫做「boysay」的訊息，此時，另外一個角色就不需要任何人點擊它，而是等著接收「boysay」訊息，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_Gr1Pp-89Ai5AqN7pa%2F2019-03-06_15-14-27.png?alt=media\&token=30ed394f-3289-48ca-94c1-8b9145355651)

同學們有看到講完一句話之後改發出「catsay」訊息了嗎？所以，很明顯的，在貓咪那邊就要再建立一個「當收到訊息catsay」的事件，如下所示：

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_GkLYO67WxSgG5rFD5%2F-L_GraOsRkGWSMTJEZU0%2F2019-03-06_15-18-31.png?alt=media\&token=58e95443-0271-48ba-970c-36e171637a04)

## 問題與討論

執行上述的程式是可以順利地把話講完了，但是請仔細觀察，程式似乎是有哪裡不對勁，同學們看出來了嗎？

那，這個問題該如何解決呢？
