> 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/da-fu-weng-hang.md).

# 大富翁銀行

很多人小時候的回憶之一，就是和家人一起玩大富翁的時光。這個遊戲很好玩，但同學們是否和老師一樣，每次想到玩大富翁時，就想到很麻煩的金錢計算？每一輪大家手上的假鈔來來去去的時候，有時候都覺得暈了 ，對於算錢有障礙的朋友，如果有一個可以方便用來計算的工具，那就會更增加遊戲的開心度\~\~現在就讓我們利用Scratch設計一個工具吧。

## 需使用到的角色

大富翁遊戲一般來說有4個玩家以及一個銀行，因此在畫面上至少需有4個玩家以及1個銀行。不過，由於銀行本身重點不在角色，而是可以執行的功能，因此可以把銀行依需要的功能切割出幾個不同的角色，並以按鈕的型式呈現。所有需要放在舞台上的角色整理如下：

* 玩家 abby
* 玩家 anina
* 玩家 avery
* 玩家 monkey
* 立即轉帳按鈕
* 薪水入帳按鈕
* 重設按鈕

## 使用的變數

每一個人都要有一個帳戶用來記錄自己現在有多少錢，而這個帳戶其實就是一個變數，為了簡單起見，在此使用每一個角色的名字來當做是變數的名稱。

此外，在轉帳的時候需要有付錢的人以及收錢的人，在這裡使用另外兩個變數分別是giver以及acceptor。在轉帳的過程中，當然還需要有一個變數用來記錄到底要轉多少錢，我們用money這個變數來記錄。所有的變數如下：

* abby
* anina
* avery
* monkey
* giver
* acceptor
* money

新增了這些變數以及角色之後，可以看到如下所示的畫面（把變數在舞台上的位置重新安排）：

![](/files/-L_YEzpHVAot3E3FIvjf)

## 程式功能說明

* 假設有4個玩家&#x20;
* 程式開始執行的時候，每個玩家均發給5000元&#x20;
* 如果按下「薪水入帳」按鈕，則詢問要入帳的是哪一個玩家，指定玩家之後，會在該玩家帳戶中入帳2000元
* 要進行「即時轉帳」之前，要先按下第一個玩家作為付錢的人，接下來按第二個玩家即是要收錢的人。
* 當按下第一個玩家時，這個玩家是付錢的人，他的名字會放在giver這個變數中，按下第二位玩家時，這個玩家就是收錢的人，他的名字會被放在acceptor變數中。
* 如果想要重設轉帳的玩家，可按下「重設」按鈕重新設定付錢和收錢的玩家。

## 程式運作邏輯

### 初始化作業&#x20;

初始化的作業主要是要把所有的變數都清除為0，並發給每一位玩家5000元。我們以每一位玩家的名字當做是用來放錢的變數，因此可以編寫程式積木如下：

![](/files/-L__vtGdWyma3iCnrOcl)

由於上面的這個些程式是在按下「開始執行」按鈕時要運作的，和角色沒有直接的關係，因此上面這一段程式積木要放在哪一個角色裡面都可以。

### 薪水入帳

薪水入帳的方式很單純，只要按下薪水入帳按鈕，系統就要詢問使用者要入帳的是哪一個玩家。因此，這段程式流程是要設計在「薪水入帳」的角色中，而且一開始要先詢問使用者。為了簡單流程起見，詢問使用者的答案，是以數字來回答就可以了。

當程式拿到使用者回答的數字，再用一連串的「如果」積木來決定要在誰的變數中加上2000元。程式積木如下：

![](/files/-L__x7RZVpJC2YRMIvhf)

### 轉帳流程之重設作業

轉帳程序由於牽渉到2個玩家，因此程序稍微多一些。在此，我們讓各個角色各自分工來簡化程式的控制流程。

程式的流程如下：

