Java,編程與Mod
我需要學(xué)會Java/編程才能寫mod嗎?
我要學(xué)到什么程度才能寫mod?
因人而異,沒有統(tǒng)一的答案。
又有人在我的群問到了這類問題,我便寫文以免重復(fù)說同樣的話。
每個人心中都有自己的mod設(shè)計,不同的mod設(shè)計實現(xiàn)難度不同。此外,每個人的知識水平也不同,有的人會英語,有的人不會。諸如此類的問題決定了學(xué)習(xí)mod必得因材施教,指望靠一份Harbinger網(wǎng)絡(luò)教程或者一本《我的世界模組開發(fā)指南》滿足所有人的學(xué)習(xí)需求根本不切實際。不論老師的門檻放的多低,總有人夠不到;“你所浪費的今天,是別人無法奢求的明天”。
那么,如何知道你到了何種層次,需要學(xué)什么呢?我們先從一個比較通俗的比方看起。
有這樣一串?dāng)?shù):
1,1,2,3,5,8,13,21,……
請問這一串?dāng)?shù)中的第255項是多少?
在做mod的時候經(jīng)常會遇到問題而卡住,而解決問題的過程……我們就用解決上述問題的過程來舉例子吧。
如果你的數(shù)學(xué)在小學(xué)奧數(shù)、或者正常初/高中理科數(shù)學(xué)的水平,你應(yīng)該能看出這串?dāng)?shù)的規(guī)律:從第三項開始,每一項都是前兩項的和。即:A+B=C, B+C=D, C+D=E,以此類推。
此外,如果你見多識廣,你應(yīng)該記得這叫斐波那契數(shù)列(Fibonacci sequence)。這個詞我在小學(xué)就聽說過了,那時候我們戲稱它為“肥不拉幾數(shù)列”。當(dāng)然,我的讀者里也有人不知道。

諸位就算記不住這數(shù)列名字,或者沒看出這規(guī)律,也沒什么好羞愧的。人總有不知道的東西,不同地區(qū)教育資源質(zhì)量不同,更何況一個小學(xué)生不知道大學(xué)知識,那只是因為他還沒到那個階段而已,未來不一定誰懂得多呢。你知道我的生日是哪天嗎?我知道,但這也沒啥好自豪的,對吧。
諸位就算知道這規(guī)律……也沒什么好自豪的。
很多人都知道這數(shù)列可以靠循環(huán)做加法計算,卻不知道這數(shù)列有一個通項公式,可以直接算出第N項,而無需計算中間步驟。
對,就是那個里面有黃金分割率的公式,忘了的話用不動點法解個方程組就能求出來具體的系數(shù)。你知道我在說什么嗎?知不知道都無所謂,因為就算不知道這個,也能用編程的手段計算足夠多的數(shù)列項目了。
我不是來講數(shù)學(xué)的,更何況我數(shù)學(xué)爛的一批,沒有資格跟別人講。對,我數(shù)學(xué)很爛,如果有我其他學(xué)科的平均水平我差不多就進(jìn)清北了。

