計(jì):從廣播消息與克隆體機(jī)制解析武器切換系統(tǒng)實(shí)現(xiàn))
1. 項(xiàng)目概述從一道真題看Scratch游戲設(shè)計(jì)的核心邏輯最近在輔導(dǎo)孩子準(zhǔn)備藍(lán)橋杯國賽正好深入研究了一下往年的真題。其中有一道關(guān)于“切換子彈”的題目我覺得特別有意思它不像一些純算法題那樣枯燥而是把一個(gè)非常經(jīng)典的游戲機(jī)制——武器系統(tǒng)——用Scratch巧妙地呈現(xiàn)出來考察的恰恰是孩子們將復(fù)雜游戲邏輯拆解成可視化積木的能力。這道題出自藍(lán)橋杯Scratch國賽目標(biāo)是用Scratch實(shí)現(xiàn)一個(gè)角色能夠切換不同子彈進(jìn)行射擊的效果。聽起來是不是很像我們小時(shí)候玩的《沙羅曼蛇》或者《合金彈頭》里吃到一個(gè)“S”道具就換散彈的感覺對(duì)就是那個(gè)味兒。這道題的核心價(jià)值在于它絕不僅僅是讓角色“換一個(gè)造型”那么簡單。它真正考驗(yàn)的是孩子對(duì)“廣播消息”、“變量控制”、“條件判斷”以及“克隆體管理”這幾個(gè)Scratch核心概念的融合運(yùn)用能力。很多孩子單獨(dú)學(xué)這些知識(shí)點(diǎn)都會(huì)但一到綜合項(xiàng)目里就懵了不知道如何讓它們協(xié)同工作。通過拆解這道“切換子彈”真題我們不僅能得到標(biāo)準(zhǔn)答案更能掌握一套設(shè)計(jì)復(fù)雜交互系統(tǒng)的思維方法。無論是想沖刺競賽的孩子還是希望用Scratch做出更酷游戲的編程愛好者理解這個(gè)案例都大有裨益。接下來我就把自己從審題、拆解到最終實(shí)現(xiàn)的全過程以及其中容易踩的坑和優(yōu)化技巧毫無保留地分享出來。2. 真題深度拆解需求分析與設(shè)計(jì)思路2.1 題目要求與核心需求解析我們首先得把題目的要求吃透。通常這類“切換子彈”的題目會(huì)包含以下幾個(gè)明確的需求點(diǎn)角色控制需要一個(gè)主控角色比如一架飛機(jī)、一個(gè)坦克或一個(gè)勇士可以通過鍵盤通常是上下左右方向鍵或WASD在舞臺(tái)上自由移動(dòng)。子彈發(fā)射主控角色需要具備發(fā)射子彈的能力。按下某個(gè)鍵比如空格鍵時(shí)角色會(huì)朝當(dāng)前面向的方向或固定方向如向上發(fā)射一枚子彈。子彈切換這是題目的核心。角色至少擁有兩種或以上不同類型的子彈例如普通直線子彈、散彈、跟蹤導(dǎo)彈等。玩家可以通過按下另一個(gè)特定按鍵比如數(shù)字鍵“1”、“2”或“q”、“w”來切換當(dāng)前準(zhǔn)備發(fā)射的子彈類型。子彈特效與行為不同類型的子彈必須有顯著且符合其類型的行為差異。例如普通子彈直線快速飛行碰到邊緣或敵人消失。散彈一次發(fā)射多顆如三顆呈扇形散開。跟蹤彈發(fā)射后會(huì)自動(dòng)尋找并飛向最近的敵人。視覺反饋當(dāng)前選中的子彈類型需要在游戲界面上有清晰的提示比如在角色旁邊顯示一個(gè)圖標(biāo)或者在舞臺(tái)角落用文字標(biāo)明“當(dāng)前武器XXX”。注意國賽真題的表述可能更精煉需要我們從中提煉出這些隱性需求。例如題目可能只說“實(shí)現(xiàn)切換三種子彈進(jìn)行射擊”那么“角色移動(dòng)”、“發(fā)射控制”、“視覺反饋”就是我們必須自行補(bǔ)全的、一個(gè)可運(yùn)行游戲的基本組成部分。2.2 核心架構(gòu)設(shè)計(jì)為什么是“廣播變量克隆體”鐵三角面對(duì)這個(gè)需求新手最容易陷入的誤區(qū)就是試圖用一個(gè)“當(dāng)按下空格鍵”的腳本通過一堆“如果…那么…”的嵌套來判斷發(fā)射哪種子彈。這種做法在子彈種類少時(shí)勉強(qiáng)可行但邏輯會(huì)迅速變得臃腫不堪且難以維護(hù)和擴(kuò)展。經(jīng)過多年實(shí)踐我認(rèn)為最優(yōu)雅、最符合Scratch思維的設(shè)計(jì)架構(gòu)是“廣播消息 全局變量 克隆體”的鐵三角組合。全局變量 (當(dāng)前子彈類型)這是整個(gè)系統(tǒng)的“大腦”。它記錄著玩家當(dāng)前選擇的子彈類型比如設(shè)定為1代表普通彈2代表散彈3代表跟蹤彈。所有其他部分都“聽”這個(gè)變量的指揮。廣播消息這是系統(tǒng)的“神經(jīng)”。當(dāng)按下切換鍵如“1”鍵時(shí)角色廣播一條消息例如“切換為普通子彈”。這個(gè)消息本身可以攜帶“信息”在Scratch中我們可以把要切換的類型編碼在消息名稱里或者更規(guī)范地在廣播消息的同時(shí)修改變量。更重要的是一個(gè)監(jiān)聽“切換為普通子彈”消息的“武器指示器”角色可以隨之更新自己的造型實(shí)現(xiàn)視覺反饋。發(fā)射子彈時(shí)也可以廣播一條“發(fā)射子彈”的消息。克隆體這是系統(tǒng)的“手腳”。每一顆飛出去的子彈都應(yīng)該是一個(gè)克隆體??寺◇w的最大優(yōu)勢(shì)在于“各自為政”。每個(gè)子彈克隆體都有自己的生命周期移動(dòng)、檢測碰撞、刪除彼此互不干擾。這對(duì)于實(shí)現(xiàn)散彈多個(gè)克隆體同時(shí)產(chǎn)生、跟蹤彈每個(gè)克隆體獨(dú)立計(jì)算追蹤目標(biāo)等效果至關(guān)重要。這個(gè)架構(gòu)的核心優(yōu)勢(shì)在于“解耦”。角色控制模塊只負(fù)責(zé)移動(dòng)和發(fā)送“切換”或“發(fā)射”的指令子彈生成模塊只負(fù)責(zé)根據(jù)當(dāng)前變量值創(chuàng)建對(duì)應(yīng)類型的克隆體子彈行為模塊每個(gè)克隆體只負(fù)責(zé)自己的飛行邏輯UI反饋模塊只負(fù)責(zé)監(jiān)聽切換指令更新顯示。各模塊通過“變量”和“廣播”這兩個(gè)低耦合的接口通信使得整個(gè)項(xiàng)目結(jié)構(gòu)清晰調(diào)試方便未來要新增一種“激光”或“反彈彈”也只需要增加一個(gè)變量值、一套子彈造型和一段克隆體行為腳本而無需改動(dòng)核心控制邏輯。3. 分步實(shí)現(xiàn)與核心代碼詳解3.1 舞臺(tái)與角色準(zhǔn)備在寫第一行代碼之前良好的素材準(zhǔn)備是成功的一半。背景選擇一個(gè)簡潔的、深色的背景如星空或純黑色方便觀察子彈的飛行軌跡。主控角色繪制或選擇一個(gè)作為玩家的角色例如一架小飛機(jī)。確保它的造型中心點(diǎn)合理通常在中下部這會(huì)影響子彈生成的位置。子彈角色這是關(guān)鍵。我強(qiáng)烈建議為每一種子彈類型單獨(dú)創(chuàng)建一個(gè)角色比如Bullet_Normal角色里面只放普通子彈的造型。Bullet_Spread角色里面只放散彈子彈的造型可以和普通彈一樣但因?yàn)槭仟?dú)立角色方便管理。Bullet_Homing角色里面放跟蹤導(dǎo)彈的造型。 這樣做的好處是每個(gè)子彈角色的腳本完全獨(dú)立互不干擾邏輯非常清晰。千萬不要把所有子彈造型都塞進(jìn)一個(gè)角色然后用“切換造型”來處理那樣會(huì)使得克隆體的行為腳本變得極其復(fù)雜和混亂。UI指示器角色創(chuàng)建一個(gè)小的、永遠(yuǎn)跟隨主控角色或固定在舞臺(tái)一角的小圖標(biāo)角色。它擁有多個(gè)造型分別對(duì)應(yīng)每一種子彈的圖標(biāo)。它的唯一使命就是根據(jù)當(dāng)前子彈類型變量來切換造型。3.2 主控角色邏輯實(shí)現(xiàn)主控角色的腳本是游戲的“總控臺(tái)”它負(fù)責(zé)三件事移動(dòng)、切換武器、下達(dá)發(fā)射命令。當(dāng) ? 被點(diǎn)擊 將 [當(dāng)前子彈類型 v] 設(shè)為 [1] // 初始化武器為類型1普通彈 廣播 [切換為普通彈 v] // 初始化UI顯示 重復(fù)執(zhí)行 如果 按下 [向上箭頭 v] 鍵 那么 將y坐標(biāo)增加 [5] end 如果 按下 [向下箭頭 v] 鍵 那么 將y坐標(biāo)增加 [-5] end ... // 類似處理左右移動(dòng) 如果 按下 [1 v] 鍵 那么 將 [當(dāng)前子彈類型 v] 設(shè)為 [1] 廣播 [切換為普通彈 v] end 如果 按下 [2 v] 鍵 那么 將 [當(dāng)前子彈類型 v] 設(shè)為 [2] 廣播 [切換為散彈 v] end 如果 按下 [3 v] 鍵 那么 將 [當(dāng)前子彈類型 v] 設(shè)為 [3] 廣播 [切換為跟蹤彈 v] end 如果 按下 [空格 v] 鍵 那么 廣播 [請(qǐng)求發(fā)射 v] // 注意是廣播消息不是自己直接創(chuàng)建克隆體 end end關(guān)鍵點(diǎn)解析移動(dòng)使用“如果…那么”而非“當(dāng)按下鍵”來檢測移動(dòng)可以保證持續(xù)平滑移動(dòng)。切換每次按下數(shù)字鍵做兩件事1) 更新當(dāng)前子彈類型變量2) 廣播一條具體的切換消息。UI指示器會(huì)接收這個(gè)消息。發(fā)射按下空格時(shí)廣播一條請(qǐng)求發(fā)射消息。這是架構(gòu)解耦的關(guān)鍵。主控角色不關(guān)心具體怎么發(fā)射、發(fā)射什么它只發(fā)出“開火”指令。具體的發(fā)射工作由各個(gè)子彈角色來響應(yīng)。3.3 子彈角色的通用模板與差異化實(shí)現(xiàn)每個(gè)子彈角色如Bullet_Normal都需要有兩段核心腳本。第一段響應(yīng)發(fā)射請(qǐng)求創(chuàng)建克隆體。當(dāng)接收到 [請(qǐng)求發(fā)射 v] 如果 (當(dāng)前子彈類型) [1] 那么 // 只有當(dāng)前武器是該類型時(shí)才響應(yīng) 重復(fù) (1) 次 // 普通彈一次發(fā)一顆 創(chuàng)建 [自己 v] 的克隆體 end end對(duì)于Bullet_Spread散彈這段腳本會(huì)有所不同當(dāng)接收到 [請(qǐng)求發(fā)射 v] 如果 (當(dāng)前子彈類型) [2] 那么 重復(fù) (3) 次 // 散彈一次發(fā)三顆 創(chuàng)建 [自己 v] 的克隆體 end end第二段定義克隆體啟動(dòng)后的行為。這是子彈邏輯的核心。當(dāng)作為克隆體啟動(dòng)時(shí) 顯示 // 確??寺◇w可見 移到 [Player v] 位置 // 移動(dòng)到主控角色位置 面向 [上 v] 方向 // 設(shè)定初始方向可根據(jù)角色朝向調(diào)整 重復(fù)執(zhí)行直到 碰到 [邊緣 v] // 或碰到敵人 移動(dòng) [10] 步 // 子彈飛行速度 end 刪除此克隆體差異化實(shí)現(xiàn)要點(diǎn)普通子彈如上所示邏輯最簡單直線飛行。散彈關(guān)鍵在于讓三顆克隆體有不同的發(fā)射角度。當(dāng)作為克隆體啟動(dòng)時(shí) 顯示 移到 [Player v] 位置 如果 (克隆體ID) [1] 那么 // 可以利用“克隆體ID”這個(gè)內(nèi)置變量需要自己用變量記錄創(chuàng)建順序或者更簡單的方法 面向 [上 v] 方向 end 如果 (克隆體ID) [2] 那么 面向 [左 v] 15 度 方向 // 向左偏15度 end 如果 (克隆體ID) [3] 那么 面向 [右 v] 15 度 方向 // 向右偏15度 end 重復(fù)執(zhí)行直到 碰到 [邊緣 v] 移動(dòng) [10] 步 end 刪除此克隆體實(shí)操心得更穩(wěn)健的做法是在創(chuàng)建克隆體前用一個(gè)臨時(shí)角度變量記錄偏轉(zhuǎn)角度如0 -15 15然后作為克隆體啟動(dòng)參數(shù)通過一個(gè)全局變量傳遞傳給克隆體。這樣可以避免對(duì)克隆體執(zhí)行順序的依賴。跟蹤彈邏輯最復(fù)雜需要實(shí)現(xiàn)“尋敵”功能。當(dāng)作為克隆體啟動(dòng)時(shí) 顯示 移到 [Player v] 位置 將 [目標(biāo) v] 設(shè)為 [無] // 初始化目標(biāo) 重復(fù)執(zhí)行直到 碰到 [邊緣 v] 或 (目標(biāo)) [找到] // 或碰到敵人 如果 (目標(biāo)) [無] 那么 // 尋找敵人遍歷所有敵人角色找到距離最近的一個(gè) 將 [最近距離 v] 設(shè)為 [1000] // 一個(gè)很大的數(shù) 將 [i v] 設(shè)為 [1] 重復(fù)執(zhí)行直到 (i) (敵人數(shù)量) // 這里需要用到“與角色的距離”偵測塊通常需要配合列表存儲(chǔ)敵人克隆體ID來實(shí)現(xiàn) // 這是一個(gè)進(jìn)階難點(diǎn)簡化版可以先預(yù)設(shè)一個(gè)固定的“敵人”角色 如果 到 [Enemy v] 的距離 (最近距離) 那么 將 [最近距離 v] 設(shè)為 (到 [Enemy v] 的距離) 將 [目標(biāo) v] 設(shè)為 [Enemy] // 簡化處理鎖定這個(gè)固定敵人 end 將 [i v] 增加 [1] end end 如果 (目標(biāo)) [Enemy] 那么 面向 [Enemy v] 方向 // 每幀都面向敵人實(shí)現(xiàn)追蹤 end 移動(dòng) [8] 步 // 跟蹤彈速度可以稍慢 end 刪除此克隆體跟蹤彈的實(shí)現(xiàn)是本題的高階難點(diǎn)它涉及角色間的動(dòng)態(tài)距離計(jì)算和持續(xù)方向調(diào)整。在競賽中如果敵人是多個(gè)克隆體管理起來會(huì)更復(fù)雜可能需要用到列表來記錄所有活躍的敵人克隆體ID。3.4 UI指示器與效果優(yōu)化UI指示器角色的腳本非常簡單就是監(jiān)聽切換消息并改變?cè)煨?。?dāng)接收到 [切換為普通彈 v] 切換造型為 [普通彈圖標(biāo) v] 當(dāng)接收到 [切換為散彈 v] 切換造型為 [散彈圖標(biāo) v] 當(dāng)接收到 [切換為跟蹤彈 v] 切換造型為 [跟蹤彈圖標(biāo) v]為了提升游戲體驗(yàn)我們還可以加入一些優(yōu)化效果發(fā)射音效在每個(gè)子彈角色的“當(dāng)作為克隆體啟動(dòng)時(shí)”腳本開始處播放一個(gè)簡短的“發(fā)射”音效。子彈拖尾/粒子效果在子彈移動(dòng)的循環(huán)內(nèi)可以創(chuàng)建一些更小的、半透明的、很快消失的克隆體來模擬軌跡這能極大提升視覺效果。冷卻時(shí)間通過一個(gè)是否可發(fā)射的變量和計(jì)時(shí)器限制子彈的發(fā)射頻率避免空格鍵按住后子彈泛濫成災(zāi)。4. 調(diào)試技巧與常見問題排雷在實(shí)際制作和輔導(dǎo)孩子過程中我遇到了不少典型問題這里列出來供大家避坑。4.1 克隆體“卡頓”或只發(fā)射一次問題描述按下空格鍵子彈只出現(xiàn)一發(fā)或者感覺發(fā)射不流暢。排查思路檢查廣播消息確保主控角色按下空格時(shí)廣播的是請(qǐng)求發(fā)射并且子彈角色正確使用了當(dāng)接收到請(qǐng)求發(fā)射。檢查條件判斷在子彈角色的接收腳本里如果 當(dāng)前子彈類型 X這個(gè)條件是否寫對(duì)了變量名和數(shù)值是否匹配檢查克隆體刪除最容易被忽略的一點(diǎn)確保子彈克隆體在碰到邊緣或敵人后執(zhí)行了刪除此克隆體。如果克隆體沒有及時(shí)刪除Scratch有克隆體數(shù)量上限約300個(gè)達(dá)到上限后將無法創(chuàng)建新克隆體造成“卡頓”或“發(fā)射不出”的假象。解決技巧在調(diào)試階段可以在舞臺(tái)上顯示一個(gè)克隆體數(shù)量的變量Scratch有克隆體數(shù)量偵測積木直觀監(jiān)控克隆體的產(chǎn)生和銷毀是否平衡。4.2 散彈角度混亂或數(shù)量不對(duì)問題描述散彈沒有按預(yù)想的扇形散開或者有時(shí)發(fā)射2顆有時(shí)發(fā)射4顆。排查思路角度設(shè)置邏輯檢查給每個(gè)克隆體賦予角度的邏輯。避免使用可能產(chǎn)生沖突的“克隆體ID”判斷。采用“創(chuàng)建前設(shè)置偏移角變量”的方法更可靠。重復(fù)執(zhí)行次數(shù)檢查Bullet_Spread角色中重復(fù)執(zhí)行 (3) 次的數(shù)值是否正確。角色初始化確保Bullet_Spread角色在創(chuàng)建克隆體前其本身是隱藏的在造型編輯區(qū)外或使用隱藏積木并且方向已重置。否則第一個(gè)克隆體可能會(huì)繼承本體的錯(cuò)誤方向。4.3 跟蹤彈不跟蹤或性能低下問題描述跟蹤彈直飛出去不會(huì)轉(zhuǎn)向敵人或者游戲在發(fā)射跟蹤彈時(shí)變得很卡。排查思路尋敵邏輯簡化版中是否成功將目標(biāo)變量設(shè)為了敵人角色面向 [目標(biāo) v] 方向積木是否在重復(fù)執(zhí)行距離計(jì)算開銷如果敵人很多每一顆跟蹤彈每一幀都遍歷計(jì)算所有敵人的距離計(jì)算量會(huì)非常大O(n*m)導(dǎo)致卡頓。解決技巧簡化尋敵對(duì)于初級(jí)實(shí)現(xiàn)可以只設(shè)置一個(gè)主要的“敵人Boss”角色跟蹤彈只追蹤它。優(yōu)化算法對(duì)于多個(gè)敵人可以引入“距離閾值”。只有敵人進(jìn)入一定范圍內(nèi)子彈才開始追蹤?;蛘咦屗袛橙私巧诿恳粠瑢⒆约旱奈恢眯畔懭胍粋€(gè)全局列表子彈只需讀取列表計(jì)算避免使用大量到[角色]的距離積木這個(gè)積木開銷較大。限制數(shù)量限制場上同時(shí)存在的跟蹤彈數(shù)量。4.4 變量沖突與消息干擾問題描述切換武器后發(fā)射的子彈類型不對(duì)或者UI顯示錯(cuò)誤。排查思路變量作用域確保當(dāng)前子彈類型是適用于所有角色的全局變量而不是僅適用于某個(gè)角色的局部變量。消息命名唯一性廣播消息的名稱要清晰、唯一。避免使用含糊的“切換”或“發(fā)射”。使用“切換為普通彈”、“請(qǐng)求發(fā)射”這樣具體的名稱。腳本執(zhí)行順序在當(dāng)綠旗被點(diǎn)擊時(shí)確保當(dāng)前子彈類型變量和UI指示器都被正確初始化。5. 從解題到創(chuàng)作拓展思路與項(xiàng)目升華掌握了這道真題的基本解法我們已經(jīng)拿到了不錯(cuò)的分?jǐn)?shù)。但如果止步于此就失去了編程最大的樂趣——?jiǎng)?chuàng)造。我們可以引導(dǎo)孩子在這個(gè)基礎(chǔ)上進(jìn)行天馬行空的拓展把一個(gè)小題目變成一個(gè)屬于自己的創(chuàng)意小游戲。5.1 武器系統(tǒng)的深度拓展子彈屬性多樣化不只是類型還可以為子彈添加屬性變量比如威力、射速、能量消耗。Bullet_Normal的威力是1Bullet_Spread的威力可能是0.7每顆Bullet_Homing的威力是2。這樣在擊中敵人時(shí)可以扣除不同的生命值。武器升級(jí)系統(tǒng)設(shè)計(jì)一個(gè)經(jīng)驗(yàn)值或積分系統(tǒng)。當(dāng)擊中敵人積累到一定分?jǐn)?shù)自動(dòng)或手動(dòng)將當(dāng)前子彈類型升級(jí)為更高級(jí)的形態(tài)如普通彈升級(jí)為高速穿甲彈。有限彈藥與補(bǔ)給為每種武器設(shè)置一個(gè)彈藥數(shù)量變量發(fā)射時(shí)減少拾取特定道具時(shí)補(bǔ)充。這立刻增加了游戲的策略性。5.2 敵人與游戲邏輯的加入一個(gè)完整的射擊游戲當(dāng)然少不了敵人。敵人克隆體像管理子彈克隆體一樣管理敵人。敵人角色當(dāng)作為克隆體啟動(dòng)時(shí)從舞臺(tái)頂部隨機(jī)位置出現(xiàn)并不斷向下移動(dòng)。碰撞檢測這是核心游戲邏輯。在子彈克隆體的循環(huán)中加入如果 碰到 [敵人角色] 那么...的判斷。一旦碰到首先廣播一條擊中敵人消息附帶子彈威力參數(shù)然后刪除此克隆體。敵人角色接收到擊中敵人消息后減少自己的生命值如果生命值0播放爆炸動(dòng)畫增加玩家分?jǐn)?shù)然后刪除此克隆體。敵人生成器單獨(dú)一個(gè)角色隱藏作為敵人生成器使用重復(fù)執(zhí)行和等待隨機(jī)時(shí)間來不斷創(chuàng)建 [敵人 v] 的克隆體控制游戲難度。5.3 視覺與音效的打磨粒子效果系統(tǒng)創(chuàng)建一個(gè)“爆炸”角色擁有多個(gè)爆炸動(dòng)畫造型。當(dāng)子彈擊中敵人或敵人死亡時(shí)在對(duì)應(yīng)位置創(chuàng)建 [爆炸 v] 的克隆體爆炸克隆體執(zhí)行一段快速切換造型并縮小的腳本然后刪除自己。同樣的原理可以制作子彈的尾焰、敵人的彈道等。音效管理為發(fā)射、擊中、爆炸、切換武器、敵人出現(xiàn)等不同事件配上合適的8-bit風(fēng)格音效能極大提升游戲的沉浸感。注意使用播放聲音 [xxx] 直到播放完畢來避免音效重疊時(shí)的刺耳聲。UI美化用Scratch的畫筆功能或者精心設(shè)計(jì)的角色造型制作一個(gè)炫酷的血條、分?jǐn)?shù)顯示、彈藥計(jì)數(shù)器面板。通過這樣的拓展原本一道冷冰冰的競賽題就變成了一個(gè)充滿熱血的個(gè)人作品。這個(gè)過程鍛煉的不僅僅是編程技巧更是系統(tǒng)設(shè)計(jì)、問題分解和創(chuàng)意實(shí)現(xiàn)的能力。這也是藍(lán)橋杯等賽事更高層次的追求以賽促學(xué)激發(fā)創(chuàng)造。最后我的個(gè)人體會(huì)是輔導(dǎo)孩子或自己學(xué)習(xí)時(shí)不要滿足于“跑通”代碼。多問幾個(gè)“如果”如果我想加一種新子彈怎么辦如果敵人會(huì)還擊呢如果有關(guān)卡和Boss呢在不斷地自我提問和嘗試實(shí)現(xiàn)中那些抽象的編程概念才會(huì)真正內(nèi)化成解決實(shí)際問題的能力。