1. 使用者點擊一個角色作為要付錢的玩家，此角色的名字就要放在  giver這個變數中
2. 使用者點擊另一個角色作要要收錢的玩家，此角色的名字就要放在acceptor這個變數中
3. 如果giver和acceptor這兩個變數都設定完成，則再按下「即時轉帳」這個按鈕角色時，程式會詢問使用者轉帳的金額，在使用者輸入完畢之後即會被放在money這個變數中
4. 即時轉帳角色在確定所有的變數都設定完成之後，即發出廣播，請每一個玩家角色自行檢查giver和acceptor這兩個變數，如果有提到自己的名字，就在自己的帳戶中增加money或減去money
5. 轉帳完成之後，即把giver和acceptor這兩個變數再度恢復成0
6. 在轉帳之前，也可以按下「重設」角色，主動把giver和acceptor這兩個變數設定為0，讓使用者可以重新設定付錢和收錢的玩家。

根據上面的邏輯，「重設」角色被擊時，需要執行以下的程式：

![](/files/-L_aOLJbRYfB5hZzGz--)

### 即時轉帳程式&#x20;

當「即時轉帳」角色被點擊之後，其程式積木如下：

![](/files/-L_aOtLJYIstX7BniiMv)

在這個程式中首先檢查giver和acceptor是否都已經指定人選了，如果還沒的話，就不能執行轉帳的工作，此時要說出一個訊息提醒使用者要進行設定。

如果giver和acceptor都有人選的話，就要進入轉帳程序，先詢問要轉帳的金額大小，把詢問的答案放到變數money中，之後就廣播一個叫做「givemoney」的訊息，通知每一個角色要各自更新自己的帳戶金額。這個動作要等待一秒，讓每一個角色可以有時間把他們的工作做完。

在等待一秒之後，接著就是把3個主要的變數都清除為0，即完成轉帳的程序。

### 即時轉帳每一個玩家要執行的作業&#x20;

在前面講到，「即時轉帳」按鈕在被按下之後，會發出一個叫做「givemoney」的廣播訊息，此時每一個玩家要等待這個廣播訊息，當收到時就要檢查在giver變數中是否為自己的名字，如果是的話，表示自己是付錢的人，就要把自己的帳戶中的錢減去money的金額。

同樣的，如果在acceptor變數中是自己的名字的話，就表示自己是收錢的人，就要把自己的帳戶中的錢加上money的金額。以角色abby為例，程式積木如下：

![](/files/-L_aQYkPuJ6AckwrezZB)

就如同同學們所看到的，程式積木中使用了2個如果積木，分別檢查giver和acceptor中的內容，再做適當的對應即可。其他3個玩家的方法也類似，只不過要記得名字的地方要換成正確的字串就可以了。

### 指定付錢和收錢玩家的方法

最後，還有一個動作還沒完成，就是如何在介面中設定giver和acceptor是哪一個玩家，也就是如何指定付錢和收錢的玩家各是什麼人。

在設定的流程方面，我們希望第一個被點擊到的玩家就是付錢的人，而第二個被點擊到的玩家則是付錢的人。由於每一個玩家都可能會在第一階段或是第二階段被點擊，因此在每一個玩家的「當角色被點擊」事件發生時，都要先檢查giver，如果giver是0的話，就表示付錢的人還沒被設定，就把自己設定為付錢的人，如果giver已經不是0的話，就表示已經有付錢的人了，再檢查acceptor，如果acceptor是0，就表示還沒有設定收錢的人，就把自己設定為收錢的人。

當然，如果giver和acceptor都不是0的話，那就表示都已被設定完畢了，就什麼事都不要做就好了。以玩家abby為為例，它的被點擊事件程式積木設計如下（其它3個玩家的積木也都是一樣的）：

![](/files/-L_aSCshA5bRohDG_Kjv)

{% hint style="warning" %}
其實上述的程式積木和前面的流程描述文字內容有一些出入，同學們可以看出來嗎？
{% endhint %}

如此就完成了所有程式內容的設計了，以下是操作的過程。

{% embed url="<https://youtu.be/7FCCSZO_YiM>" %}