好了,回到這個數(shù)列問題。如何求解它的第255項呢?
既然已經(jīng)看出來了規(guī)律,只要足夠有耐心,我們直接手動計算就行了。加到天荒地老,總能加出來,反正只是簡單的整數(shù)加法。筆算嫌累的話,我們還有計算器。
然而,這并不是最好的方法。如果你會計算機編程,你應(yīng)該能輕易地寫一個程序計算出來。不管是第255項,還是第2555項,使用的程序都是一樣的,計算時間也不會差太多,都在一秒之內(nèi)。如果你做不到,那么,你需要去學(xué)編程。
編程不一定是Java。
舉例來說,我在小學(xué)六年級的時候?qū)W習(xí)了Logo語言,初中學(xué)習(xí)了一點VB,上大一的時候?qū)W習(xí)了C、C++,大三時學(xué)了一點基于Unity的C#,工作后花了兩天速成學(xué)習(xí)Lua,接觸做mod后稍微學(xué)了一點Java。
這些都是編程語言。他們使用的思想有一大塊是共同的,還有一大塊(面向?qū)ο螅┦且话胝Z言共同、另一半語言所沒有的。它們的語法不太一樣,以及有一些小特性有區(qū)別,但最基礎(chǔ)的思想是共同的。用這些語言去解決上述的斐波那契數(shù)列問題,寫出來的代碼長得不同但都是一個意思。
現(xiàn)在,請你用Python/Java寫程序解決該問題。
如果你發(fā)現(xiàn)你恰好不會這兩種語言,但可以用其他語言做到,你就意識到Java和編程的區(qū)別了。Java只是編程形式之一。
另外,學(xué)會Java語法和學(xué)會Java編程也是兩碼事。學(xué)會了java的for循環(huán)、while循環(huán)、if語句后,不見得每個人都能求解上述問題。
上述問題算是編程里入門級的題了,可能有的人不理解為啥做不出來,那我再舉一個復(fù)雜點的例子吧。
1 1 3 2 5 3 7 4 9 5...
這個數(shù)列的規(guī)律是:1、3、5、7、9…… 和 1、2、3、4、5……交叉在一起,請編程輸出它的前100項。
這個就需要結(jié)合if和循環(huán)語句來寫。雖然不用if也不是不行,但使用if算是比較自然的想法。即使都用if,不同人寫出來的也會有所不同。有的人會分別計算50項,都算好后輪流輸出;有的人會一邊輸出一邊判斷下一個到底是奇數(shù)還是偶數(shù),從而輸出對應(yīng)的結(jié)果。
好,如果你能看懂上述內(nèi)容,你應(yīng)該對編程有了初步認(rèn)識了。我們繼續(xù)討論Mod的話題。
Mod制作難度的深湖分級法:
【普通級·能抄】能聽懂話,能抄下來代碼就行。深湖示范求解第100項斐波那契數(shù)列的代碼,你抄下來之后知道改哪能變成求解第255項,但是要求解一個別的數(shù)列就不會了。有時候也叫“入門級”。
【專家級·能寫】自己會寫代碼解決斐波那契數(shù)列這樣的問題,以及更多更復(fù)雜的問題,看到一個數(shù)列知道如何轉(zhuǎn)化成計算代碼。可以借助百度等工具和翻閱其他人的代碼,這也算達(dá)到了專家級。
【大師級·能調(diào)】能發(fā)現(xiàn)并解決底層代碼帶來的問題。舉例來說,你發(fā)現(xiàn)Java的整數(shù)太短(32位整數(shù)只能存到2的31次方左右),在計算第21億億億億億億億億億億項的時候,本來好使的程序就不好使了。你研究了一陣后,設(shè)計了一個方法,解決這個問題,這就是大師級。
需要注意的是,很多東西在實際制作之前并不能看出是否為專家級。
比如,在1.12.2里,“把一個音頻的音調(diào)抬高到4倍播放”、“讓兩把鐵鋤合成為一把鐵鎬”,看起來非常簡單,似乎是普通級,但我實際做了才發(fā)現(xiàn)是大師級。
前者是因為MC的底層音效系統(tǒng)會把音調(diào)系數(shù)截取到[0.5, 2.0]之間,“4”的輸入系數(shù)無效,會被強制變?yōu)?。后者是因為MC自帶一個抽象配方,兩把鐵鋤徒手合成會變成一把新的鐵鋤,你試圖加入的配方會被這個抽象配方覆蓋掉。
這種事情在實際制作之前,如果你沒有聽前輩說過,幾乎不可能發(fā)現(xiàn)原本的方法突然不好使了,往往需要慢慢研究為什么以及怎么辦。這就像原本你在使用牛頓力學(xué)計算問題,突然發(fā)現(xiàn)公式在某些情況下失效了,然后自己研究出了相對論和量子力學(xué)。嗯,這就是大師級。
Harbinger和土球球的書都是專家級教程。它們默認(rèn)讀者有基本的編程知識,知道根據(jù)例子如何發(fā)揮。我看這倆教程的時候覺得沒什么問題,但有些人評論說,看得就像天書一樣。
我的《邊睡覺邊開發(fā)Mod》系列視頻則是普通級,在做的時候都是按照普通級難度設(shè)計,只能做一些很簡單的效果,但是門檻極低。如果說有什么門檻,基本上都是在部署開發(fā)環(huán)境上。
當(dāng)某人提出了一個設(shè)計卻不知如何制作的時候,深湖往往會給出一個評論“這是普通級”“這是專家級”,并且會對不會編程而試圖作專家級需求的人進(jìn)行勸退。
畢竟,學(xué)編程沒那么容易?;仡櫼幌履惝?dāng)年學(xué)習(xí)微積分或者三角函數(shù)的過程——或者隨便什么數(shù)學(xué)課的過程,這玩意很抽象,掌握它并不是人類生物本能,是后天努力學(xué)習(xí)和理解的成果。
并且,這過程往往挺費勁的,如果只是為了心血來潮或者業(yè)余愛好,為啥不找點樂子,而是花費一個月給自己補習(xí)?如果你真的想學(xué),那當(dāng)然也好。加油吧,別半途而廢。

去哪學(xué)?
如果你以前學(xué)會了其他面向?qū)ο笮途幊陶Z言,直接去菜鳥教程學(xué)習(xí)Java語法就得。
如果你不會編程……我的天,你需要依次學(xué)習(xí)編程、Java和Mod。去B站搜“Java教程”,然后隨便找個播放量高的看看吧。祝你好運。

學(xué)多少?
知道if、循環(huán)語句怎么寫,知道什么叫函數(shù)(方法),知道什么叫字符串、數(shù)組,知道父類子類、多態(tài)是個什么以及怎么寫。這就是最低限度了。遇到什么不會可以再抱佛腳,直到你覺得差不多了為止。

思考題:
請寫出以下數(shù)列的第100項:
1,4,2,7,1,5,3,9,235,1024,... ...
Java,編程與Mod的評論 (共 條)
