《超級瑪利歐兄弟》的重度玩家們,可能已經發現了,這並不是原本32關裡面的。不過,如果你以為這是《超級瑪利歐創作家》的傑作,那你就猜錯了~這是AI利用GAN弄出來的!利用GAN產生紅白機遊戲畫面,並不是新鮮事,不過,這一次是可以無限延長的那種~
花樣還不少:
只需用4個顏色通道表示對象
在遊戲中,關卡數據以壓縮格式存儲,通常,每個對像用兩個字節來描述位置和類型。
一個字節指定16x16網格中的xy坐標;第二個字節指定對象的類型。比如在第一關的場景中,僅用了12個字節來描述:
07 81 | 47 24 | 57 00 | 63 01 | 77 01 | C9 71
作者為了將關卡編碼為16x16的圖像,分別設置了4個獨立顏色通道:
例如,第一關的截圖,就可以表示成這樣:
這樣的編碼方式,既能夠涵蓋足夠多的對象,又不至於太過複雜。
並且,根據關卡中對象的排列方式進行分組,有利於模型進行學習並重現。比如,實心磚用於布置樓梯、磚塊則通常水平放置。
此外,將所有對象組織成一個合理的方案,減少產生網路失誤對輸出結果的負面影響。
比如用硬幣代替磚塊,影響非常小;而如果用管道或庫巴來代替,就會出現問題。
開發者還找出了遊戲的一些特點:
管道可以連接地面或一排浮動塊;
方塊通常用來構建各種尺寸的樓梯;
磚塊和問題塊,大多排在第3位和第7位;
其他角色一般會分成兩三組。
接下來,作者使用TensorFlow作為後端,利用Keras來構建模型,並進行訓練。
產生器透過輸入的一組特徵向量,來產生新的樣本圖像;鑑別器則區分是訓練集中的真實圖像,還是產生器偽造的。
隨著遍歷訓練集的次數增加,產生效果也逐漸改善:
最終輸出的結果,是這樣的:
嗯,效果真的很不錯~
想永不通關?用cGAN
現在,只需把一張張「截圖」連接起來,你就會得到:
半個庫巴、半個管道,以及半個瑪利歐……
怎麼才能無縫拼接,得到連貫的關卡呢?
這就需要利用「有條件的GAN」,把前一個場景作為後一個場景的邊界條件。
就像這樣:
可以看出,場景的左側部分,是以第一行圖像作為邊界條件產生的。
具體來說,首先要在之前的基礎上,向產生器輸入一組16×4的圖像,作為上一個場景的邊界部分。
網路架構是這樣的:
產生器在輸入條件的限制下,產生16x16的圖像,然後,把它們與16×4的輸入圖像進行拼接,再用拼接後的圖像來訓練鑑別器。
利用16×4圖像的不斷疊代,最終就能拼接成連續的場景,例如,經過40次疊代的結果:
「不想通關綜合症」有救了!
開發者表示,雖然效果不是特別完美,但是已經具備了趣味性和可玩性~
是不是和那個「能玩一輩子的遊戲」—— 《超級瑪利歐創作家》有點像?它同樣主打關卡製造,不過是玩家來手動設計。
在發布關卡之前,作者必須通關一次,於是有些人就加入隱蔽的「作者通道」,偷個懶直達終點。不少高手都曾被這遊戲難倒,當然如果玩家發現隱蔽通道,就能「偷雞」通關~這樣「有趣又有毒」的關卡,不知道AI能否構建出來呢?