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

## 讓角色說話

在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)

## 問題與討論

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/scratch-3/shi-yong-qing-he-bo-jian-li-jiao-se-de.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
