說出來你可能不信,那條著名的單行迷宮程序我敲過不下百遍,但8-Bit Guy最新一期的拆解視頻,還是讓我花了整整幾天鉆進去研究。四十年前第一次在說明書里看到這行代碼時,只當它是魔術;今天再拆開,里面至少藏著四個被無數人忽略、卻值得寫進現代編程筆記的實用技巧。
先看那條經典原版:
![]()
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
在C64上跑起來,屏幕上不斷滾出隨機的迷宮圖案。核心在于CHR$(205.5+RND(1))這個表達式——RND(1)返回0到0.999之間的浮點數,加上205.5后落在205.5到206.499區間,CHR$函數直接截斷小數,于是大約50%的概率得到字符205,50%的概率得到字符206。這兩個代碼在PETSCII字符集里正好是斜杠符號/和反斜杠\,隨機交替打印,屏幕自動滾動,對角線首尾相接,就構成了無限迷宮。
整套邏輯摞進一行代碼,靠的是用一個算術表達式取代了條件分支。當年看固然是極客炫技,放在今天,消除IF語句這件事在特定場景下依然值得琢磨——它用一個浮點加截斷操作,就把隨機二選一變成了零分支的單行表達式。這個技巧在早期C64和VIC-20的隨機附贈手冊里就能找到,不少老程序員第一次撞見編程的驚喜,就是被這段代碼點燃的。
然后8-Bit Guy亮出了第一個花活:讓代碼比一行還短,短到零行。怎么做到的?BASIC的直接模式里可以直接跑FOR...NEXT循環,不需要寫行號,而且STEP 0是合法的——步長為零,計數器永遠不往前走,循環就永遠不會結束。拼起來就是:
FOR A=0 TO 1 STEP 0:PRINT CHR$(205.5+RND(1));:NEXT
零行程序,無限迷宮。STEP 0作為刻意設計的死循環,第一次看到時確實有種鉆了語言規則空子的快感,類似C語言里WHILE(1)的那種編程直覺。
技巧還沒完,視頻后半段進入速度優化環節,信息量更大。第一條優化是把PRINT相關的計算盡量提到循環之外,減少每次重復求值的開銷。
第二條和隨機數有關——BASIC里不同隨機數生成方式的速度差異大到必須認真對待,選對生成器能讓迷宮滾動的幀率肉眼可見地提升。第三條則是預定義字符串常量:把CHR$(205)和CHR$(206)分別存成變量,循環體里直接調用,省去每次拼接和類型轉換的消耗。這三刀砍下來,迷宮的生成速度直接快了一個量級。
回過頭看,這段四十年前的代碼其實一直在講同一件事:在資源極度受限的環境下,用結構性的聰明換性能的大提升。它用的每一個技巧單獨拎出來——浮點數截斷做隨機、步長為零做死循環、預計算和常量外提——都是特定約束下的務實解法,沒有一個是花架子。這也正是為什么今天重讀這段代碼,依然能感覺到一股沒有隨時間褪色的巧勁。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.