我們之前曾經(jīng)用Scratch編寫(xiě)過(guò)一個(gè)計(jì)算器,但是那個(gè)計(jì)算器數(shù)字顯示使用Scratch的變量顯示過(guò)于簡(jiǎn)陋,這次我們使用新的思路制作一個(gè)顯示效果優(yōu)秀、加減乘除、有小數(shù)點(diǎn)、連續(xù)運(yùn)算等功能的升級(jí)版計(jì)算器。由于我們之前已經(jīng)介紹過(guò)一種計(jì)算器程序,本文中僅對(duì)升級(jí)版重難點(diǎn)和不同之處做介紹,其他部分可以掃碼下載源代碼自行研究。
一、界面準(zhǔn)備
首先用圖片編輯軟件對(duì)一張手機(jī)計(jì)算器截圖進(jìn)行修改,保留需要的功能按鈕,保存圖片高度為360像素,導(dǎo)入作為舞臺(tái)背景。
自行繪制白色的數(shù)字角色,這個(gè)角色中包含11個(gè)造型,依次是1到9、0、小數(shù)點(diǎn)和負(fù)號(hào),并修改這些造型的命名。根據(jù)顯示效果調(diào)整好角色的大?。▓D1)。
二、 按鍵定位和輸入
對(duì)舞臺(tái)背景編程。我們需要通過(guò)偵測(cè)鼠標(biāo)的位置來(lái)確定用戶(hù)點(diǎn)擊了哪里,并利用“二維數(shù)組”為按鈕定位,首先根據(jù)按鈕將界面分為5行4列,比如數(shù)字5就在3行2列、數(shù)字9在4行3列。測(cè)量每個(gè)行列X、Y坐標(biāo)的范圍(如圖1),重復(fù)監(jiān)測(cè)鼠標(biāo)的XY坐標(biāo),并據(jù)此修改變量“計(jì)算機(jī)-行”和“計(jì)算機(jī)-列”的值(圖2)。
再將鼠標(biāo)位置的行列位置轉(zhuǎn)換對(duì)應(yīng)的變量“鍵值”,就可以讓程序知道用戶(hù)點(diǎn)擊了計(jì)算器的哪個(gè)按鍵了。比如當(dāng)“計(jì)算器-行=2,計(jì)算器-列=4”時(shí),變量鍵值設(shè)為‘+(含單引號(hào)),表示點(diǎn)擊了加號(hào),用單引號(hào)是將數(shù)字鍵和其他功能鍵區(qū)別開(kāi)。用“if參數(shù)1”(監(jiān)控坐標(biāo))、“if參數(shù)2”(監(jiān)控行列)、“if參數(shù)3”(鼠標(biāo)按下)來(lái)表示當(dāng)前的輸入狀態(tài),當(dāng)值為1時(shí)表示有輸入,為0時(shí)表示目前沒(méi)有輸入(圖3)。
當(dāng)偵測(cè)到鼠標(biāo)點(diǎn)擊的動(dòng)作時(shí),表示輸入了數(shù)字或運(yùn)算符,根據(jù)此時(shí)的鍵值判讀執(zhí)行相應(yīng)的自定義積木(函數(shù))。比如當(dāng)鍵值=‘退格時(shí)調(diào)用退格積木。通過(guò)觀察,我們還可以把功能相同的按鍵歸為一組。比如說(shuō)數(shù)字鍵0~9為一組,當(dāng)按下數(shù)字鍵時(shí),判斷“鍵值>-1”,調(diào)用“數(shù)字鍵”;運(yùn)算符加減乘除為一組,“if參數(shù)3=0”調(diào)用相應(yīng)積木進(jìn)入后續(xù)的判斷。
比如收到小數(shù)點(diǎn)的鍵值,就執(zhí)行小數(shù)點(diǎn)的積木(函數(shù))(圖4)。
為了實(shí)現(xiàn)連加操作(不按清除就在結(jié)果上繼續(xù)運(yùn)算),加減乘除和等號(hào)的操作幾乎一樣,不同在于加減乘除時(shí)要先清空一次列表,判斷運(yùn)算符不是等號(hào),完成時(shí)清空運(yùn)算符變量(圖5)。
三、 數(shù)字顯示
對(duì)數(shù)字角色編程。輸入的數(shù)字和計(jì)算結(jié)果依次保存在列表“字符串”中,為了在計(jì)算器的液晶屏中顯示出多個(gè)漂亮的數(shù)字,從列表中依次提取數(shù)值用來(lái)控制角色造型的變換,改變數(shù)字角色的造型后再克隆,并用計(jì)算公式根據(jù)數(shù)字的位數(shù)調(diào)整克隆體的放置位置。(圖6)。
在計(jì)算器的顯示屏上每個(gè)字符寬20,顯示屏上最多可以容納12個(gè)。用計(jì)算公式調(diào)整每個(gè)克隆體的位置。當(dāng)接收到清除命令——清除數(shù)字=Yes時(shí)就可刪除克隆體表現(xiàn)出清屏的效果(圖7)。
四、 數(shù)值的存入、取出和分解
通過(guò)對(duì)“字符串”列表的操作完成數(shù)字的這些操作。當(dāng)點(diǎn)擊鼠標(biāo)時(shí),首先進(jìn)行狀態(tài)判斷,如果條件符合就將“鍵值”加入“字符串”列表,這里使用“字符串”列表存儲(chǔ)輸入的數(shù)值,每個(gè)位單獨(dú)存放。當(dāng)需要參與運(yùn)算時(shí),要把列表中臨時(shí)存放的各位數(shù)轉(zhuǎn)換回可計(jì)算的數(shù)字。運(yùn)算符之前輸入的數(shù)字依次賦值給操作數(shù)1,運(yùn)算符之后的數(shù)字賦值給操作數(shù)2,然后根據(jù)運(yùn)算符進(jìn)行運(yùn)算即可。注意每次更新字符串列表后需要把變量“清除數(shù)字=Yes”和“廣播顯示字符串”配合使用,清屏后顯示新的數(shù)字(圖8、圖9)。
當(dāng)需要從列表中取出數(shù)值用于計(jì)算時(shí),依次取出第1項(xiàng)(最高位)后乘10加上第2項(xiàng)(次高位),直到全部取出存入變量操作數(shù)。遇到小數(shù)點(diǎn)時(shí)需要做一個(gè)很精巧的特別處理,變量i就是用來(lái)記錄小數(shù)點(diǎn)的位置,遇到小數(shù)點(diǎn)時(shí)i歸零,之后i記錄的數(shù)字就是小數(shù)點(diǎn)后的數(shù)位了,當(dāng)i=j時(shí)表示沒(méi)有小數(shù)點(diǎn),當(dāng)不相等時(shí)根據(jù)i的數(shù)值將操作數(shù)除以10的i次方即可得到含小數(shù)點(diǎn)的正確數(shù)值了(圖10)。
五、 運(yùn)算
運(yùn)算部分比較簡(jiǎn)單,直接根據(jù)運(yùn)算符對(duì)輸入的變量“操作數(shù)1”和“操作數(shù)2”計(jì)算即可。其中“運(yùn)算符2”設(shè)為鍵值的第二個(gè)字符是因?yàn)檫\(yùn)算符第一個(gè)字符是單引號(hào)(圖11)。
當(dāng)計(jì)算位數(shù)結(jié)果超出11位時(shí)或在已有運(yùn)算符的情況下輸入新的運(yùn)算符時(shí),需要刷新列表或截取有效部分重新顯示。這里使用自定義積木“分解顯示的數(shù)字”完成這些需求(圖12)。
以上就是升級(jí)版計(jì)算器的重難點(diǎn),受篇幅所限其他功能的實(shí)現(xiàn)請(qǐng)見(jiàn)33版 掃碼下載后自行研究,注意看程序是如何處理運(yùn)算符和等號(hào)的,以及如何處理小數(shù)點(diǎn)問(wèn)題和運(yùn)算結(jié)果超出顯示屏寬度的問(wèn)題,非常值得學(xué)習(xí)借鑒。(本程序源代碼參考自冉爸學(xué)堂特此感謝?。?/p>