百科问答小站 logo
百科问答小站 font logo



怎样评价《数码宝贝》第一部中的泉光子郎的编程水平? 第1页

  

user avatar   zamhown 网友的相关建议: 
      

受到 @夜路川 答主勇于用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]、乃至德仪计算器的自创脚本语言等等。经过一个个的尝试,发现这些语言都是形似神不似,并不是真正的答案。


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

  • 流程控制语法不统一。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]


这个系列的最后一款电脑在1993年发布(配置有所增强),而《数码宝贝》第一部是在1999年放映的,可见在动画制作时期,光子郎的代码也不算特别陈旧。


为了实际地跑一下这段代码,又经过一番艰辛的努力,我搞到了X68000的模拟器,还有操作系统Human68k(version 3.02)的磁盘映像,现在还能找到这些东西,真的要感谢极客阿宅们的默默奉献。


在模拟器里一开机,感觉就成功了一半:


为了能使代码顺利运行,还需加载SX-WINDOW映像。最后终于找到X-BASIC,一字不差地键入了光子郎的代码:


执行run命令,按代码要求输入一个1到2之间的浮点数值,下面就是见证奇迹的时刻了!

运行《数码宝贝》光子郎写的代码 https://www.zhihu.com/video/1162012539662876672


我不禁望向窗外的那只放屁虫,它仍在很悠闲地晒太阳,很遗憾我的甲虫兽并没有进化……原因很简单,这真的只是一段随机生成「coast」轮廓的代码。初始输入是一个阈值,从视频里看,显然阈值越高「海岸」越险峻,阈值越低「海岸」越平滑,很有可能是摘取了当时哪个游戏里地图生成器的一段源码。所以,导演又糊弄事呢?


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

X-BASIC文档(日文):
ww3.enjoy.ne.jp/~zoomar

X68000 Emulator in Java:
stdkmd.net/xeij/

Human68k磁盘映像(日文):
retropc.net/x68000/soft

X68000相关资料(日文):
retropc.net/x68000/book

Programming Languages Database:
epocalc.net/php/liste_l


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


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


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


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



彩蛋:当年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/

user avatar   ye-lu-chuan 网友的相关建议: 
      

2020年,光子郎用Python打开了数码宝贝世界的大门,也象征着我们的青春结束了。







不说别的,就看他写了什么。

坐标是数码宝贝第一部的第五集

这是和 黑安杜鲁兽 战斗时

光子郎用来进化甲虫兽的代码

发现这大概像一段VB代码。不敢确定。

根据诸位大佬的研究,光子郎的代码是X-Basic


破千了!! 十分感谢各位大佬的抬爱。在各位大佬的指正下,把这个看不清楚写错的文本修正一下。

转文本如下:

       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     

对这段代码的个人理解如下:

定义一个浮点数 s

当 s<1 或 s>=2

s = input("ratio 1 to 2")

s = (s-1)/10+1

screen 估计是一个类?不知道有什么用

大佬指出 这是一个屏幕控制命令

sqr 估计是开方函数 s = s^2-1

定义四个浮点数

调用fractal函数 他给这个自定函数叫 分形

调用又一个自定函数 line 接受6个参数最后程序建了模所以估计是一个画线函数

这里声明前面的fractal函数 这还是一个递归函数

前面不知道变量s是啥所以这个代码从这里开始可读

经过大佬指出,s变量是x2,y2值的一个参数

四个浮点数

这是求两点距离的公式 l 是两点距离

如果这个距离小于2 或者 sp>=9

画条线后返回?

rnd 应该是随机数函数

递归调用


在这里根据编程语言的通性,笔者用python大概重构了一下这份代码。希望能够进化我的舍友。

基于前辈和大佬,对这份代码进一步修改:

       import matplotlib.pyplot as plt import numpy as np import math import random x_r = [] y_r = [] def fractal(x0,x1,y0,y1,sp):     l = math.sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))     if l<2 or sp>=9 :         x_r.append(x0)         x_r.append(x1)         y_r.append(y0)         y_r.append(y1)         return     r = random.random()+random.random()+random.random()-2     x2=(x0+x1)/2+float(s)*(y1-y0)*r     y2=(y0+y1)/2+float(s)*(x0-x1)*r     sp = sp+1      fractal(x0,x2,y0,y2,sp)     fractal(x2,x1,y2,y1,sp)  s = 0 while True:     if float(s) < 1 or float(s) >=2:         s = input("ratio 1 to 2
")     else:         break fractal(100,412,0,0,1) plt.plot(x_r,y_r) plt.show()     

运行结果如下:


光子郎的结果:



甲虫兽表示身体发烫。充满力量。


愿伟大的祖国繁荣富强,国庆节快乐。


user avatar   yycollege 网友的相关建议: 
      

(是因为我强调“玩Python”,所以把宠物小精灵也推给我了么 ^_^ )

前面 夜路川 的考据十分专业,赞一个先。其中回帖里很多网友提到这是老Basic或GwBasic,不过各位只知其一不知其二。这个屏幕截图确实是Basic的大量变种之一,但却是一个非常非常小众的分支,恐怕国内真没有几个人用过 —— 它是 1987 年 日本夏普为其 Sharp 68000 机器设计的 X-Basic 语言(别问我怎么知道的)。

其实从截屏中也可以看出它和其他basic变种之间的显著区别,比如:

  1. 使用 /* ... */ 这种C风格的块注释,而不是 basic 标准的REM或引号;
  2. 使用 func ... endfunc 定义函数而不是 basic 标准的 DEF ;
  3. 直接用 float s 定义浮点数变量,而不是使用 basic 标准的 DIM As;
  4. if then 后面居然用花括号包装语句,而且还出现了 return() !
  5. 一方面使用古老的行号,另一方面却有大量的缩进结构。要知道当时即使权威的Basic教材里,语句一般也都是全部顶格书写的。

所以可以推断,这个语言的设计师当时受了很多C语言的影响。回想当年有很多改进Basic语言的努力,比如加入面向对象特征等等,所以这个语法确实是那个年代的风格。

最后跟这个帖炸出来的老程序员们握个手!看到 screen 1,2,1,1 这一句时,感觉眼泪都要出来了,真的是30年前的回忆啊!当时使用的显示器是显像管那种,有CGA、EGA等不同型号,支持的颜色和分辨率都不同。screen这个命令就是用来指示显示器切换到哪一种模式。不过 X-BASIC 里面的screen参数含义与国内熟悉的 GW-BASIC 不太一样(可能当时日本的显示器指标普遍更高):其中第一个参数 1 代表的是让显示器切换到512*512分辨率(我记得GWBasic里是320*320)、第二个参数2代表的是让显示器进入16色状态(可以显示16种颜色、不是16位颜色!),第三个参数1代表高分辨率模式,第四个好像是代表内存缓存开关(记不清了)。

这几天好像特别喜欢怀旧,昨天刚考证了 1991年爱国者导弹那次事故 ,今天直接飞回1987年了。我大概真的是老了吧 ……

(还好头发还在,请各位CS同学安心学习、勇敢从业)




  

相关话题

  如何解决windows上用fwrite()向文件写入内容时末尾的 问题? 
  C语言能用指针修改其他程序的地址的值吗? 
  不同编程语言的程序员之间有鄙视链么? 
  维护一个大型开源项目是怎样的体验? 
  Java 集合类库的顶层里的 Collection,List,Set 是抽象类的话是否更“正确”一些? 
  精通 Java 是一种怎样的体验? 
  为什么编程更关注内存而很少关注CPU? 
  如何分辨验证码的“O”和“0”?程序员能否避免在验证码中出现这2个不容易分辨的字符。 
  作为计算机专业学生,最应该学习的课程前五位是什么? 
  如何用一句话说明什么是面向对象思想? 

前一个讨论
玉林狗肉节街头被贴满「抵制」字报,该不该取消狗肉节?
下一个讨论
如何看待教育部将出新规:教授三年不给本科生上课将被清出教师系列?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利