(本文為前一篇文章《理解編程語言只需四個詞-編程知識體系介紹(帶python及scratch案例)》的說明案例之一)
下面我們用Scratch做一個無人駕駛汽車的小程序來具體說明下編程系統(tǒng)。
7.1 程序編寫步驟
第一步:確定這個程序的目標
這個案例中我們要做一個能夠自己躲避障礙、決定速度的小車搭伤。
第二步:將目標分解
我們想要汽車具備如下幾個功能:
(1)遇到障礙物自動換向缕粹;
(2)遇到屏幕邊緣自動改變方向丧蘸;
(3)前方無障礙物的時候乾蛤,加速行駛蝗敢;
(4)前方一定距離內(nèi)有障礙物翅睛,減速行駛声搁;
第三步:設計原型
用最簡單的程序語言及圖形實現(xiàn)程序核心功能黑竞,設計一個能判斷到障礙物的距離并根據(jù)情況改變行駛方向的小車,即為原型疏旨。
第四步:完善程序
對原型進行擴展很魂,包括功能完善及各種美化效果。
第五步:擴展程序
這個案例的進一步擴展檐涝,比如添加功能莫换、以這個程序為基礎做出其他案例等。
7.2 原型設計
下面我們開始制作原型骤铃。先新建一個長方形的角色拉岁,當我們的汽車原型,命名為“車”惰爬。把原來的貓命名為“障礙”喊暖。界面和代碼如圖4.2-4.3所示。
點擊小綠旗按鈕撕瞧,小車在快接近障礙物的時候能夠自動改變方向陵叽,初步實現(xiàn)了避開障礙物的功能。在這個小程序中丛版,通過偵測“到障礙物的距離”來獲得“數(shù)據(jù)”巩掺;判斷偵測的距離是否小于150屬于“運算”;“重復執(zhí)行”和“如果......那么”兩個代碼塊為“控制部分”页畦;“移動5步”及“右轉(zhuǎn)15度”為“執(zhí)行”語句胖替。這個原型雖然只有幾行代碼,但是已經(jīng)包含了“編程系統(tǒng)”四個主要組成部分:數(shù)據(jù)豫缨、運算独令、控制和執(zhí)行。這個案例還要豐富一下好芭,其本質(zhì)也是通過“編程系統(tǒng)”四個主要部分的配合完成的燃箭。
7.3 不再撞墻
我們繼續(xù)完成原型。當汽車達到舞臺邊框的時候居然穿過邊框不知去向了舍败,這不是我們想要的效果招狸。我們只需要在“重復執(zhí)行”語句中加入“遇到邊緣就反彈”命令。運行程序邻薯,汽車再也不會消失了裙戏,看看程序也只是多了一行代碼而已,如圖4.4所示弛说。
7.4 加速與減速
下面進行加速挽懦、減速的設置∧救耍基本原理也是通過判讀汽車到障礙物的距離來決定車速的大行攀痢:當距離大于300的時候冀偶,速度加到8;當距離小于150的時候渔嚷,速度降到2进鸠;當距離在150~300的時候,恢復正常默認速度5形病。在這里客年,我們用了一個變量“速度”,變量的相關內(nèi)容會在后面額章節(jié)中詳細講解漠吻,這里只需要理解為代表速度量瓜,且大小可變就可以了。調(diào)整一下數(shù)值途乃,代碼如圖4.5所示绍傲。
現(xiàn)在我們可以對照一下上文中制定的4個具體目標挡毅,基本上全部實現(xiàn)了缸榄。
7.5 緊急掉頭
下面進入“完善程序的”的階段蛉谜,我們發(fā)現(xiàn)汽車大部分情況都能實現(xiàn)自動避開障礙物控汉,但也會出現(xiàn)一些極端情況。當車與障礙物考的太近的時候锨咙,容易讓車做圓周運動训裆,反而反復從障礙物上方經(jīng)過瞻颂,這不和常理钩骇,究其原因比藻,是因為在特殊的情況下汽車右轉(zhuǎn)20度之后仍然符合旋轉(zhuǎn)的條件,這樣就造成了循環(huán)碾壓障礙物的情況伊履。針對這種情況韩容,我們修改代碼,當距離小于60的時候唐瀑,直接轉(zhuǎn)向相反方向,并前進80步插爹,這樣就基本上避免了上述問題哄辣。同時為了增加程序多樣性,在程序開始的時候加入了旋轉(zhuǎn)隨機角度的命令赠尾,最終代碼如圖4.6所示力穗。
7.6 添加一匹跑動的馬
障礙物小貓移動不動站在那里實在無聊,我們可以換成一匹奔跑的馬气嫁,這樣就有趣多了当窗。與小車一樣,我們?yōu)檫@匹馬也設定了遇到邊緣就折返的命令寸宵,最后馬的代碼如圖4.7所示崖面。
運行一下程序元咙,有意思多了∥自保可是我們的汽車還用一個方塊代替庶香,這時候我們可以做一些美化的工作了,將方塊修改成小汽車简识,最后的界面如圖4.8所示赶掖。小汽車尾部的線是它的運行軌跡,記錄軌跡的方法我們會在“畫筆”的相關章節(jié)詳細講解七扰。
7.7 輔助工具的使用
我們在做幾何題的時候需要添加輔助線來尋找解題思路奢赂。在編寫程序的過程中我們也可以用一些輔助的工具來提高我們的編程效率。而這些輔助工具一般都是我們根據(jù)需要自己設計編寫的颈走。如在本案例中膳灶,你一定疑惑程序中條件語句“道障礙物的距離<150”中數(shù)值150是如何得到的。你當然可以通過不停地改數(shù)值疫鹊、運行袖瞻、調(diào)整來找到最合適的數(shù)字。但這不是最佳的方法拆吆,我們可以創(chuàng)造一個輔助的工具聋迎,如下圖4.9所示。
這樣枣耀,我們只需拖動小車到合適的位置霉晕,點擊角色,就會直接顯示相應的距離捞奕,簡單快捷牺堰。
本案例還用了另一個輔助工具,當你按下鍵盤上A鍵時颅围,小車就會回到坐標(0,0)的位置伟葫。這個小工具在程序調(diào)試階段發(fā)揮了重要作用,如圖4.10所示院促。
這個案例完成了么筏养?其實一個程序永遠沒有真正完成的時候,可以一直變得更好常拓。我們想一想怎樣把這個程序改的更好渐溶?下面是一些提示:
1.增加障礙物數(shù)量,并讓其位置隨機分布弄抬;
2.將汽車和馬換成貓和老鼠試試茎辐;
3.加入一些故事情節(jié)。