過完春節(jié)寫代碼——編程游戲深度推薦(下)

作者:馬遙
上次說的《程序員升職記》是Tomorrow Corporation在2015年推出的作品,由于后來騰訊WeGame平臺的助推,2018年在國內又帶起一波編程小高潮。
萬萬沒想到的是,2018年8月,這家公司又推出了它的續(xù)作《70億人》(7 Billion Humans)。一樣的惡搞畫風,類似的操作和界面,但是!他們帶來了全新的玩法!
而且是將一種非常高深的“并行程序”思想,用簡單易懂的方式展示給大眾。

steam特別好評,品質保證。
廢話不多說,我來給大家看看,這是個什么樣的游戲。
1. 真正的并行程序

第一關,往下走一步,拿起方塊,然后丟下方塊。
很簡單的操作,注意這三個人是同步運動的。
非專業(yè)程序員不會在意的一點是:這三個人的代碼是一樣的。妙處就在這里,咱們接著看。
2. 同樣的代碼,但執(zhí)行效果會受環(huán)境影響

玩過一代的人都知道“Jump跳轉”語句,這里只要拿起方塊一直往右走就行,但是坑的位置不同掉下去的位置就不同,顯而易見 :)。
下面的圖也是一樣的,用“if如果”判斷,方塊在左邊就往左走,方塊在右邊就往右走。又是同樣的代碼,不同的執(zhí)行結果。

4. 多人連鎖反應——一個人的結果成為另一個人的條件
目標:將左圖變成右圖。

初始左上角的定位塊已經(jīng)預備好了,接下來的邏輯是:
如果左上角有方塊,則放下方塊;否則往下走。
只要每個人都這么做,就會連成一個斜線。
細細品味:每個人都是下一個人的定位點。
5、上帝之手——起始點特殊處理
下一關是類似的:

一排人,依次上、下、上、下走,就可以像拉鏈一樣拉開了。
思路是:如果左上角有人,就往下走;如果左下角有人,就往上走。
但是,如果這么寫所有人都不會動。因為缺少上帝之手推動第一下。
關鍵是最左邊的人,要作為一個特殊的最初推動力。
這里就必須要寫一個if特例:左邊有墻的人,先往上走一步。

解釋:if (左邊 == 墻) 則往上走一步,放下盒子
之后邏輯就順暢了。這種思路也是并行程序設計常用的一種思路:通過各種if判斷,把起點挑出來單獨處理。這個思路之后還會常常用到。
6、分布式程序,如何求最大值?
玩過《程序員升職記》或是寫過一點代碼的同學都直到,要求一系列數(shù)中的最大值,必須要依次比較每一個元素,過程中手里一直拿著最大的元素,這樣轉一圈以后,手里的元素就肯定是最大的了。
但是,并行的分布式程序有一個更加“自然”的思路:
一些人站一排,每個人如果發(fā)現(xiàn)左右兩邊有一個人比自己高,就跳坑自盡【微笑】
一直這么做直到只剩下一個人。
這樣就能求出最大值了,是不是很符合直覺呢?

第22關:皇家數(shù)字。最大的數(shù)字就是皇家數(shù)字,其他不夠大的人都跳坑吧。
如果一個人比左邊或右邊小,就往下走三步跳坑。如果有左右有空位,要往左走,保持隊伍緊湊,以便繼續(xù)比較。
我想給這關換一個名字:從容赴死。
7、多人沖突時,要多嘗試
真實編程中的并行程序有時是非常難寫的,因為當兩個邏輯爭奪同一個數(shù)據(jù)時,前后順序略有一點區(qū)別結果就截然不同。這就是傳說中多線程程序的“Data Race”問題。本游戲中也偶爾會有這種問題。
要解決這種問題,有時候靠仔細思考不如強行嘗試來的直接,因為在沖突時到底會發(fā)生什么情況要試試才知道。

第22關,每個人最終要拿到一個大于等于50的盒子,如果拿到小于50的盒子,就丟進粉碎機。
很多新手會卡在這關,或者說編程熟手反而會被卡住。因為會出現(xiàn)下面這種情況:

左邊紅框的妹子剛粉碎完盒子,要往右走,但是被右邊藍框的大叔卡住位置了,走不過去。
這時候不要寫一堆代碼讓妹子讓開,正確做法是不管他,等大叔拿完盒子走人就沒事了;或者大叔也要往左走粉碎盒子,這樣妹子往右、大叔往左,自然就交換位置了。
問題復雜的時候,有時候瞎搞一下,還挺管用的。再舉個例子:

這是一個賊復雜的“并行排序”問題,要讓所有人從小到大排列。
這個問題也是別管那么多,就讓較小的人往左走,較大的人往右走,說不定就解決了。
做出來以后再想想原理,哈哈。我初次嘗試就是這么“沖”過去的,代碼只寫了6行。
8、其它高深的問題
這個游戲越到后來,越是引入一些非常神奇的算法。更神奇的是它通過巧妙的關卡設計,讓玩家不需要真的去學計算機,只要有勇氣挑戰(zhàn)就總能打過去,享受到翻倍的樂趣。
比如,網(wǎng)絡通信:

四個人在四間密室中,每個人都要拿出并粉碎四個盒子。但是,四個粉碎機絕對不能有超過一個同時啟動,否則失敗。
四個人之間只能通過喊話交流。這就要用到神奇的網(wǎng)絡通信技術了:監(jiān)聽(listen)和發(fā)包(tell)。
還有,多線程尋路算法:

BOSS坐在中間,將地上所有的格子根據(jù)離boss的遠近編上號,比如離boss一格的位置標1,離boss兩格的位置標2。而且要考慮障礙物,比如途中障礙內部的那個格子是離BOSS很遠的,因為要繞著走進去。
這就是經(jīng)典的尋路算法(一部分)在游戲中的演繹,而且!竟然是并行的,有很多工人同時做這件事,作為專業(yè)程序員也會感覺到深深的惡意。
《70億人》玩耍建議:
這是一個神奇的游戲,很多專業(yè)程序員引以為傲的高深概念和技巧,都在這個游戲中以平易近人的方式展示了出來,不得不感慨開發(fā)團隊的腦洞之清奇。
1. 據(jù)玩家反映本作難度要高出《程序員升職記》不少,建議先玩前一作。
2. 如果說《程序員升職記》用于編程入門的話,那么本作真的就是鍛煉高級編程思維了。
這部作品中有30%的算法就算放在現(xiàn)實中,也是比較高深的專業(yè)性算法。但是經(jīng)過巧妙包裝和設計,讓它顯得不那么難。
3. 后期的較難問題,以及支線挑戰(zhàn)完全可以不急于做出來。編程技巧的成熟本來就是一個緩慢而長期的過程。
4.?本游戲有手機版且支持中文。《程序員升職記》的PC版也支持中文,但《70億人》的steam版沒有中文。
《70億人》,讓專家沉默,讓玩家過癮。
我先跳坑了,你們跟上。

另外,除了這兩部游戲以外,還有更多硬核編程游戲,有興趣的話可以交流。比如你可以去深圳龍騰科技有限公司看看:
深圳龍騰科技有限公司的技術資料:

作為一名驕傲的龍騰員工,我已經(jīng)打印好裝成了一冊。

不過這部游戲是硬件+軟件編程,后期關卡難度之大令人咂舌。更適合特殊群體玩耍,就不推薦給大家伙了,容易被勸退。
想系統(tǒng)學習游戲開發(fā)的童鞋,歡迎訪問?http://levelpp.com/?????????
游戲開發(fā)攪基QQ群:869551769? ?