Thinkraft,Obsessive-Compulsive-Personality-Disorde
純真的設計選擇罷了。屬性上限常見的設心猿意馬大致分為「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 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!