01題目要求
在Scratch圖形化編程中私有變量,克隆和列表的題目是屬于比較難的,如果結(jié)合了三者則會更加難。今天我們就一起看看這道綜合了三者的九宮格題目。
題目要求:用編程的方式做一個九宮格的游戲,把1-9這些數(shù)字拖入左邊9個方框內(nèi),使得每一行,每一列,斜對角三個數(shù)字相加都為15.
正確排列的結(jié)果:
錯誤排列的結(jié)果:
這個游戲涉及的角色如下:
02問題解答
這里大家可能會有一些疑問,其實澄清這些問題之后,這個題目會清晰很多,下面我們一起來過一下:
方格為什么不直接用畫圖指令畫,這樣還能畫得更準確一些?
因為用畫圖指令畫出來的方框,將無法用碰撞檢測,只能通過數(shù)字的X,Y坐標來確定落在哪個格子。舉個例子,如果要判斷數(shù)字1是否在第一個格子,而第一個格子的X坐標是-120到-80, Y坐標是100到170。那么判斷邏輯是這樣的:?數(shù)字1的X坐標是否小于-80并大于-120, 數(shù)字1的Y坐標是否小于170并大于100,如果滿足這個條件則說明在第一個格子,否則還需要依次判斷數(shù)字1是否在其他格子里。每一次判斷,X坐標需要做兩次比較運算,Y坐標也需要做兩次比較運算,一共是4次運算。
方格用角色的方式,可以用碰撞檢測的方式來判斷每個方格碰到數(shù)字幾,每次判斷只需要一次碰撞檢測,比判斷X,Y坐標的4次運算更加容易。
方格怎么畫出來正正方方的?為什么我畫出來的是長方形?
按住鍵盤上shift鍵,再用鼠標拖動矩形方框就可以畫出來。
為什么不創(chuàng)建9個格子角色?
因為可以用克隆。這樣同樣的代碼不用復(fù)制到9個格子角色里;同樣發(fā)現(xiàn)一處問題,不需要改9個地方。
為什么數(shù)字角色不用克隆,只用一個角色9個造型?
如果數(shù)字角色用克隆,格子角色也能判斷出來是否碰到克隆的數(shù)字角色,似乎看起來也行得通??墒窃龠M一步思考,我們沒有指令“碰到角色的造型”,“碰到角色的編號”等等,類似下面這樣的指令只能獲取到角色本體的造型編號,所以我們只能知道某個格子是否碰到數(shù)字,但是沒法檢測到格子具體碰到哪個數(shù)字。所以數(shù)字角色要有9個。
03具體代碼
方格:
? ?1,2代碼段運行之后,格子的編號是這樣的:
? ?下面第三段代碼是記錄:格子中放置的數(shù)字。
數(shù)字的主要代碼,需要拷貝9份到9個數(shù)字:
人物的主要代碼:
人物這里有個技巧,我們用到了自定義積木,可以讓代碼更加清晰,同時用到了一個“停止判斷”廣播來停止其他腳本的技巧,因為Scratch的自定義積木中
“停止這個腳本”指令僅僅會停止自定義積木中的指令,并不能令執(zhí)行過程停止。
而直接調(diào)用“停止該角色的其他腳本”指令也并不會令執(zhí)行過程停止。
所以我們要加一個“停止判斷”廣播。
另外需要注意的是:在拖動數(shù)字的時候需要在運行模式,也就是需要點了右上角這個按鈕到大窗口。否則Scratch不會把鼠標的拖拽動作與編程指令掛鉤。
做到這里題目就結(jié)束了。同學(xué)們可以繼續(xù)思考兩個問題:
如果1個數(shù)字跨了2個格會有什么后果?如何避免這個問題呢?
能不能換種做法,用1個數(shù)字角色,而格子角色創(chuàng)建9個呢?
后面看同學(xué)們的響應(yīng)程度再決定是否給出來這兩個問題的答案。另外大家關(guān)注“碼小愛”公眾號回復(fù)“源碼”,將可以得到本次程序的源碼。