電影《數碼寶貝大冒險:最后的進化·羈絆》近期開始上映,看到大銀幕里一張張熟悉又陌生的臉,就很容易想起那段熱血沸騰的時光,樂樂也非常喜歡動漫里一個個獨特的角色。
尤其是里面的光子郎,他在團隊中相當于軍師的角色,性格冷靜且十分聰明。
這個小男孩對所有人都很禮貌(包括父母),會在稱呼后加上敬語。經常背著一臺仿APPLE的筆記型電腦到處跑的男孩,兒時雙親卻死于車禍,由父母的遠房親戚收養。和太一關系相當好,在可能遇到黑暗四天王的攻擊危險之下,仍然與太一一起出去尋找感冒藥。
其中非常經典的一個情節就是,最早在檔案島的安杜路獸的工廠中,光子郎通過分析巨大「電池」內墻壁上的文字(也就是數碼文字和一些數字,還有人類世界的文字)從而描繪出了檔案島的全貌。
然而當時動畫給的一個畫面就是光子郎的屏幕是我們熟悉的【編程】,那《數碼寶貝》里泉光子郎的編程水平到底有多厲害呢?知乎上有一位大神借此做了解答。
題圖:Random Forest/知乎
怎樣評價《數碼寶貝》第一部中的泉光子郎的編程水平?
答主:Random Forest(2 萬+ 贊同)
受到@夜路川答主勇于用 python 進化自己室友的激勵,我順便深挖了一下《數碼寶貝》第一部第五集中光子郎在電腦上敲出的代碼,終于把原始代碼跑了出來,視頻在最后。
《數碼寶貝》第一部第五集截圖
雖然這段代碼會自己亂動并讓甲蟲獸進化,顯得狂拽酷炫吊炸天,但其實和第十集出現的代碼是一模一樣的(而動畫里表現出的效果明顯不同)。第十集里的代碼反而看得更清楚一點。
《數碼寶貝》第一部第十集截圖
根據這張圖抽出文本如下:
100 /* func sample. coast creation */
110 float s
120 while s<1 or s>=2
130 input "ratio 1 to 2";s
140 endwhile
150 s = (s-1)/10+1
160 screen 1,2,1,1
170 s=sqr(s*s-1)
180 float x0=100, x1=412, y0=0, y1=0
190 fractal(x0,x1,y0,y1,1)
200 line(100, 50, 412, 50, 255, 65535)
210 end
220 func fractal(x0;float,x1;float,y0;float,y1;float,sp;int)
230 float l, r, x2, y2
240 l=sqr((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))
250 if l<2 or sp>=9 then {
260 line(x0,y0/3+50,x1,y1/3+50,255,65535) : return()
270 }
280 r=rnd()+rnd()+rnd()-2
290 x2=(x0+x1)/2+s*(y1-y0)*r
300 y2=(y0+y1)/2+s*(x0-x1)*r
310 sp = sp + 1
320 fractal(x0,x2,y0,y2,sp)
330 fractal(x2,x1,y2,y1,sp)
340 endfunc
如果想重新原汁原味地運行這段代碼,首先要明確它的語言和版本。注意到注釋和變量定義的語法更接近 C 系語言,但還有 endwhile、func、endfunc 等關鍵字,可以確定這不是 VB 或者其他主流的 BASIC 系語言。
但是代碼行號的格式暴露了這貨肯定是個遠古產物,我本來想看看光子郎電腦上這個文件的后綴名是什么,瞅了半天發現是「名稱未設定 3」(見上圖),失去線索的我只能開始瘋狂的 google……
在資料檢索過程中主要發現兩個問題。一是和這段代碼語法相近的語言太多,比如 VFP(Visual FoxPro,知道它的人肯定都老了)、VimScript、SAP 采用的 ABAP、早期 PHP、偽代碼的某個版本[1]、乃至德儀計算器的自創腳本語言等等。經過一個個的嘗試,發現這些語言都是形似神不似,并不是真正的答案。
Google Books 里找到的一本 TI 計算器手冊
第二個問題是,如果仔細看光子郎的代碼,你一定會陷入困惑,因為這段代碼根本不像是有一個統一的語法規則。這里舉兩個栗子:
流程控制語法不統一。120-140 行的 while-endwhile 結構,或許讓你覺得和 BASIC 有一點點類似,而且順便猜測 if 語句肯定也會有個 endif 結尾。但是 250-270 行的 if 語句居然用了大括號,更喪心病狂的是在 then 后面接大括號!
變量聲明格式不統一。110 行是類 C 的聲明格式,而 220 行的函數參數卻用了類似 ECMAScript 的聲明方式,但用的不是冒號是分號。這讓我一度以為這段代碼就是導演魔改的,是一種不存在的噩夢般的語言。
然而,在我就要放棄之際,一位國外先行者的博文給了我曙光(盡管文章里有一些錯誤)[2]。這個語言最終還是被查出來了…… 事情要追溯到 1987 年,夏普發布了一款型號為 X68000 的 PC。作為那個年代的電腦,搭載了 10MHz 的摩托羅拉 68000CPU,1MB 的內存,沒有硬盤,且只在日本發售[3]。其操作系統是夏普為這一系列電腦專門設計的 Human68k,《數碼寶貝》中的那段代碼,就屬于這個操作系統專有的編程語言 X-BASIC[4]。
Sharp X68000ACE-HD
X-BASIC 手冊
日本維基上 X-BASIC 的一段例程 這個系列的最后一款電腦在 1993 年發布(配置有所增強),而《數碼寶貝》第一部是在 1999 年放映的,可見在動畫制作時期,光子郎的代碼也不算特別陳舊。 為了實際地跑一下這段代碼,又經過一番艱辛的努力,我搞到了 X68000 的模擬器,還有操作系統 Human68k(version 3.02)的磁盤映像,現在還能找到這些東西,真的要感謝極客阿宅們的默默奉獻。 在模擬器里一開機,感覺就成功了一半:
為了能使代碼順利運行,還需加載 SX-WINDOW 映像。最后終于找到 X-BASIC,一字不差地鍵入了光子郎的代碼:
執行 run 命令,按代碼要求輸入一個 1 到 2 之間的浮點數值,下面就是見證奇跡的時刻了! 運行《數碼寶貝》光子郎寫的代碼:
我不禁望向窗外的那只放屁蟲,它仍在很悠閑地曬太陽,很遺憾我的甲蟲獸并沒有進化……原因很簡單,這真的只是一段隨機生成「coast」輪廓的代碼。初始輸入是一個閾值,從視頻里看,顯然閾值越高「海岸」越險峻,閾值越低「海岸」越平滑,很有可能是摘取了當時哪個游戲里地圖生成器的一段源碼。所以,導演又糊弄事呢? 最后話說回光子郎的編程水平,這段代碼的難點主要在于用遞歸實現了分形圖形的繪制,雖然沒什么特別神秘的地方,但還是需要一定程度的編程技能和數學知識。原理上很像我之前繪制謝爾賓斯基三角形的代碼。 但是光子郎當時好像上小學四年級?
而且在動畫里,這段程序的輸出是這樣的,光子郎最后靠這個成功還原了他和美美所在的迷宮。
嘛,單從這里看,感覺能進科大少年班就是了…… 彩蛋:當年 X68000 系列的電腦還隨附一個名為 060turbo[5]的軟件,單獨裝在一個磁盤。這個軟件的唯一功能是在屏幕上隨機打印一張復雜的分形圖形(疑似 Mandelbrot 圖像?并不是很確定)。我用模擬器試了一下,效果確實驚艷,感覺光子郎在成為分形大師的路上還需努力 23333。
參考 1. ^Pseudocode Examples https://www.unf.edu/~broggio/cop3530/3530pseu.htm 2. ^Running Izzy's "Digivolving" code https://digitalworldproblems.tumblr.com/post/76036641581/while-im-looking-at-that-moviecode-post-he 3. ^X68000 https://en.wikipedia.org/wiki/X68000 4. ^X-BASIC https://ja.wikipedia.org/wiki/X-BASIC 5. ^060turbo の添付ディスク http://retropc.net/x68000/software/hardware/060turbo/disk060t/
責任編輯:xj
原文標題:《數碼寶貝》里泉光子郎的編程水平到底有多厲害?
文章出處:【微信公眾號:漢中樂博樂博機器人】歡迎添加關注!文章轉載請注明出處。
-
C語言
+關注
關注
180文章
7608瀏覽量
137125 -
編程
+關注
關注
88文章
3628瀏覽量
93812 -
程序員
+關注
關注
4文章
953瀏覽量
29820
原文標題:《數碼寶貝》里泉光子郎的編程水平到底有多厲害?
文章出處:【微信號:lebo13992672467,微信公眾號:漢中樂博樂博機器人】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論