纯真的设计选择罢了。属性上限常见的设心猿意马大致分为「2^n - 1」和「999」两个门户,前者方向以数据布局限制作为取值规模,后者方向以UI显示宽度作为取值规模,但并不停对,也稀有据和UI都撑持,只是程序逻辑做限制的例子。这两个从程序实现难度和机能上讲区别也不大,拍脑门随便选即可。现实作品中,9、15、31、63、99、127、255、999、9999、65535……之类的设计我都见过。
你们都拿FC超等马里奥说事,这游戏的数值系统其实很鬼畜的。
起首说命数,现实数据类型为尺度ubyte,也就是很诚恳地用一个字节(地址0x075A)来暗示0~255的数值规模。这是正常程序员最合适直觉的实现体例。
其出格之处在于,后台的现实数值是「不算当前这一命的备用命数」,而每次过关或死命后呈现黑屏显示给你看的数则是「包罗当前这一命的总命数」(80年月这两种暗示法都很风行,街机比力喜好用前一种体例表达残机数)。成果就要拿这个数值+1之后现场换算当作两位数显示。例如现实数值是0x02,显示出来的就是3。若是这里跨越0x63(99)之后就会溢出造当作显示犯错。
金币的数据布局则是令人匪夷所思的所见即所得设计。屏幕上显示的金币数目(00~99),十位数和个位数别离用0x07ED和0x07EE两个字节节制,这两个字节不仅决议了显示内容(CHR地址),并且还直接介入游戏逻辑计较(大要意思就是吃金币时先查抄个位数,<9就+1,>=9就归零且继续对十位数进行该计较)。若是你强行点窜这两个地址的值,例如改当作0x04、0x09,屏幕上就会显示你有49个金币。然后你再吃一个金币,就会酿成50。若是你把个位数锁当作超出规模的值,例如0x0A,则个位数会按照游戏CHR码表显示对应的字母、符号之类的内容,而且每次吃金币十位数城市响应进位。
每100金币奖命的逻辑跟这个显示无关,而是零丁还有一个字节节制,地址0x075E。每当吃到金币的时辰,这个地址的值也会跟着+1,随后立即查抄它是否==0x64(十进制100),若是知足前提就执行奖命同时清零。这个地址和上面说的显示用的两个地址是分隔自力运作的,注重,游戏程序并不是一切今后台这个埋没数值为准、显示时换算当作十进制;而是两者自力运作,别离累加。
近似地,该作中的残剩时候数字也并没有像正常做法那样利用尺度byte/ubyte记实,而是花了三个字节别离暗示百位、十位、个位,地址0x07F8、0x07F9、0x07FA,而且直接介入计较。若是你把前两个数值锁当作0x00、0x00就会造当作开局刹时秒杀。
分数同理,采用了0x07DD到0x07E2的六个字节别离来暗示六位数字(别的0x07D7到0x07DC则是高分记实),而且直接介入计较。稍有分歧的是这六位数字并不是从十万位到个位,而是从百万位到十位,此中百万位为0时埋没不画。至于个位数,呵呵,它底子就不是分数系统的一部门。个位那个0是直接画上去的图罢了。
一个1985年的游戏,为了暗示一个百万级的数字,可以顺手华侈6个字节(固然8位CPU这样处置或许反而更便利),所以问题底子不在省内存上。机械内存容量是心猿意马死的,不消白不消。至于后来呈现有存档的游戏,可操纵空间也到了KB级别,也无所谓255仍是999了。
至于为什么「良多游戏」选择利用「999」类而不是「2^n - 1」类数字作为数值上限设计,这就没法回覆了,具体到每个游戏上设计师都可能有本身的设法。在我看来这两个没有孰优孰劣,选哪个都可以有良多原因也可以没有原因。
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!