古董级代码重现:深入分析《数码宝贝》第一部泉光子郎的编程水平

古董级代码重现:深入分析《数码宝贝》第一部泉光子郎的编程水平

首页模拟经营古董大师模拟器小游戏更新时间:2024-06-19

众所周知,泉光子郎在《数码宝贝》第一部的8人主角团中是唯一的技术流,笔记本电脑随身携带(90年代末,笔记本还是挺少见的),除了分析战斗数据以外,在动画中还展现过编程技巧。比如在第五集和第十集就有一段很清晰的代码:

《数码宝贝》第一部第十集截图

小时候看到它真没什么印象,但现在忍不住会思考:这段代码是什么语言,又有什么作用呢?为了探究光子郎的编程水平,我深挖了一下这段代码,最后终于把它跑了出来,视频在最后。

首先根据这张图抽出文本如下:

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计算器手册

第二个问题是,如果仔细看光子郎的代码,你一定会陷入困惑,因为这段代码根本不像是有一个统一的语法规则。这里举两个栗子:

然而,在我就要放弃之际,一位国外先行者的博文给了我曙光(尽管文章里有一些错误)[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」轮廓的代码。初始输入是一个阈值,从视频里看,显然阈值越高「海岸」越险峻,阈值越低「海岸」越平滑,很有可能是摘取了当时哪个游戏里地图生成器的一段源码。所以,导演又糊弄事呢?

为了跑这段代码,我查到了一些资料和工具,在此罗列一下,有兴趣可以看看。

X-BASIC文档(日文):

http://ww3.enjoy.ne.jp/~zoomark/ip/xb/xb_frm.html X68000

Emulator in Java:

https://stdkmd.net/xeij/

Human68k磁盘映像(日文):

http://retropc.net/x68000/software/sharp/human302/

X68000相关资料(日文):

http://retropc.net/x68000/book/x68book.htm

Programming Languages Database:

http://www.epocalc.net/php/liste_langue.php

最后话说回光子郎的编程水平,这段代码的难点主要在于用递归实现了分形图形的绘制,虽然没什么特别神秘的地方,但还是需要一定程度的编程技能和数学知识。原理上很像我之前绘制谢尔宾斯基三角形的代码[5]。

谢尔宾斯基三角形分型过程

但是光子郎当时好像上小学四年级?

而且在动画里,这段程序的输出是这样的,光子郎最后靠这个成功还原了他和美美所在的迷宫。

嘛,单从这里看,感觉能进科大少年班就是了……


彩蛋:当年X68000系列的电脑还随附一个名为060turbo[6]的软件,单独装在一个磁盘。这个软件的唯一功能是在屏幕上随机打印一张复杂的分形图形(疑似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. 小练手:用Canvas绘制谢尔宾斯基三角形 (https://zhuanlan.zhihu.com/p/26606208)
  6. 060turbo の添付ディスク (http://retropc.net/x68000/software/hardware/060turbo/disk060t/)
查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved